2013-04-21 5 views
1

Предположим, у меня есть 3 процесса, которые имеют следующие массивы:Может использовать более одного процесса MPI_Scatter?

P0 - int sendBuff[3] = {1,2,3}; 
P1 - int sendBuff[3] = {4,5,6}; 
P2 - int sendBuff[3] = {7,8,9}; 

предполагается, что каждый процесс имеет int recvBuff[3];

Я хочу, чтобы рассеять каждый процесс sendBuff в каждом процессе recvBuff, поэтому у меня есть код в моей основной файл:

int rank, size, i; 
MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 

MPI_Scatter(&sendBuff[0], 1, MPI_INT, &recvBuff[0], 3, MPI_INT, rank, MPI_COMM_WORLD); 
MPI_Barrier(MPI_COMM_WORLD); 
//print recvBuffs 

Однако, когда я печатаю из процессов recvBuff, я получаю:

recvBuff of P0: 1, -1077259864, 134517329 
recvBuff of P1: 5, 6, 4 
recvBuff of P2: 9, 7, 8 

Если я не получаю:

recvBuff of P0: 1, 4, 7 
recvBuff of P1: 2, 5, 8 
recvBuff of P2: 3, 6, 9 

У меня есть ощущение, каждый процесс перезаписью recvBuff каждого процесса каждый раз они называют MPI_Scatter.

Кроме того, может ли только один процесс в группе процессов вызвать MPI_Scatter или все они могут вызвать его параллельно?

спасибо.

+0

, по-видимому, то, что я искал был MPI_Alltoall (..), но мне кажется, что я до сих пор не могу заставить его работать должным образом. – ali

ответ

0

В самом деле, что я искал был MPI_Alltoall (..)

Судя по всему, что я пытался сделать, это легко сделать с MPI_Alltoall (..)

Любой, кто имеет тот же вопрос может выглядеть по адресу: Hiestro Liev's answer

для полноты ради:

разброс для одного процесса, чтобы отправить значения для всех остальных процессов:

P0- {1, 2, 3} 
P1 
P2 

После разброса:

P0-{1} 
P1-{2} 
P2-{3} 

Кроме того, параметр «корень» в операции Scatter должен быть одинаковым для всех процессов, так как это означает, рассеивает массив в корневом каталоге для всех других процессов. В приведенном выше примере, это значение равно 0.

(комплименты VAARNAN DROLIA из НУКОВ)

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