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