如果接收和发送匹配,MPI 请求是否完成

Does a mpi request finish if recv and send is matched

本文关键字:MPI 请求 是否 如果      更新时间:2023-10-16

两个匹配的非阻塞发送和 recv 操作中只检查一个请求对象就足够了吗?

这将很棒,因为这将减少在我的程序中处理请求对象的工作量。

这里有一个带有提升 mpi 的小例子:

#include <boost/mpi.hpp>
int main(int argc, char* argv[]) {
    // initialize mpi
    mpi::environment env(argc, argv);
    boost::mpi::communicator world;
    boost::mpi::request req0, req1;
    double blub;
    if(world.rank()==1)
       req1 = world.irecv(0, 23, blub);
    if(world.rank()==0)
       req0 = world.isend(0, 23, blub);
    //now I want to synchronize the processors is this enough?
    req0.wait();
    //or do I also need this line
    req1.wait();
}

秩 1 没有有效的req0,秩 0 没有有效的req1;它们是仅对实际执行非阻塞操作(并返回请求句柄)的任务有效的请求。

所以不,这里的排名都不需要(甚至不能)调用两个请求的等待;每个调用它拥有的请求的等待,例如

if(world.rank()==0)
    req0.wait();
if(world.rank()==1)
    req1.wait();

或者,更好(我假设排名 0 的 isend 应该转到等级 1,而不是 0):

boost::mpi::request req;
...
if(world.rank()==1)
   req = world.irecv(0, 23, blub);
if(world.rank()==0)
   req = world.isend(1, 23, blub);
if (world.rank() == 0 || world.rank() == 1)
   req.wait();

请注意,当您确实需要等待与多个请求对应的多个操作时,您可以获得请求列表并调用wait_all。