MPI超过缓冲区

时间:2017-05-26 15:45:58

标签: buffer mpi standards send exceed

假设我有两个处理器:

第一个P0

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

第二个P1

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

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

2 个答案:

答案 0 :(得分:2)

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

  

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

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

答案 1 :(得分:1)

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

它可能受MPI实现/配置/状态的支配。但总的来说,这是一个僵局。您不应该考虑缓冲标准阻塞发送调用的正确性。由于性能原因,允许它们进行缓冲,这对于初学者来说可能是令人惊讶的。对于较大的邮件大小,似乎适用于小邮件大小的代码突然陷入僵局,但实际上代码一直都是错误的,它只是不显示。