2016-05-20 6 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

Вы должны печатать только с одного ранга. Это тривиальное упражнение по добавлению оператора '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; вы не можете ничего называть после завершения.

Смежные вопросы