MPI_Recv:接收的大小与发送的大小不同
Posted
技术标签:
【中文标题】MPI_Recv:接收的大小与发送的大小不同【英文标题】:MPI_Recv: Receiving a different size than the one Sent 【发布时间】:2011-06-15 19:03:29 【问题描述】:我正在编写一个程序来使用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。
【问题讨论】:
【参考方案1】:是的,您可以这样做。从 MPI 标准和 MPI_Recv 的 man pages 来看,“count 参数表示消息的最大长度;实际数字可以用 MPI_Get_count 确定”,您使用从 MPI_Recv() 返回的 status
对象调用它.
至于节省通信成本,可能不会——这样的短消息主要由发送消息的延迟而不是带宽决定。
【讨论】:
【参考方案2】:您无需发送消息说“我什么都没找到”:消息的缺少也可以传达该信息。接收者可以定期调用MPI_Test,并检查状态对象以查看是否收到了新消息。
【讨论】:
这并没有回答问题,它只是绕过它。 我还需要知道路径计算何时结束。我需要发送一条消息说“我完成了”,只有这样我才能知道它是否找到了更好的路径。以上是关于MPI_Recv:接收的大小与发送的大小不同的主要内容,如果未能解决你的问题,请参考以下文章
用于未知消息大小的 MPI 非阻塞发送和接收以及 mpi_iprobe()
mpi_recv 只接收 mpi_send 发送的一半数据?完全糊涂