2012-02-23 4 views
4

MPI 보내기 및 받기 작업에 대한 질문이 있습니다.MPI 질문 보내기 및 받기

우리는 서로에게 메시지를 보내려는 2 개의 MPI 스레드가 있다고 가정합니다.

먼저 ('전송'과 '수신'차단) :

... 
int data = ...; 
... 
MPI_Send(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD); 

MPI_Status status; 
MPI_Recv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status); 
... 

두 번째 ('전송'비 차단을하지만, '수신'차단) :

... 
int data = ...; 
... 
MPI_Request request; 
MPI_Isend(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request); 

MPI_Status status; 
MPI_Recv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status); 
// Synchronize sender & receiver 
MPI_Wait(&request, &status); 
... 
에 따라 그 일을 세 가지 코드 조각은

셋째 ('보내기'차단에 '수신'비 차단) :

... 
int data = ...; 
... 
MPI_Request request; 
MPI_Irecv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request); 

MPI_Send(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD); 

MPI_Status status; 

// Synchronize sender & receiver 
MPI_Wait(&request, &status); 
... 

나는 잠재적 인 문제가있는 것 같아요 3 개의 코드를 bove하지만 나는 당신의 의견을 원합니다. 그래서, 다음과 같은 질문이 있습니다 :

  1. 위의 3 가지 코드가있는 잠재적 인 문제점 (있는 경우)은 무엇입니까?

  2. 모든 MPI 구현에서 작동 할 수 있도록 위의 세 코드 중 MPI 표준을 고려하여 유효/

  3. 위의 3 가지가 아니라면 가장 좋은 방법은 무엇입니까?

  4. 세 번째 코드에서 MPI_Irecv 및 MPI_Send 호출 순서를 변경하면 어떻게됩니까?

추신 : 나는 MPI를 사용하여 실행 해 보았습니다.

답변

4

첫 번째 구현은 교착 상태가 동기화 모드에서 수행되는 경우 특히 교착 상태를 유발할 수 있습니다 (통신이 버퍼링 되었기 때문에 테스트에서 작동했을 가능성이 있으며 대용량 데이터의 경우는 그렇지 않을 수 있음).

다른 두 구현은 교착 상태없이 작동해야합니다. send 이전에 수신 작업을 시작하는 것이 더 나은 방법이라고 생각하므로 제 3 구현을 개인적으로 선호합니다. MPI standard, section 3.7에서 : 사용자

조언 [...]

메시지 패싱 모델은 통신이 전송자에 의해 개시되는 것을 의미한다. 송신자가 통신을 시작할 때 (데이터가 수신 버퍼로 직접 이동 될 수 있고 보류중인 송신 요청을 대기시킬 필요가없는 경우) 수신이 이미 게시 된 경우 일반적으로 통신에 낮은 오버 헤드가 발생합니다. 그러나 수신 작업은 일치하는 전송이 발생한 후에 만 ​​완료 할 수 있습니다. 비 블로킹 수신을 사용하면 송신을 기다리는 동안 수신자를 차단하지 않고 통신 오버 헤드를 낮출 수 있습니다.

첫 번째 구현과 같은 이유로 MPI_Send 호 교착 수 순서 MPI_Send/MPI_Irecv와 세번째 구현.

+0

두 번째 구현에 대해 회의적입니다. 차단 수신은 데이터를 수신 할 때까지 차단되어야합니다. 그래서, 그런 경우에는 MPI_Wait()가 필요하지 않습니까? – usman

+0

@ user600029 두 프로세스 모두 수신 작업을 차단하기 전에 이미 보내기 작업을 시작했기 때문에이 경우 교착 상태가 발생할 위험이 있다고 생각하지 않습니다. – Francesco

+1

@ user600029 그러나 모든 구현에서 주소가 송수신 작업에 모두 제공되는 하나의 데이터 만 할당했음을 알았습니다. 이 결과는 두 번째 및 세 번째 구현에서 예측할 수 없습니다. 두 프로세스 모두에서 '데이터'값을 실제로 바꾸고 싶다면 저장소 중 적어도 하나에 저장소를 복제해야합니다 (하지만 비동기 통신 체계를 유지한다면 두 가지 모두에서 가능할 수 있습니다. 통신 주문) – Francesco

관련 문제