2015-07-02 2 views
4

Я новичок в MPI, используя Python, и у меня есть некоторые проблемы здесь. Это мой код:Неожиданный вывод из программы mpi4py

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

if rank == 0: 
     a = 1 
     comm.bcast(a, root=0) 
     s = comm.reduce(a, op=MPI.SUM) 
     print 'From process 0, sum =', s 
elif rank == 1: 
     b = 2 
     comm.bcast(b, root=1) 
     x = comm.reduce(b, op=MPI.SUM) 
     print 'From process 1, sum =', x 

Я хочу напечатать: From process PROCESS_NUMBER, sum = 3

Процесс 0 печатает правильно, но процесс 1 печатает None.

Я не могу понять, почему. Может ли кто-нибудь мне помочь?

ответ

3
  1. Любая коллективная работа (Bcast, Reduce) должен быть вызван на всех процессов, так что это неправильно поместить его в if rank == N заявление.
  2. Во втором сокращении вы должны указать root=1.
  3. Назначение необходим в эфире a = comm.bcast(a, root=0)

Исправленный код:

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

if rank == 0: 
     a = 1 
else: 
     a = None 
a = comm.bcast(a, root=0) 
s = comm.reduce(a, op=MPI.SUM) 
if rank == 0: 
     print 'From process 0, sum =', s 

if rank == 1: 
     b = 2 
else: 
     b = None 
b = comm.bcast(b, root=1) 
x = comm.reduce(b, op=MPI.SUM, root=1) 

if rank == 1: 
     print 'From process 1, sum =', x 

Результат работы на 3-х процессов:

From process 0, sum = 3 
From process 1, sum = 6 
1

comm.reduce(a, op=MPI.SUM) соответствует MPI_Reduce(): сумма доступна только в корневом процессе.

Если вы хотите, чтобы сумма была доступна по каждому процессу коммуникатора, вы можете использовать comm.allreduce(a, op=MPI.SUM). Он соответствует MPI_Allreduce(). См. this page, чтобы узнать больше о разнице между MPI_Reduce() и MPI_Allreduce().

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

  • Нет связанных вопросов^_^