2010-01-07 4 views
3

MPI (포트란과 함께 사용하지만 질문은 특정 언어보다 MPI 표준에 더 구체적 임)를 사용하고 특히 버퍼 된 보내기/받기 기능인 isend 및 irecv를 사용합니다.MPI 버퍼링 된 송수신 순서

프로세스 0 : 이제 우리는 다음과 같은 시나리오를 상상하면

isend(stuff1, ...) 
isend(stuff2, ...) 

프로세스를 1 :

wait 10 seconds 
irecv(in1, ...) 
irecv(in2, ...) 

그들이 보낸 순서대로 일을 처리하기 위해 전달 된 메시지, 즉 내가 될 수 있는가 확실한 in1 == stuff1과 in2 == stuff2 모든 태그에서 사용 된 태그가 동일한 경우?

답변

6

예, 메시지는 전송 된 순서대로 수신됩니다. 이는 표준에서 비 추월 메시지로 설명됩니다. 보낸 사람이 동일한 대상에 연속적으로 두 개의 메시지를 보내는 경우, 모두는이 작업이를받을 수 없습니다, 같은 수신 일치 :

주문 메시지가 아닌 추월 있습니다 자세한 내용은이 MPI Standard section을 참조하십시오 여기에 발췌 한 것입니다 첫 번째 메시지가 아직 보류중인 경우 두 번째 메시지. 수신자가 연속으로 두 개의 수신을 게시하고 두 메시지가 모두 동일한 메시지와 일치하면 첫 번째 메시지가 아직 보류중인 경우 두 번째 수신 작업을이 메시지로 처리 할 수 ​​없습니다. 이 요구 사항은 수신과 수신의 일치를 용이하게합니다. 프로세스가 단일 스레드이고 와일드 카드 MPI_ANY_SOURCE가 수신에 사용되지 않으면 메시지 전달 코드가 결정적임을 보장합니다. MPI_CANCEL 또는 MPI_WAITANY와 같이 나중에 설명하는 호출 중 일부는 비 결정적 원인의 추가 소스입니다.

2

예 아니요.

나는 확신 할 수 == stuff1 및 IN1 IN2 == stuff2 사용 된 태그가 모든 경우에 동일 경우?

예. send와 recv 사이에 결정적인 1 : 1 상관 관계가있어 올바른 recv 버퍼에 올바른 입력을 얻을 수 있습니다. 이 동작은 표준에 의해 보장되며 모든 MPI 구현에 의해 시행됩니다.

번호 내부 메시지 진행의 정확한 순서와 수신 측 버퍼가 채워지는 정확한 순서는 다소 검은 색 상자입니다 ... 특히 여러 개의 기내 버퍼가있는 RDMA 스타일 메시지 전송이 진행 중일 때 사용되었습니다 (예 : InfiniBand).

코드가 다중 스레드를 사용하고 있고 MPI_Test 또는 MPI_Wait을 사용하지 않고 버퍼를 검사하여 완결성을 결정할 경우 (예 : 비트 전환을 기다리는 경우) 메시지가 순서가 맞지 않을 수 있습니다 올바른 버퍼에).

코드가 in1 = stuff1에 종속되어 있고 수신자 측에 stuff2가 채워지고 두 메시지에 대해 하나의 전송 순위가있는 경우 MPI_Issend (비 차단, 동기 전송)를 사용하면 메시지가 순서대로 recv'd 보장합니다. 여러 전송 순위에서 여러 recv의 버퍼 채우기 순서를 보장해야하는 경우 각 revc 사이에 일종의 차단 호출 (예 : MPI_Recv, MPI_Barrier, MPI_Wait 등)이 필요합니다.

+0

"-1"대답의 "아니오"부분을 꽤 믿을 수 없어 -1이 있습니다 ... 거기서 제안하는 방법으로 "완료를 확인하는"것은 정말 미안합니다.마찬가지로, "x = 42; printf ("% d ", x);'42를 인쇄 할 수 있습니까?" 당신은 디버거를 한 단계 밟아'x'의 값을 변경했다면 그렇지 않을 것이기 때문에 '예, 아니오, 아니오'라고 말할 수 있습니다. " –

+2

@j ... 설명 된 상황이 내가 지원하는 세 명의 다른 사용자에게 발생했습니다. 이 작업에는 단일 MPI 통신 스레드가있는 멀티 스레드 랭크가있었습니다. 다른 스레드는 하드웨어 컨트롤러와 상호 작용하고있었습니다. 하드웨어 컨트롤러 스레드가 메시지 완료를 결정하기 위해 버퍼의 마지막 비트를 검사했습니다. 그들이 TCP에서 IB로 이동했을 때, 순서가 잘못된 메시지 도착 문제가 드러났습니다. 이것은 당신이 준 디버거 예제보다는 "컴파일러 최적화"와 더 비슷합니다. 버퍼 순서는 유지하지만 실제 전송 순서는 최적화 된 패브릭 관리자입니다. –

+0

글쎄, 나는 기절했다. (MPI_Test()가 * for *입니다!)하지만 3 명의 사용자가 잘못하면 게시물의 정보가 귀중한 것입니다. 따라서 큰 소리로 "이 일을하지 마십시오. 뭐, +1하겠습니다. –