0

假设我有两个处理器:

第一个P0

  • 调用 MPI_Send 将消息 A 发送到 p1;
  • 调用 MPI_Recv 从 p1 接收 B;

第二个P1

  • 调用 MPI_Send 将消息 B 发送到 p0;
  • 调用 MPI_Recv 从 p0 接收 A;

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

4

2 回答 2

2

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

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

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

于 2017-05-27T09:25:35.627 回答
1

无论如何,代码都是错误的。

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

于 2017-05-26T23:05:32.163 回答