2012-05-30 24 views
1

从两个匹配的非阻塞发送和recv操作中仅检查一个请求对象是否足够。如果recv和send匹配,mpi请求是否完成

这会很好,因为这样可以减少处理程序中请求对象的工作量。

这里的一个小例子与升压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

你应该真的考虑在哪个进程中执行哪条语句。 MPI newcommers有点难以掌握这种精神分裂症的行为,但你会习惯于这种行为。顺便说一句,如果你不关心任何'I'操作的结果,你可以用'MPI_Request_free()'释放请求句柄(对不起,不知道MPI的等价物是什么),它会是MPI库完成后自动处理。 –

回答

5

秩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