我最近遇到了一个死锁,我可以通过使用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
的警告
MPI规范的后期附加组件。只有在绝对必要时才能使用。
我的问题是:
MPI_BSend
problematic?MPI中的缓冲操作要求用户提供足够大的缓冲区。 MPI描述了一个操作模型,每个操作可以使用多少缓冲区 - 因此理论上可以计算出总共需要多少缓冲区。但是,在足够复杂的应用程序中,正确计算所需的缓冲区数量是不可行的。没有足够的缓冲区空间是一个不可恢复的错误。这个错误可能是在特定情况下随机发生的非常讨厌的heisenbug。
注意,MPI中的缓冲模式和非阻塞模式是不同的(甚至是正交的)。使用非阻塞原语(即使用MPI_Isend
)编写正确的MPI程序更容易。通常建议这样做。
MPI_BSend
support?“迟到”的引用是误导性的。它已经是24年前的第一个MPI标准。我不担心图书馆的支持,而是我提到的其他问题。