我想了解MPI如何处理发送和接收。假设我分配了[12] [50]个元素的缓冲区,如下所示:
int **buf= malloc(12 * sizeof(int *));
for (i = 0; i < 12; i++)
{
buf[i] = malloc(50 * sizeof(int));
// Immediatly fill each row by 1s for testing purpose.
for (j = 0; j < 50; j++)
{
buf[i][j] = 1;
}
}
现在,我想使用非阻塞P = 12
和MPI_Isend
将每行发送到MPI_Irecv
处理器,如下所示:
for (i = 0; i < 12; i++)
{
MPI_Isend(buf[i], 50, MPI_INT, i, TAG_0, MPI_COMM_WORLD, &req[i]);
MPI_Wait(&req[i], &status[i]);
}
for (i = 0; i < 12; i++)
{
MPI_Irecv(bufRecv[i], 50, MPI_INT, MASTER, TAG_0, MPI_COMM_WORLD, &req[i]);
MPI_Wait(&req[i], &status[i]);
}
据我所知,MPI_Isend
这里发送每一行后跟50个连续元素,从but[i]
中存储的内存地址开始,而MPI_Irecv
接收相应的第i行并存储它在MPI_Irecv
。我对吗?如果不是,有人可以解释原因吗?
谢谢。
答案 0 :(得分:0)
是的,你是对的。 MPI_Irecv
会将邮件收到bufRecv
。但是,您的代码并没有多大意义。首先,直接跟随等待的非阻塞通信呼叫基本上与阻塞呼叫相同。
然后应该在不同的过程中调用接收部分,并且根据您的描述,每个接收者只会呼叫MPI_Irecv
一次,而不是12次。或者,如果每个进程都要接收所有行,则发送方必须为每个进程的行数调用send。
最重要的是:您所描述的内容由MPI_Scatter涵盖,无需自行实施。如果您希望一个进程将数据发送到所有进程,请使用MPI_Bcast。