有没有办法强制MPI 始终阻止发送?在查找分布式算法中的死锁时,这可能很有用,否则取决于buffering MPI might choose to do on send。
例如,以下程序(使用2个进程运行)在我的机器上正常运行:
// C++
#include <iostream>
#include <thread>
// Boost
#include <boost/mpi.hpp>
namespace mpi = boost::mpi;
int main() {
using namespace std::chrono_literals;
mpi::environment env;
mpi::communicator world;
auto me = world.rank();
auto other = 1 - me;
char buffer[10] = {0};
while (true) {
world.send(other, 0, buffer);
world.recv(other, 0, buffer);
std::cout << "Node " << me << " received" << std::endl;
std::this_thread::sleep_for(200ms);
}
}
但如果我将缓冲区的大小更改为 10000 ,它会无限期地阻止。
答案 0 :(得分:2)
对于纯MPI代码,您所描述的正是MPI_Ssend()
为您提供的内容。但是,在这里,你没有使用纯MPI,你使用的是boost :: mpi。不幸的是,根据boost::mpi's documentation,MPI_Ssend()
不受支持。
也就是说,也许boost :: mpi提供了另一种方式,但我对此表示怀疑。
答案 1 :(得分:1)
如果您想要阻止行为,请使用MPI_Ssend。它将阻塞,直到匹配的接收已发布,而不缓冲请求。 MPI_Send提供的缓冲量是(有意)实现特定的。尝试不同的实现时,缓冲区10000的行为可能会有所不同。
我不知道你是否可以实际调整缓冲配置,我不会尝试,因为它不可移植。相反,我尝试在某些调试配置中使用MPI_Ssend变体,并在需要最佳性能时使用默认的MPI_Send。
(免责声明:我不熟悉boost的实现,但MPI是标准。另外,我在发布此答案后看到Gilles发表评论......)
答案 2 :(得分:1)
您可以考虑调整 eager limit 值(http://blogs.cisco.com/performance/what-is-an-mpi-eager-limit)以强制该发送操作阻止任何邮件大小。建立急切限制的方式取决于MPI
实施。例如,在Intel MPI
上,您可以使用I_MPI_EAGER_THRESHOLD
环境变量(请参阅https://software.intel.com/sites/products/documentation/hpc/ics/impi/41/lin/Reference_Manual/Communication_Fabrics_Control.htm)。