MPI_Bsend的缺点?

Disadvantages of MPI_Bsend?

我最近遇到了一个死锁,我可以使用 MPI_Bsend 而不是 MPI_Send 来解决。如果我理解正确 MPI_Bsend 是非阻塞发送并且修改我发送的内容是安全的而不用担心发送操作何时完成,所以

double x = 1;
MPI_Bsend(&x,1,MPI_DOUBLE,master,1,MPI_COMM_WORLD);
x = 0;

将始终导致 x 在 1 发送。

在阅读 the documentation on MPI send modes 时,我遇到了关于 MPI_Bsend

的警告

A late add-on to the MPI specification. Should be used only when absolutely necessary.

我的问题是:

  1. 为什么?是不是所有实现都支持Bsend?
  2. 支持 MPI_Bsend 的最旧版本的 Open MPI 是什么?
  3. 使用 MPI_Bsend 时还有其他注意事项吗?

为什么 MPI_BSend 有问题?

MPI 中的缓冲操作需要用户提供足够大的缓冲区。 MPI 描述了一个操作模型,每个操作可以使用多少缓冲区 - 因此您可以从理论上计算总共需要多少缓冲区。但是,在足够复杂的应用程序中,无法正确计算所需的缓冲区量。没有足够的缓冲区 space 是一个 不可恢复的错误 。这个错误可能是在特定情况下随机出现的非常讨厌的heisenbug。

请注意,缓冲模式和非阻塞模式在 MPI 中是不同的(甚至是正交的)。使用非阻塞原语更容易编写正确的 MPI 程序,即使用 MPI_Isend。一般推荐这样。

MPI_BSend支持怎么样?

"late addition" 引用具有误导性。它在 24 年前就已经出现在第一个 MPI 标准中。我不会担心图书馆的支持,而是我提到的其他问题。