MPI_Bsend的缺点?

tac*_*nce 3 mpi

我最近遇到了一个死锁,我已经能够通过使用MPI_Bsend而不是解决MPI_Send.如果我理解正确MPI_Bsend是一个非阻塞发送,可以安全地修改我发送的东西,而不必担心它完成的发送操作,所以

double x = 1;
MPI_Bsend(&x,1,MPI_DOUBLE,master,1,MPI_COMM_WORLD);
x = 0;
Run Code Online (Sandbox Code Playgroud)

将始终导致x在1发送.

在阅读MPI发送模式文档时,我遇到了这个警告MPI_Bsend

MPI规范的后期附加组件.只有在绝对必要时才能使用.

我的问题是:

  1. 为什么?是因为Bsend可能不受所有实现的支持吗?
  2. 什么是支持MPI_Bsend的最早版本的Open MPI?
  3. 关于使用MPI_Bsend,还有其他注意事项吗?

Zul*_*lan 5

为什么有MPI_BSend问题?

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

注意,MPI中的缓冲模式和非阻塞模式是不同的(甚至是正交的).使用非阻塞原语(即使用)编写正确的MPI程序更容易MPI_Isend.通常建议这样做.

MPI_BSend支持怎么样?

"迟到"的引用是误导性的.它已经是24年前的第一个MPI标准.我不担心图书馆的支持,而是我提到的其他问题.