1年以上前に古いクラスタで使用していた作業コードがあります。今年は、このコードをもう一度使いたいですが、クラスターが異なり、結果が無意味になりました。私はこのクラスターの詳細を知っていますが、古いクラスターのクラスターを見つけるのは非常に難しいです。私はMPI_BCAST
コールに問題を絞り込むことができましたfortranのMPI_BCASTが新しいクラスタで動作しない
:
if (rang.eq.0) print*, "psi for rang0 = ", psi
CALL MPI_BCAST (psi, NSITES, MPI_DOUBLE_COMPLEX,0,MPI_COMM_WORLD,code)
if (rang.eq.1) print*, "psi for rang1 = ", psi
が、これはうまくいきました、前に、とpsi
は正しくすべてのランクに分散されました。
は今、ランク1
に、この新しいクラスタ上で、私は、それがランク0
(非ゼロ値)からの値で更新されず、psi
の初期値(ゼロの複雑な配列)を取得します。
Module list
は私に与え
1)インテル/ 13.0.1 2)OpenMPIの/この新しいクラスタで使用されているコンパイラのための1.8.1
。
古いクラスタにアクセスできないため、どのコンパイラがロードされたかを確認できません。私は私の古い電子メールのいずれかで、このスニペットを見つけたよう
which mpif90 /opt/mpi/bullxmpi/1.1.16.5/bin/mpif90
、
:それにもかかわらず、それはこのだったかもしれません。
だから、何年にもわたってMPI_BCASTの使用が変更されていますか? 私もMPI_BARRIER
を追加したテストをしましたが、確かに無駄です。
(この新しいクラスタで)エラーを再現する最小限の例を編集します。
PROGRAM minimal
use mpi
IMPLICIT NONE
INTEGER :: NSITES, rang, i, code
DOUBLE COMPLEX , DIMENSION (:), allocatable :: psi
DOUBLE PRECISION ralpha, PI, val
INTEGER :: NB_PROCS
CALL MPI_INIT(code)
call MPI_COMM_SIZE (MPI_COMM_WORLD,nb_procs,code)
call MPI_COMM_RANK (MPI_COMM_WORLD,rang,code)
PI = 4.d0*atan(1.d0)
NSITES = 10
allocate (psi (NSITES))
DO i = 1, NSITES
psi(i) = (0.0d0, 0.0d0)
END DO
val = 1.0/dsqrt(1.0d0 * NSITES)
DO i = 1, NSITES
IF (rang.eq.0) THEN
CALL RANDOM_NUMBER (ralpha)
psi (i) = exp (2.0d0 * PI * (0.0d0, 1.0d0) * ralpha) &
* val
ENDIF
ENDDO
CALL MPI_BCAST (psi, NSITES, MPI_DOUBLE_COMPLEX,0,MPI_COMM_WORLD,code)
if (rang.eq.1) print*, "psi for rang1 = ", psi
CALL MPI_FINALIZE(code)
END program minimal
ローカルのMacBookでこのコードをチェックしましたが、正常に動作しています。
あなたはその呼び出しに絞っていると言いますが、私たちのために[mcve]を作れますか?それがなければ、宣言などについて非常に多くの仮定をしなければならない。 – francescalus
最後の質問にすばやく答えるために、MPI_BCASTは変更されていません。 Francescalusが言っているようにさらに言えば、問題を示す完全なプログラムを見せてください。 –
あなたのコードは常にバグだった可能性がありますが、今はそれが唯一の違いを引き起こします。珍しいことはありませんが、コードを見なければなりません。 –