c - 非阻塞调用何时需要 MPI_wait?

标签 c mpi hpc

我对何时应该调用 MPI_Wait(或其他变体,例如:MPI_Waitall、MPII_Waitsome 等)有点困惑。考虑以下情况:(注:伪代码)

案例(一)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Irecv (recv_buffer, recv_req);
// wait for msgs to finish
MPI_Wait (recv_req);   // <--- Is this needed?
MPI_Wait (send_req);   // <--- How about this?

在这种情况下,我的困惑源于 MPI_Probe。由于这是一个阻塞调用,这是否本质上意味着它会阻塞调用者直到收到消息?如果是这种情况,那么我认为这里不需要 MPI_Waits。

下面的案例怎么样?

案例(二)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Recv (recv_buffer);
// wait for msgs to finish
MPI_Wait (send_req);   // <--- Is this necessary?

与第一种情况类似,但 MPI_Irecv 被替换为阻塞版本。在这种情况下,在调用 MPI_Wait 时肯定会收到消息,这意味着 MPI_Isend 一定已经完成......

还有一个单独的问题,当我们说 MPI_Probe 阻塞时,我们是什么意思?它是阻塞直到进程接收到所有消息,还是只阻塞直到接收到“元数据”(例如消息大小、发件人等级等)?换句话说,MPI_Probe + MPI_IrecvMPI_Probe + MPI_Recv 好吗?

最佳答案

只有当你想异步接收数据时,才需要使用“MPI_Wait”函数,如果发起了各种异步读取,则需要使用MPI_Waitall。问题是 MPI_Wait 是一个阻塞调用。如果你想有非阻塞你应该使用 MPI_Test 来检查你的功能的完成。

在您的情况下,MPI_Probe 将阻塞直到收到消息。所以我想说,在你的情况下,你不需要调用 MPI_Probe。

关于c - 非阻塞调用何时需要 MPI_wait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18410622/

相关文章:

c - MPI:处理器在单个 MPI 进程上无法达到 100%

netlogo - 在 HPC 机器上运行 NetLogo : how to specify the number of cores to be used?

c - 避免丢失集群上运行的作业的数据

c - SIGPIPE 带运行程序

c - HTTP 通过 C 中的套接字 : Basic file server fails to properly return file

c - MPI_Allreduce 未按预期工作 - 红黑 SOR

C - 将行和列插入二维数组

cloud - 添加主机后 PVM 终止

c - 如何使用 FIFO 等待有人写入和读取?

C - 系统 ("");一次执行一个