MPI из неизвестного источника - PullRequest
25 голосов
/ 03 декабря 2010

Я реализую в MPI программу, в которой основной процесс (с рангом = 0) должен иметь возможность получать запросы от других процессов, которые запрашивают значения переменных, которые известны только корню. Если я сделаю MPI_Recv (...) с рангом 0, я должен указать ранг процесса, который отправляет запрос в корень, но я не могу контролировать это, так как процессы не работают в порядке 1,2,3 , .... Как я могу получить запрос от любого ранга и использовать номер процесса отправки, чтобы отправить ему необходимую информацию?

Ответы [ 2 ]

52 голосов
/ 03 декабря 2010

Это предполагает, что вы используете C. Есть схожие концепции в C ++ и Fortran.Вы бы просто указали MPI_ANY_SOURCE как источник в MPI_recv().Структура состояния содержит фактический источник сообщения.

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);
2 голосов
/ 04 декабря 2010

MPI_ANY_SOURCE - очевидный ответ.

Однако, если все ранги будут отправлять запрос на ранг 0, тогда MPI_Irecv в сочетании с MPI_Testall также может работать как шаблон.Это позволит выполнять вызовы MPI_Send в любом порядке, а информацию можно принимать и обрабатывать в том порядке, в котором сопоставляются вызовы MPI_Irecv.

...