私はFortranでMPIをやや新しくしています。私は各プロセッサがNsシミュレーションを行うMPIコードを持っています。だから私はそれぞれのシミュレーションと各procにPHIという2次元配列とPHIの各値を2乗する2番目の配列PHI^2を作成するので、(mysize x Ns x 2)の結果が得られるはずです。配列をMPI Fortranの配列に減らす
次に、Nsの中のすべてのシミュレーションの後、私は基本的に同様SUM PHI^2(PHI)/ NsとおよびPHI^2_AVG_RANK、あるPROC PHI_AVG_RANKアレイ毎に生成します。
私は両方とも、その後、mysize上で再び平均を行うには、削減和を通じて母親プロセッサに各プロセッサから来ている結果の行列PHI_AVG_RANK(mysize行列の合計)のすべてを送信したいですPHI_AVG_RANKとPHI ** 2_AVG_RANKについては、これを行う理由は、すべて(mysize x Ns)実現、つまりsqrt(SUM(PHI^2_AVG_RANK)/ mysize - (SUM(PHI_AVG_RANK)/ mysize)^ 2のRMS行列を計算したいからです。 )を入力し、txtに保存します。
これを行うには、どのデータ型を使用できますか?連続、ベクトル、またはサブアレイ?ここでやるべき最善の呼びかけを減らすのですか?
これはこれまでの私の計画です(すべてのNsシミュレーションを行った後、各プロセッサのphi_moyen_1_2と呼ばれる100x100行列を思い出して、それをすべてmean_2_025という新しい行列100x100に集計したい)それ:
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
call MPI_TYPE_CONTIGUOUS(100,MPI_REAL,row,ierr)
call MPI_TYPE_CONTIGUOUS(100,row,matrix,ierr)
if (myrank==0) then
call MPI_REDUCE(phi_moyen1_2,mean_2_025,1,matrix,MPI_SUM,0,MPI_COMM_WORLD,ierr)
open(unit=1234, file='../results/PHI1/TESTE/teste.txt')
do i=0,Nx-1
write(ligne, *) mean_2_025(i,:)
write(1234,'(a)') trim(ligne)
end do
close(unit=1234)
endif
EDIT:@デビッドヘンティの提案を実装した後、我々は連続したデータ型を使用する必要はありません私たちは、実際には各Fortranのアクセス以来、ストレート任意の中間データ型withuotそれを行うと句をコミットすることができます。その後、私はフォローしました:
if (myrank==0) then
call MPI_REDUCE(phi_moyen1_2,mean_2_025,100*100,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD,ierr)
mean_2_025=mean_2_025/(mysize)
write(*,*) mean_2_025(1,1)
しかし、プログラムは(無限ループを通過したように)終了せず、出力ファイルに何も印刷しません(のnprocsのため、マトリックスmean_2_025の最初のエントリの番号が上記のを書く)。私はプログラムの終わりにいくつかのcpu_timeを実行しました。それはnprocs CPU時間を示しています。
編集:解説:@Vladimir Fが指摘したように、総コールREDUCEはすべてのプロセッサによって(呼び出し内にルートプロセッサがあるにもかかわらず)行われます。したがって、if節の中にあって無限ループを引き起こすことはできません(他のプロセッサはREDUCEにアクセスできませんでした)。
ありがとうございました。
多くのことを明確にする必要があります。あなたのコードを表示してください。言葉で説明し、あなたが意味することを解釈しようとするよりはるかに良いです。 See [ask]。 –
@VladimirFコードは非常に長いですが、私は関連する部分、つまり、削減部分の質問を更新しました – arturtheking