MPI 超过缓冲区



假设我有两个处理器:

第一个 P0

  • 呼叫MPI_Send将消息 A 发送到 p1;
  • 呼叫 MPI_Recv 以接收来自 p1 的 B;

第二个 P1

  • 调用 MPI_Send 将消息 B 发送到 p0;
  • 呼叫 MPI_Recv 接收来自 p0 的 A;

如果消息 A 和 B 的大小都超过系统缓冲区,会发生什么情况?

永远不应该假设存在标准发送的缓冲之类的东西。MPI 标准在第3.5 节点对点通信语义中明确警告

如果程序不需要消息缓冲即可完成,则该程序是"安全的"。可以将此类程序中的所有发送替换为同步发送,并且程序仍将正常运行。这种保守的编程风格提供了最佳的可移植性,因为程序完成不依赖于可用的缓冲区空间量或使用的通信协议。

MPI 专门针对您问题中的用例,并提供两个发送-接收呼叫MPI_SendrecvMPI_Sendrecv_replace。前者使用不得重叠的单独发送和接收缓冲区,而后者使用单个缓冲区。两者都保证,如果发送和接收部分与相应的接收/发送操作匹配,则不会发生死锁。

在任何情况下,代码都是错误的。

它可以在 MPI 实现/配置/状态的怜悯下工作。但总的来说,这是一个僵局。您不应该考虑标准阻塞发送调用的正确性缓冲。仅出于性能原因,它们被允许缓冲,这对于初学者来说可能会令人惊讶。似乎适用于较小消息大小的代码突然因较大的消息大小而陷入僵局,但实际上代码一直都是错误的,它只是没有显示。

最新更新