2013-06-12 6 views
5

MPI_Isend와 관련하여 MPI 표준은 "시스템이 송신 버퍼에서 데이터 복사를 시작할 수 있음을 나타내는 nonblocking send 호출을 의미합니다. 송신자는 비 차단 송신 작업이 호출 된 후 송신 버퍼의 어떤 부분에도 액세스해서는 안됩니다 완료. " (http://www.mpi-forum.org/docs/mpi-11-html/node46.html)하나의 버퍼에서 MPI_Isend를 여러 번 호출하는 것이 좋습니다.

다른 송신 호출에서 송신 버퍼를 참조하고 있거나 "송신 버퍼의 일부에 액세스"에 포함되어 있습니까?

즉, 보낸 사람에 대한 다음 C 코드가 올바른가요?

MPI_Request req[2]; 
MPI_Status statuses[2]; 
... 
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]); 
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]); 
MPI_Waitall(2, req, statuses); 
+0

여기서 짐작할 수있는 것은 이것이 완전한 대답이 아닙니다. 실제로 원하지 않는 것은 소스 버퍼의 내용을 수정하거나 대상 버퍼의 내용을 읽는 것입니다. 보내기가 완료되었습니다. 그래서 나에게 당신이하는 일은 괜찮아 보입니다. 그러나 시험해보십시오. 내 말을 믿지 마라. –

+0

@ bob.sacamento 물론 그렇습니다. 그리고 내 코드가 내가 사용하고있는 MPI 구현 (소스 코드를 보았습니다)에 맞을 것이라고 알고 있지만 이것이 표준에 맞는지, 즉 MPI의 모든 올바른 구현에서 작동하는지 알고 싶습니다. –

답변

2

MPI 표준은 이러한 종류의 사용을 허용합니다.

동일한 버퍼를 필요로하는 순위가 "소수"이거나이 통신 패턴이 "소수"이상의 횟수만큼 반복 될 경우 관련 순위가있는 통신을 만들고 MPI_Bcast를 사용하는 것이 바람직합니다.

편집 :

내 대답을 명확히하기. MPI 2.0 표준은 이런 종류의 사용을 특별히 금지했습니다. 제한은 Fortran을 수용하는 것이 었습니다. MPI 2.1 또는 2.2 표준에는 여러 ISend에서 송신 버퍼를 재사용 할 수 있다는 "설명"이 포함되었습니다. 자세한 내용은 MPI 2.2 표준의 섹션 16.2.2를 참조하십시오.

+1

감사합니다. MPI 2.2 표준의 그 부분이 계몽되었습니다. –

1

은 그냥 MPI 3.0 Standard을 협의하고 다음과 같은 정보를 발견

비 블록화 보내기 호출 시스템이 송신 버퍼에서 데이터를 복사 시작할 수 있음을 나타냅니다. 보낸 사람은 비 블로킹 보내기 작업이 호출 된 후 송신이 완료 될 때까지 송신 버퍼의 일부를 수정하면 안됩니다.

그러나, 나는 아주 최근 표준의 개발자 중 일부에 의해 주어진 MPI 3.0에 대한 자습서에 참석하며 (등 MPICH, LAM)는 MPI 구현에 의존하는 것은, 그것이 안전하지 않을 수 있음을 언급 송신이 완료되기 전에 버퍼가 Isend 절차로부터 변경 될 수 있기 때문에 비 차단 통신 호출에 사용 된 버퍼에 액세스 할 수 있습니다. 즉, 두 번째 MPI_Isend의 버퍼가 첫 번째 송신의 버퍼와 동일하다는 것이 보장되지 않을 수도 있습니다. 이 사실을 확실히 파악하기 위해 구현 소스 코드를 참조합니다.

+0

흠, 이것은 내가 두려워했던 것입니다. 표준은 송신 완료 시점의 송신 버퍼가 수정되지 않은 상태로 응용 프로그램에 "반환"되어야하는지 또는 변경 될 수 있는지를 지정합니까? 실제로 송신 버퍼를 수정하여 합리적인 구현이 얼마나 도움이되는지 알 수 없습니다. –

+1

구현시 반드시 버퍼를 수정해야하는 것은 아니지만 버퍼가 복사/전송되는 동안 버퍼가 변경되지 않도록해야합니다. –