我有邻接矩阵和以下代码:
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
答案 0 :(得分:4)
您的问题似乎是您的缓冲区太小而无法接收发送的消息。从你的解释来看,这听起来像你正在做正确的事情,但我的猜测是,在你的路上,你认为消息应该到达的顺序不是它们的实际顺序。到达。你应该尝试自己匹配并确保一切都正确匹配。
如果您需要更多帮助,则应发布实际代码,但也应将其修改为最小工作示例(http://sscce.org)。
答案 1 :(得分:0)
您正在一对进程之间发送多条消息。这是使用 标签的情况。那么,为什么对所有邮件都使用相同的标签?使用标签来消除歧义,然后发布特定标签的收货。