Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top