了解通过MPI_Isend和MPI_Irecv传递的缓冲区

时间:2015-09-13 00:39:30

标签: c unix parallel-processing mpi openmpi

我想了解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 = 12MPI_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。我对吗?如果不是,有人可以解释原因吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

是的,你是对的。 MPI_Irecv会将邮件收到bufRecv。但是,您的代码并没有多大意义。首先,直接跟随等待的非阻塞通信呼叫基本上与阻塞呼叫相同。

然后应该在不同的过程中调用接收部分,并且根据您的描述,每个接收者只会呼叫MPI_Irecv一次,而不是12次。或者,如果每个进程都要接收所有行,则发送方必须为每个进程的行数调用send。

最重要的是:您所描述的内容由MPI_Scatter涵盖,无需自行实施。如果您希望一个进程将数据发送到所有进程,请使用MPI_Bcast