0

私は MPI と Fortran 77 初心者です。FKRPRO.fOpenMPIを使用して並列化したいFortran 77 コードがあります。コードには、実行時に別のファイルから供給される多くのパラメーターが必要です。コンパイルと実行はこのようなものです

gfortran -o FKRPRO FKRPRO.f
./FKRPRO < Modelfile.txt

コード(私のコードではない)の同等の行は

      PARAMETER(LIN=5)
      INTEGER ERROR
      LOGICAL PRNTA
      PRNTA=.FALSE.
      READ(LIN,'(L3)') PRNTA
      READ(LIN,21) M1,M2
   21 FORMAT(11I5)

等々。誰かREAD(LIN,'(L3)') PRNTA意味を教えてください。入力ファイル Modelfile.txt の入力は次のようなものです

.F.                                                                             
    0   64  
and so on..   

必要な MPI ステートメントをコードに入れました。

      INCLUDE 'MPIF.H'
...
      CALL MPI_INIT(ERROR)
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,ERROR)
      CALL MPI_COMM_RANK(MPI_COMM_WORLD,PRANK,ERROR)
...
      CALL MPI_TYPE_FREE(NEWMATRIX,ERROR)
      CALL MPI_FINALIZE(ERROR)

すべてのプロセスが入力ファイルを読み取ることができません。このようなコードをコンパイルして実行しました

mpif77 -o bc3 FKRPROG5.f
mpirun -np 4 bc3 < Modelfile.txt 

これは機能していません。次のエラーが表示されます。最初のプロセスまたはランク 0 のみがファイルを読み取ることができます。

At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
mpirun has exited due to process rank 3 with PID 866 on
node Avinash-rMBP.local exiting improperly. There are two reasons this could occur:

1. this process did not call "init" before exiting, but others in
the job did. This can cause a job to hang indefinitely while it waits
for all processes to call "init". By rule, if one process calls "init",
then ALL processes must call "init" prior to termination.

2. this process called "init", but exited without calling "finalize".
By rule, all processes that call "init" MUST call "finalize" prior to
exiting or it will be considered an "abnormal termination"

This may have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).

50行目READ(LIN,'(L3)') PRNTA.誰かが私が間違っているところを親切に指摘してください:(では、この入力ファイル< Modelfile.txt からすべてのプロセスを読み取るにはどうすればよいですか??ありがとう。

4

1 に答える 1

5

ステートメント

READ(LIN,'(L3)') PRNTA

プログラムは、 id のチャネルに接続されたユニットから、LIN論理値を表す 3 文字のシーケンスを読み取り、読み取った値を変数 に割り当てますPRNTA。あなたが私たちに示したフラグメントから、プログラムは読み取り.F.、に設定PRNTA.false.ます。

LIN定数値 5 に設定されます。これは通常、 を意味しstdinます。この to の使用5デジュール標準でstdinはなく、事実上の標準です。

パラメータ ファイルを MPI プログラムに読み込む簡単な方法は、1 つのプロセスだけがファイルを読み込み、値を必要とする他のプロセスに値を送信することです。

すべてのプロセスが同じ入力ファイルを読み取ろうとするプログラムを作成したようですが、実行時に、渡すために使用したリダイレクトはModelfile.txt1 つのプロセス (おそらくランク 0 のプロセス) に対してのみ機能します。他のプロセスは入力ファイルをまったく取得せず、不平を言い、プログラムをクラッシュさせます。表示されるエラー メッセージは、読み取りを試みたときに入力ファイルがまったく見つからない Fortran プログラムの典型です。

次のようにコードを記述する方がはるかに優れています。

call mpi_init ...
...
if (myrank==0) then
    open(...) inputfile
    read(...) parameters
    close(...)
end if
...
call mpi_bcast(parameters from 0 to all)
...

一般に、MPI プロセスの実行時環境が順次プログラムの実行時環境と同一のコピーであるとは考えないでください。ランタイムが、プログラムの実行時に作成された最初のプロセスにのみ入力を送信するという証拠を見ていると思います。は標準化されていないためmpirun(標準化されていますmpiexecが)、この実行時の動作がすべての MPI 実装で同じであることに依存できるとは思いません。移植性と互換性のために、リダイレクトなどの o/s 機能を使用するよりも、プログラム内で I/O を明示的に処理する方が適切です。

プロセス 0 がパラメーターを読み取って他のプロセスに配布するのではなく、各プロセスが同じファイルを読み取るようにコードを記述できます。この方法でコードを作成する場合は、プロセスが I/O チャネルへのアクセスをめぐって争っていないことを確認してください。複数のプロセスが単一の入力チャネルを (ほぼ) 同時に読み取ろうとすることは、速度を低下させる確実な方法です。

于 2013-10-03T09:13:11.157 に答える