Сообщение обрезано в MPI_Recv

У меня есть матрица смежности и следующий код:

if (is_broadcast_message) {
MPI_Send(&broadcast_message,1,MPI_INT,j,3,MPI_COMM_WORLD);
MPI_Send(&message,20,MPI_CHAR,j,3,MPI_COMM_WORLD);
}

куда broadcast_message=128(случайное число, чтобы знать, когда я получаю, что это было широковещательное сообщение)

Сообщение определяется как char [20].

else if (i have to send only to a node) {
MPI_Send(&destination,1,MPI_INT,next_hop[destination],3,MPI_COMM_WORLD);
MPI_Send(&message,20, MPI_CHAR, next_hop[destination],3,MPI_COMM_WORLD);
}

Когда я получаю, я сначала проверяю, recv_payload является 128 (широковещательное значение) или другое значение:

MPI_Recv(&recv_material,1,MPI_INT,MPI_ANY_SOURCE,3,MPI_COMM_WORLD,&status2);

Если это 128, то:

MPI_Recv(&message,20,MPI_CHAR,from_d,3,MPI_COMM_WORLD,&status2);

и я пересылаю сообщение всем процессам

MPI_Send(&message,20,MPI_CHAR,j,3,MPI_COMM_WORLD);

Если это не 128, я проверяю, являюсь ли я пунктом назначения:

if(recv_material == rank)
MPI_Recv(&mesaj,20,MPI_CHAR,from_d,3,MPI_COMM_WORLD,&status2);

Остальное, я отправляю на nexthop [recv_material]

MPI_Send(&mesaj,20,MPI_CHAR,next_hop[recv_material],3,MPI_COMM_WORLD);

Проблема в том, что я получаю следующую ошибку, и я не знаю почему:

Fatal error in MPI_Recv: Message truncated, error stack:
MPI_Recv(186).....................: MPI_Recv(buf=0x7fffbce8f2a4, count=1, MPI_INT
src=MPI_ANY_SOURCE, tag=3, MPI_COMM_WORLD, status=0x7fffbce8f250) failed
MPIDI_CH3U_Receive_data_found(129): Message from rank 7 and tag 3 truncated;
20 bytes   received but buffer size is 4

4

Решение

Похоже, ваша проблема в том, что ваш буфер слишком мал для приема отправляемого сообщения. Из вашего объяснения кажется, что вы делаете правильные вещи, но я предполагаю, что где-то на этом пути порядок, в котором вы думаете, что сообщения должны поступать, не является фактическим порядком, в котором они приходят. Вы должны попытаться сопоставить вещи сами и убедиться, что все соответствует правильно.

Если вам нужна дополнительная помощь, вы должны опубликовать свой фактический код, хотя вы также должны урезать его до минимального рабочего примера (http://sscce.org).

4

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

Вы отправляете несколько сообщений между одной парой процессов. Это Дело в том, чтобы использовать теги. Так почему же вы используете один и тот же тег для всех сообщений? Используйте теги для устранения неоднозначности, а затем опубликуйте получение для определенного тега.

0

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