仅从两个匹配的非阻塞发送和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();
}
答案 0 :(得分:5)
等级1没有有效的req0
,等级0没有有效的req1
;它们是仅对实际执行非阻塞操作的任务有效的请求(并返回请求的句柄)。
所以不,这里的等级都不需要(或者甚至可以)调用两个请求等待;每个人都会对其拥有的请求进行等待,例如
if(world.rank()==0)
req0.wait();
if(world.rank()==1)
req1.wait();
或者,更好(我假设等级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();
请注意,当您执行需要等待与多个请求相对应的多个操作时,您可以拥有请求列表并致电wait_all。