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하지만 나는 당신의 의견을 원합니다. 그래서, 다음과 같은 질문이 있습니다 :
위의 3 가지 코드가있는 잠재적 인 문제점 (있는 경우)은 무엇입니까?
모든 MPI 구현에서 작동 할 수 있도록 위의 세 코드 중 MPI 표준을 고려하여 유효/
위의 3 가지가 아니라면 가장 좋은 방법은 무엇입니까?
세 번째 코드에서 MPI_Irecv 및 MPI_Send 호출 순서를 변경하면 어떻게됩니까?
추신 : 나는 MPI를 사용하여 실행 해 보았습니다.
두 번째 구현에 대해 회의적입니다. 차단 수신은 데이터를 수신 할 때까지 차단되어야합니다. 그래서, 그런 경우에는 MPI_Wait()가 필요하지 않습니까? – usman
@ user600029 두 프로세스 모두 수신 작업을 차단하기 전에 이미 보내기 작업을 시작했기 때문에이 경우 교착 상태가 발생할 위험이 있다고 생각하지 않습니다. – Francesco
@ user600029 그러나 모든 구현에서 주소가 송수신 작업에 모두 제공되는 하나의 데이터 만 할당했음을 알았습니다. 이 결과는 두 번째 및 세 번째 구현에서 예측할 수 없습니다. 두 프로세스 모두에서 '데이터'값을 실제로 바꾸고 싶다면 저장소 중 적어도 하나에 저장소를 복제해야합니다 (하지만 비동기 통신 체계를 유지한다면 두 가지 모두에서 가능할 수 있습니다. 통신 주문) – Francesco