2010-12-03 2 views
24

주 프로세스 (랭크 = 0)가 루트에서만 알 수있는 변수의 값을 요청하는 다른 프로세스의 요청을 수신 할 수 있어야하는 프로그램을 MPI에서 구현하고 있습니다 . MPI_Recv (...)를 순위 0으로 만들면 루트에 요청을 보내는 프로세스의 순위를 지정해야하지만 프로세스가 순서 1,2에서 실행되지 않으므로이를 제어 할 수 없습니다. 3, .... 계급에서 요청을 받고 방출 프로세스 번호를 사용하여 필요한 정보를 보내려면 어떻게해야합니까?알 수없는 출처의 MPI recv

답변

44

여기에는 C를 사용한다고 가정합니다. C++과 Fortran에도 비슷한 개념이 있습니다. MPI_recv()MPI_ANY_SOURCE을 출처로 지정하기 만하면됩니다. status 구조체는 메시지의 실제 소스를 포함합니다.

int buf[32]; 
MPI_Status status; 
// receive message from any source 
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
int replybuf[]; 
// send reply back to sender of the message received above 
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD); 
+0

감사합니다. 나는 그것을 알지 못했지만 참으로 매우 유용했습니다. – shkk

+0

편집을 사용하면 코드를 사용할 수 없게 된 것 같습니다. 'status' 구조체는 실제로'MPI_Send' 연산에 원본 메시지의 소스를 식별하기 위해 사용됩니다 :'status.MPI_SOURCE' – Marius

+1

@ 마리우스 감사합니다. 원래 버전으로 롤백했습니다. 일을 더 분명하게해라. – KeithB

2

MPI_ANY_SOURCE가 분명한 답변입니다.

그러나 모든 순위가 0 등급 요청을 보내는 경우 MPI_Irecv와 MPI_Testall을 결합하면 패턴으로 작동 할 수도 있습니다. 이렇게하면 MPI_Send 호출이 어떤 순서로든 실행될 수 있으며 MPI_Irecv 호출이 일치하는 순서로 정보를 수신하고 처리 할 수 ​​있습니다.