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()

(14)C#的网络接收和发送的各种大小端字节转换

mpi_recv 只接收 mpi_send 发送的一半数据?完全糊涂

使用 MPI_Send 和 MPI_Recv 未正确接收矩阵

线程中阻塞 MPI_Recv 的 CPU 使用率

在C中成功发送和接收文件大小