2016-05-11 3 views
1

Код:Почему Gather() терпит неудачу, если корень каждого процесса сам по себе?

#mpiexec -n 2 python3 gather.py 
from mpi4py import MPI 

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

a = 1 
comm.barrier() 
b = comm.gather(a, root=rank) 
print("b:", b, rank) 
comm.barrier() 

Выход должен быть:

б: [1, 1], 0

б: [1, 1], 1

Однако , программа ничего не печатает и не заканчивается. В чем причина этого и как я могу достичь желаемого результата?

+0

Я _think_, что _every_ процесс должен указывать один и тот же корень (чтобы все знали, куда отправлять данные). Прямо сейчас, каждый процесс определяет себя как корень, поэтому все они думают, что они приемники и просто сидят там, ожидая, когда кто-то еще отправит их данные. – mgilson

+0

@mgilson Это звучит логично. Знаете ли вы, как еще я могу достичь желаемого результата? Я не хочу использовать AllGather() btw. – SpiderRico

+0

Я думаю, что это зависит от желаемого результата _is_. Обычно идея состоит в том, чтобы собрать все данные о других процессах в указанный процесс. Вы знаете, какой процесс вы хотите собрать? – mgilson

ответ

1

Все коллективные операции в MPI должны быть вызваны всеми процессами в соответствующем коммуникаторе. Многие параметры должны быть одинаковыми для всех процессов. Семантика параметров очень хорошо задокументированы в MPI standard:

argumentsroot и Прдч должны иметь одинаковые значения на всех процессов.

Но опять же есть MPI_Allgather, после чего все данные доступны для всех процессов, то есть нет корня.