2016-05-20 11 views
0

私はmpi4pyパッケージを初めて使用しています。このコマンドを使用してコードを実行しています。 mpirun -np 4 python test.py私の仕事は「Hello World」を4回印刷するが、プログラムでは与えられた順番に従って「一度だけ行う」ことです。次のコマンドが前のコマンドの完了を待つように、コードにどのように指定するべきですか?mpirun pythonシリアルパラレルミックス?

from mpi4py import MPI 
import sys 

size = MPI.COMM_WORLD.Get_size() 
rank = MPI.COMM_WORLD.Get_rank() 
name = MPI.Get_processor_name() 

if rank==1: 
    print 'do it only once',rank 

sys.stdout.write(
"Hello, World! I am process %d of %d on %s.\n" 
% (rank, size, name)) 


#MPI.Finalize() 

if rank==2: 
    print 'do it only once',rank 

私の答えは

Hello, World! I am process 2 of 4 on sas32. 
do it only once 2 
Hello, World! I am process 3 of 4 on sas32. 
Hello, World! I am process 0 of 4 on sas32. 
do it only once 1 
Hello, World! I am process 1 of 4 on sas32. 

を印刷しているが、私は私の答えは、この

do it only once 1 
    Hello, World! I am process 2 of 4 on sas32. 
    Hello, World! I am process 3 of 4 on sas32. 
    Hello, World! I am process 0 of 4 on sas32. 
    Hello, World! I am process 1 of 4 on sas32. 
    do it only once 2 
+0

1つのランクからのみ印刷してください。ランクを取得するコードを既に持っているので、 'if'ステートメントを追加するのは簡単なことです。 –

+0

MPI.Finalize()コマンドを別の間隔で使用して、次のコマンドが前のコマンドを完了するのを待つようにしたかったのです。しかし、MPI.Finalize()を複数回使用しているときに、このエラーが発生しています。 MPI_Finalizeが呼び出された後、MPI_Finalize()関数が呼び出されました。 – user3704712

答えて

0

あなたがプロセスを同期するためにMPI_Barrierを使用する必要があるとします

from mpi4py import MPI 
import sys 

size = MPI.COMM_WORLD.Get_size() 
rank = MPI.COMM_WORLD.Get_rank() 
name = MPI.Get_processor_name() 

if rank==1: 
    print('do it only once %d'%rank) 

MPI.COMM_WORLD.Barrier() 
print("Hello, World! I am process %d of %d on %s."% (rank, size, name)) 
MPI.COMM_WORLD.Barrier() 

if rank==2: 
    print('do it only once %d'%rank)  

出力を:

$ mpiexec -n 5 python mpibarrier.py 
do it only once 1 
Hello, World! I am process 0 of 5 on abc. 
Hello, World! I am process 2 of 5 on abc. 
Hello, World! I am process 3 of 5 on abc. 
Hello, World! I am process 4 of 5 on abc. 
Hello, World! I am process 1 of 5 on abc. 
do it only once 2 

MPI_finalizeは、mpiセッションを終了します。ファイナライズ後は何も呼び出すことはできません。

関連する問題