MPI_Recv: получение размера, отличного от отправленного - PullRequest
5 голосов
/ 26 января 2011

Я пишу программу для проверки кратчайшего пути с использованием библиотеки MPI.Есть два сценария:
Либо я нашел лучший путь, в случае, если первый слот буфера будет указывать resultBuff[0] = 1, и мне нужно будет просмотреть оставшуюся часть содержимого буфера, чтобы получить лучший путь.
Другой случай - resultBuff[0] = 0, и я не буду ожидать никаких значений в других ячейках буфера.

Могу ли я использовать отдельные MPI_Isend вызовы:

В случае, если я нашел лучший путь и сохранил его в resultBuff[1] до resultBuff[10]:

MPI_Isend((void*)sendBuff, 11, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);

Если не нашел лучшего пути:

MPI_Isend((void*)sendBuff, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);

Ив обоих случаях я буду использовать

MPI_Recv( (void*)resultBuff, 11, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);

для получения результата.

Будет ли это работать?
Если это произойдет, сэкономлю ли мне расходы на связь, если не отправлю лучшедорожка?

Примечание: resultBuff имеет размер 11.

Ответы [ 2 ]

1 голос
/ 26 января 2011

Да, вы можете сделать это. Из стандарта MPI и справочных страниц для MPI_Recv «аргумент count указывает максимальную длину сообщения; фактическое число можно определить с помощью MPI_Get_count », который вызывается с помощью status объект, который вы вернули из MPI_Recv ().

Что касается экономии расходов на связь, то, вероятно, этого не произойдет - в таких коротких сообщениях преобладает задержка отправки сообщения, а не пропускная способность.

0 голосов
/ 26 января 2011

Вам не нужно отправлять сообщение «Я ничего не нашел»: отсутствие сообщения может также передать эту информацию.Получатель (получатели) могут просто периодически вызывать MPI_Test и проверять объект состояния, чтобы узнать, получено новое сообщение или нет.

...