2012-05-30 2 views
1

두 개의 일치하는 비 차단 send 및 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 신참자들이이 정신 분열증 적 행동을 파악하기는 좀 어렵지만 시간이 지나면 익숙해 질 것입니다. 그런데'I' 연산의 결과에 신경 쓰지 않는다면,'MPI_Request_free()'로 요청 핸들을 해제 할 수 있습니다 (미안하지만, MPI에 상응하는 것이 무엇인지 모릅니다). MPI 라이브러리가 완료되면 자동으로 삭제됩니다. –

답변

5

은 순위 1 유효한 req0하지 않으며, 순위 0 유효한 req1이없는; 그것들은 논 블로킹 연산을 실제로 수행 한 (그리고 요청에 대한 핸들을 리턴 한) 태스크들에 대해서만 유효한 요청들입니다.

아니요, 여기 순위는 두 요청 모두에서 대기해야합니다 (또는 심지어 할 수도 있음). 각 (나는 순위 0의 isend 1 순위로 이동해야한다고 생각하지 0) 예를 들어

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

또는, 더는이 요청에 대기를 호출

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으로 전화 할 수 있습니다.