假设我有3个进程具有以下数组:
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
我感觉每个进程在每次调用MPI_Scatter
时都会覆盖每个进程的recvBuff。
此外,一组进程中只有一个进程可以调用MPI_Scatter,还是所有进程都可以并行调用它?
谢谢。
答案 0 :(得分:0)
事实上,我所寻找的是MPI_Alltoall(..)
显然,我尝试做的事情很容易用MPI_Alltoall(..)
完成任何有相同问题的人都可以查看:Hiestro Liev's answer
为了完整起见:
Scatter是一个进程将值发送到所有其他进程:
P0- {1, 2, 3}
P1
P2
分散后:
P0-{1}
P1-{2}
P2-{3}
此外," root" Scatter操作中的参数对于所有进程应该是相同的,因为这意味着将根位置的数组分散到所有其他进程。在上面的示例中,该值为0.
(来自新加坡国立大学的VAARNAN DROLIA的赞美)