我最近遇到了一个死锁,我可以通过使用来解决MPI_Bsend
代替MPI_Send
。如果我理解正确的话 MPI_Bsend 是一个非阻塞发送,并且可以安全地修改我发送的内容,而不必担心发送操作何时完成,所以
double x = 1;
MPI_Bsend(&x,1,MPI_DOUBLE,master,1,MPI_COMM_WORLD);
x = 0;
将始终导致 x 被发送为 1。
读书时有关 MPI 发送模式的文档 http://www.mcs.anl.gov/research/projects/mpi/sendmode.html我遇到了这个警告MPI_Bsend
MPI 规范的最新附加内容。仅应在绝对必要时使用。
我的问题是:
- 为什么?是不是因为 Bsend 可能并非所有实现都支持?
- 支持 MPI_Bsend 的 Open MPI 最旧版本是什么?
- 使用 MPI_Bsend 时还需要注意其他事项吗?
Why is MPI_BSend
有问题吗?
MPI 中的缓冲操作需要用户提供足够大的缓冲区。 MPI 描述了每个操作可以使用多少缓冲区的操作模型 - 因此您可以从理论上计算总共需要多少缓冲区。然而,在足够复杂的应用中无法正确计算所需的缓冲区量。没有足够的缓冲空间是一个问题不可恢复的错误。这个错误可能是一个非常讨厌的heisenbug,在特定情况下随机发生。
请注意,MPI 中的缓冲模式和非阻塞模式是不同的(甚至是正交的)。使用非阻塞原语编写正确的 MPI 程序更容易,即使用MPI_Isend
。通常建议这样做。
关于什么MPI_BSend
支持?
“后期添加”的引用具有误导性。 24 年前,它就已经出现在第一个 MPI 标准中。我不会担心图书馆的支持,而是担心我提到的其他问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)