2016-03-24 12 views
0

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でこのコードをチェックしましたが、正常に動作しています。

+4

あなたはその呼び出しに絞っていると言いますが、私たちのために[mcve]を作れますか?それがなければ、宣言などについて非常に多くの仮定をしなければならない。 – francescalus

+0

最後の質問にすばやく答えるために、MPI_BCASTは変更されていません。 Francescalusが言っているようにさらに言えば、問題を示す完全なプログラムを見せてください。 –

+1

あなたのコードは常にバグだった可能性がありますが、今はそれが唯一の違いを引き起こします。珍しいことはありませんが、コードを見なければなりません。 –

答えて

0

原因は、デフォルトでロードされるモジュール(openmpi/1.8.1)でした。

まず、私は他のいくつかを試しましたが、モジュールが再びロードされた場所の投稿スクリプトを変更するのを忘れました。だから、コンパイル時にのみモジュールを変更しましたが、実行時には変更しませんでした。

ボトムライン、破損したモジュールがデフォルトで読み込まれています。私は自分で問題を解決するために他のモジュールに正しく切り替えられません。

これはopenmpi/1.8.4で動作します。

関連する問題