1

假设我有 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

但是,当我打印出 processes 时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 还是所有进程都可以并行调用它?

谢谢你。

4

1 回答 1

0

事实上,我正在寻找的是 MPI_Alltoall(..)

显然,我试图做的很容易用 MPI_Alltoall(..)

任何有相同问题的人都可以看看:Hiestro Liev 的回答

为了完整起见:

Scatter 是让一个进程向所有其他进程发送值:

P0- {1, 2, 3}
P1
P2

分散后:

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

此外,Scatter 操作中的“root”参数对于所有进程应该是相同的,因为这意味着将根位置的数组分散到所有其他进程。在上面的示例中,该值为 0。

(新加坡国立大学对VAARN DROLIA的赞美)

于 2013-04-21T16:52:04.710 回答