Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解通过MPI_Isend和MPI_Irecv传递的缓冲区_C_Unix_Parallel Processing_Mpi_Openmpi - Fatal编程技术网

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

了解通过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++)

我想了解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;
    }
}
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来获取其数组部分,它解决了许多问题并启发了我的想法。