MPI_Bsend的缺点?

问题描述 投票:3回答:1

我最近遇到了一个死锁,我可以通过使用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规范的后期附加组件。只有在绝对必要时才能使用。

我的问题是:

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

Why is MPI_BSend problematic?

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

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

What about MPI_BSend support?

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

© www.soinside.com 2019 - 2024. All rights reserved.