假设我有两个处理器:
第一个P0
第二个P1
如果消息A和B的大小超过系统缓冲区,会发生什么?
答案 0 :(得分:2)
永远不要假设存在缓冲标准发送之类的事情。 MPI标准明确警告第3.5节点对点通信的语义:
一个程序是安全的"如果程序不需要消息缓冲来完成。可以使用同步发送替换此类程序中的所有发送,程序仍将正常运行。这种保守的编程风格提供了最佳的可移植性,因为程序完成不依赖于可用的缓冲区空间量或所使用的通信协议。
MPI专门针对您问题中的用例,并提供两个发送 - 接听电话MPI_Sendrecv
和MPI_Sendrecv_replace
。前者使用不必重叠的单独发送和接收缓冲区,而后者使用单个缓冲区。如果发送和接收部分与相应的接收/发送操作匹配,则两者都保证不会发生死锁。
答案 1 :(得分:1)
在任何情况下代码都是错误的。
它可能受MPI实现/配置/状态的支配。但总的来说,这是一个僵局。您不应该考虑缓冲标准阻塞发送调用的正确性。由于性能原因,允许它们进行缓冲,这对于初学者来说可能是令人惊讶的。对于较大的邮件大小,似乎适用于小邮件大小的代码突然陷入僵局,但实际上代码一直都是错误的,它只是不显示。