[英]Does a mpi request finish if recv and send is matched
仅从两个匹配的非阻塞发送和接收操作中检查一个请求对象就足够了。
这将是很棒的,因为这将减少处理程序中请求对象的工作量。
这是一个带有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();
}
等级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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.