MPI_Send
은 차단 될 수도 있고 차단되지 않을 수도 있습니다. 보낸 사람이 보낸 사람 버퍼를 다시 사용할 수있을 때까지 차단됩니다. 일부 구현은 버퍼가 하위 통신 레이어로 전송되면 호출자에게 반환됩니다. 다른 쪽에서 일치하는 MPI_Recv()
이있을 때 다른 사람이 발신자에게 돌아갑니다. 따라서이 프로그램이 교착 상태에 빠질 지 여부는 MPI 구현에 달려 있습니다. ,
MPI_Comm_rank (comm, &my_rank);
if (my_rank == 0) {
MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status);
} else if (my_rank == 1) {
MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status);
MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm);
}
항상
모든 MPI_Send()
에 대한 페어링 MPI_Recv()
이 있어야한다는주의 :이 때문에 프로그램의
가능 교착 상태가되지 않도록 당신이 그것을 rewritting 고려할 수있다, 다른 MPI 구현들 사이에서 다르게 작동 둘 다 "평행"합니다. 예를 들어 페어링 send/recv 호출이 시간상으로 정렬되지 않기 때문에 교착 상태가 될 수 있습니다. 그들은 서로 교차 :
RANK 0 RANK 1
---------- -------
MPI_Send() --- ---- MPI_Send() |
--- --- |
------ |
-- | TIME
------ |
--- --- |
MPI_Recv() <-- ---> MPI_Recv() v
이 프로세스를 다른 방법에 물론 제공 교착 상태에 끝나지 않을 것 같은 의사 소통 영역에서의 계급 0과 1 두 개의 프로세스가 실제로 있다는 것을. 통신부 com
의 크기가 1 레벨 (단 0)를 허용하지 않는 경우
RANK 0 RANK 1
---------- -------
MPI_Send() ------------------> MPI_Recv() |
| TIME
|
MPI_Recv() <------------------ MPI_Send() v
상기 고정 프로그램이 실패 할 수있다. 이렇게하면 if-else
은 else
경로를 사용하지 않으므로 MPI_Send()
을 수신 대기하는 프로세스가없고 순위 0이 교착 상태가됩니다.
현재 통신 레이아웃을 사용해야하는 경우 비 블로킹 샌드 대신 대신 MPI_Isend()
또는 MPI_Issend()
을 사용하면 교착 상태를 피할 수 있습니다.