MPI_Isend MPI_recv потерянные данные

Возможно ли, что MPI_Recv получит сообщение, чей тег не совпадает?

Моя логика: связь MPI_Isend / MPI_Recv.

Узел 1 Посылаю сообщение с тегом 0, затем отправляю другое сообщение с тегом 1. потому что в Узле 1 есть два потока, поэтому действие Isend может происходить одновременно.
Узел 2 проверит наличие сообщения от Узла 1, если да, то примет сообщение.

В моем проекте я хочу, чтобы Узел 2 получал сообщение с тегом 0, а затем с тегом 1. Но когда Узел 2 проверяет сигнал о том, что сообщение приходит от Узла 1, он получил сообщение, длина которого совпадает с длиной сообщения тега 1 , Тогда больше нет сообщения от Узла 1. Кажется, что сообщение тега 0 было потеряно.

Я так растерялся, жду ответа.

-1

Решение

MPI не может потерять сообщения, если они не были отправлены в «готовом» режиме, то есть с использованием MPI_Rsend или же MPI_Irsend, в то время как приемник не был готов, что, очевидно, не ваш случай. MPI_Isend инициирует операцию отправки, но она не гарантированно завершится, если она не будет завершена. Многие вызовы MPI приводят к выполнению неблокирующих операций, но наиболее явными являются MPI_Wait и его варианты. Существуют также реализации MPI, которые имеют специальные потоки прогрессии, которые выполняют неблокирующие операции в фоновом режиме (например, Open MPI может быть скомпилирован таким образом).

Второе сообщение может поступить раньше первого, если оно очень маленькое и используется другой режим отправки (например, некоторый протокол отправки с нетерпением). MPI только гарантирует, что сообщения с одинаковым конвертом хранятся в порядке. Конверт сообщения — это кортеж (отправитель, получатель, тег, коммуникатор).

Также вы говорите об отправке сообщений из разных тем. Вы уверены, что ваша библиотека MPI является поточно-ориентированной, и вы инициализировали ее MPI_THREAD_MULTIPLE уровень поддержки потока, например:

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
printf("Sorry, your MPI library does not provide MPI_THREAD_MULTIPLE\n");
MPI_Abort(MPI_COMM_WORLD, 0);
}
2

Другие решения

Лучше всего, чтобы получатель опубликовал MPI_IRecv для тега 0, а затем опубликовать MPI_IRecv для тега 1. Затем он ожидает поступления сообщений, используя MPI_Wait* который может быть MPI_WaitAll, MPI_WaitAny, или же MPI_Wait в зависимости от того, что должно произойти дальше.

Таким образом, у вас есть два приема звонков, которые сидят и ждут сообщений, а помеченные сообщения отправляются туда, куда они должны идти.

0

По вопросам рекламы [email protected]