如果recv和send匹配,则mpi请求是否完成

tun*_*2fs 1 c++ mpi boost-mpi

是否足以从两个匹配的非阻塞发送和recv操作中仅检查一个请求对象.

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

这里有一个使用boost 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();

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*rsi 5

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

所以不,这里的排名都不需要(或者甚至可以)在两个请求上调用wait; 每个人都会对其拥有的请求进行等待,例如

if(world.rank()==0)
    req0.wait();
if(world.rank()==1)
    req1.wait();
Run Code Online (Sandbox Code Playgroud)

或者,更好(我假设等级0的等值应该是等级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();
Run Code Online (Sandbox Code Playgroud)

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