Подтвердить что ты не робот

MPI recv из неизвестного источника

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

4b9b3361

Ответ 1

Предполагается, что вы используете 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

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

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