2017-05-26 83 views
0

假设我有两个处理器:MPI超过缓冲

第一个P0

  • 呼叫MPI_SEND到消息A发送到P1;
  • 调用MPI_Recv从p1接收B;

第二个P1

  • 呼叫MPI_SEND到消息B发送到P0;
  • 调用MPI_Recv从p0接收A;

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

+0

它会死锁。使用'MPI_Sendrecv'来保持便携。 –

+0

无论缓冲区大小如何,此代码都会死锁。使用非阻塞调用('MPI_Isend','MPI_Irecv')或更改它们的顺序,即'P1:Send()Recv()'和'P2:Recv(); Send()'。或者你可以使用前面评论中提到的MPI_Sendrecv。 – Arash

+0

你是否假设它是同步模式?这样会出现死锁? –

回答

1

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

它可能通过MPI实现/配置/状态的摆布工作。但总的来说,这是一个僵局。您不应该考虑标准阻塞发送呼叫的缓冲是否正确。由于性能原因,它们被允许缓冲,这对于初学者来说可能是令人惊讶的。似乎适用于小消息大小的代码突然对更大的消息大小产生了死锁,但实际上代码一直是错误的,它只是不显示。

2

我们永远不应该假设存在标准发送缓冲这样的事情。 MPI标准明确警告反对在分割点,点对点通讯 3.5语义:如果是必需的程序来完成任何消息缓冲

的程序是“安全的”。可以用同步发送代替这样的程序中的所有发送,并且程序仍将正确运行。这种保守的编程风格提供了最佳的可移植性,因为程序完成并不取决于可用的缓冲区空间量或使用的通信协议。

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