2016-06-22 2 views
0

잠재적으로 차단 부스트 mpi "send"가 실제로 차단되어 교착 상태가 발생하는 경우를 찾으려고합니다.부스트 MPI (어떻게 MPICH 컴파일러 사용)와 교착 상태 시나리오가 있습니까?

#include <boost/mpi.hpp> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    boost::mpi::environment env{argc, argv}; 
    boost::mpi::communicator world; 
    if (world.rank() == 0) 
    { 
    char buffer[14]; 
    const char *c = "Hello, world from 1!"; 
    world.send(1, 1, c, 13); 
    std::cout << "1--11111\n"; 
    world.send(1, 1, c, 13); 
    std::cout << "1--22222\n"; 
    world.recv(1, 1, buffer, 13); 
    std::cout << "1--33333\n"; 
    world.recv(1, 1, buffer, 13); 
    std::cout << "1--44444\n"; 
    buffer[13] = '\0'; 
    std::cout << buffer << "11 \n"; 
    } 
    else 
    { 
    char buffer[14]; 
    const char *c = "Hello, world from 2!"; 
    world.send(0, 1, c, 13); 
    std::cout << "2--11111\n"; 
    world.send(0, 1, c, 13); 
    std::cout << "2--22222\n"; 
    world.recv(0, 1, buffer, 13); 
    std::cout << "2--33333\n"; 
    world.recv(0, 1, buffer, 13); 
    std::cout << "2--44444\n"; 
    buffer[13] = '\0'; 
    std::cout << buffer << "22 \n"; 
    } 
} 

하지만 그냥 잘 실행이 순서로 :

2--11111 
2--22222 
1--11111 
1--22222 
1--33333 
1--44444 
Hello, world 11 
2--33333 
2--44444 
Hello, world 22 

누군가가 나에게 내가 실제로 교착 보유하고있는 시나리오를 줄 수 있다면 나는 감사합니다. 잠재적으로 차단 부스트 mpi는 어떻게 작동합니까?

감사합니다.

+0

Boost는 MPI 구현이 아니며 C++에 더 잘 어울리는 인터페이스 래퍼입니다. MPICH, OpenMPI, MVAPICH, Intel MPI, Cray, IBM, SGI 등과 같은 특정 MPI 구현에 대해 묻고 싶습니다. – Novelocrat

답변

2

구현물은 수신자가 게시되기 전에 MPI_Send을 완료하거나 완료하지 못할 수도 있습니다. 코드가 올바른 MPI 응용 프로그램이 아닙니다. 비가 내리면서 만월 동안 특정 네트워크에서 특정 메시지 크기로 교착 상태가 될 수 있습니다.

실제로 구현은 일반적으로 미리 할당 된 버퍼에 작은 메시지를 보내므로 메시지 크기에 따라 달라집니다. 구현에 따라 조정 매개 변수가있을 수 있습니다.

MPI는 몇 가지 통신 모드를 설명합니다. 기본값은 입니다. 위의 설명대로 또는 표준 모드입니다. A 동기 send (MPI_Ssend)는 수신을 게시 할 때까지 기다려야합니다. 교착 상태가 발생합니다.

버퍼링 수신자가 게시되지 않은 경우에도 send (MPI_Bsend)를 완료해야합니다. 모드 외에도 비 블로킹 또는 즉시 호가 항상 로컬에서 완료되지만 아직 데이터를 복사하지 못할 수 있습니다. 두 가지 모두 교착 상태가 없음을 보장합니다. 그러나 후자 만 boost.MPI에 의해 지원됩니다.

1 : 블로킹 용어로는 전송 버퍼를 다시 사용할 수있을 때까지 호출이 차단된다는 것을 의미합니다. 전송되었거나 로컬로 버퍼링 되었기 때문입니다. 또한 the standard을보십시오.

1

일반적으로 차단 동작을 강제하는 가장 쉬운 방법은 송신자가 데이터 전송을 시작하기 전에 수신자가 일치하는 수신 작업을 게시 할 때까지 기다리는 소위 '랑데부'프로토콜로 전환하는 큰 메시지를 사용하는 것입니다.

+0

"send"는 실제로 명령을 차단하지 않습니다! 그렇지? – Mehrdad

+0

MPI 라이브러리가 가장 효율적이라고 생각하는 것은 무엇이든합니다. 프로그램이'MPI_Send' 블로킹으로 인해 교착 상태가 발생할 수있는 구조로 구성되어 있다면 버그가 수정되어야합니다. – Novelocrat