了解通过MPI_Isend和MPI_Irecv传递的缓冲区
我想了解MPI是如何处理发送和接收的。假设我分配[12][50]个元素的缓冲区,如下所示:了解通过MPI_Isend和MPI_Irecv传递的缓冲区,c,unix,parallel-processing,mpi,openmpi,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++)
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;
}
}
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发送每个第I行,后跟从but[I]中存储的内存地址开始的50个连续元素,而MPI_Irecv接收相应的第I行并将其存储在MPI_Irecv中。我说得对吗?如果没有,有人能解释一下原因吗
谢谢。是的,你说得对。MPI_Irecv将接收到bufRecv中的消息。然而,您的代码并没有真正意义。首先,非阻塞通信呼叫直接后跟等待基本上与阻塞呼叫相同
然后,应该在不同的进程上调用接收部分,根据您的描述,每个接收方只调用一次MPI_Irecv,而不是12次。或者,如果每个进程都要接收所有行,则发送方必须为每个进程多次调用send
最重要的是:您描述的内容包含在中,无需自行实现。如果希望一个进程向所有进程发送数据,请使用。重要的是,在第二个代码段中,只有秩==主处理器调用MPI\u Isend。此外,每个rank==i`处理器应该只调用一个MPI_Irecv来获取其在数组中的部分,而不是12。您必须明确哪个处理器正在发送/接收什么;否则,它们都将调用所有内容-导致当前代码死锁并访问空值。感谢您提供这一部分,每个rank==i处理器应该只调用一个MPI_Irecv来获取其数组部分,它解决了许多问题并启发了我的想法。