MPI (포트란과 함께 사용하지만 질문은 특정 언어보다 MPI 표준에 더 구체적 임)를 사용하고 특히 버퍼 된 보내기/받기 기능인 isend 및 irecv를 사용합니다.MPI 버퍼링 된 송수신 순서
프로세스 0 : 이제 우리는 다음과 같은 시나리오를 상상하면
isend(stuff1, ...)
isend(stuff2, ...)
프로세스를 1 :
wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)
그들이 보낸 순서대로 일을 처리하기 위해 전달 된 메시지, 즉 내가 될 수 있는가 확실한 in1 == stuff1과 in2 == stuff2 모든 태그에서 사용 된 태그가 동일한 경우?
"-1"대답의 "아니오"부분을 꽤 믿을 수 없어 -1이 있습니다 ... 거기서 제안하는 방법으로 "완료를 확인하는"것은 정말 미안합니다.마찬가지로, "x = 42; printf ("% d ", x);'42를 인쇄 할 수 있습니까?" 당신은 디버거를 한 단계 밟아'x'의 값을 변경했다면 그렇지 않을 것이기 때문에 '예, 아니오, 아니오'라고 말할 수 있습니다. " –
@j ... 설명 된 상황이 내가 지원하는 세 명의 다른 사용자에게 발생했습니다. 이 작업에는 단일 MPI 통신 스레드가있는 멀티 스레드 랭크가있었습니다. 다른 스레드는 하드웨어 컨트롤러와 상호 작용하고있었습니다. 하드웨어 컨트롤러 스레드가 메시지 완료를 결정하기 위해 버퍼의 마지막 비트를 검사했습니다. 그들이 TCP에서 IB로 이동했을 때, 순서가 잘못된 메시지 도착 문제가 드러났습니다. 이것은 당신이 준 디버거 예제보다는 "컴파일러 최적화"와 더 비슷합니다. 버퍼 순서는 유지하지만 실제 전송 순서는 최적화 된 패브릭 관리자입니다. –
글쎄, 나는 기절했다. (MPI_Test()가 * for *입니다!)하지만 3 명의 사용자가 잘못하면 게시물의 정보가 귀중한 것입니다. 따라서 큰 소리로 "이 일을하지 마십시오. 뭐, +1하겠습니다. –