gpt4 book ai didi

c++ - 如何使用 boost MPI 出现死锁情况(我使用 MPICH 编译器)?

转载 作者:行者123 更新时间:2023-11-28 00:02:14 24 4
gpt4 key购买 nike

我试图找出在什么情况下潜在阻塞的 boost mpi“发送”实际上会阻塞并导致死锁。

#include <boost/mpi.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
boost::mpi::environment env{argc, argv};
boost::mpi::communicator world;
if (world.rank() == 0)
{
char buffer[14];
const char *c = "Hello, world from 1!";
world.send(1, 1, c, 13);
std::cout << "1--11111\n";
world.send(1, 1, c, 13);
std::cout << "1--22222\n";
world.recv(1, 1, buffer, 13);
std::cout << "1--33333\n";
world.recv(1, 1, buffer, 13);
std::cout << "1--44444\n";
buffer[13] = '\0';
std::cout << buffer << "11 \n";
}
else
{
char buffer[14];
const char *c = "Hello, world from 2!";
world.send(0, 1, c, 13);
std::cout << "2--11111\n";
world.send(0, 1, c, 13);
std::cout << "2--22222\n";
world.recv(0, 1, buffer, 13);
std::cout << "2--33333\n";
world.recv(0, 1, buffer, 13);
std::cout << "2--44444\n";
buffer[13] = '\0';
std::cout << buffer << "22 \n";
}
}

但它运行得很好并且按照这个顺序:

2--11111
2--22222
1--11111
1--22222
1--33333
1--44444
Hello, world 11
2--33333
2--44444
Hello, world 22

如果有人能给我一个我实际上陷入僵局的场景,我将不胜感激。潜在阻塞的 boost mpi 如何工作?

谢谢。

最佳答案

在发布接收之前,实现可能会或可能不会完成 MPI_Send。您的代码不是正确的 MPI 应用程序。在下雨的满月期间,在特定的网络上,它可能会因特定的消息大小而死锁。

在实践中,它主要取决于消息大小,因为实现通常会将小消息发送到预分配的缓冲区。根据您的实现情况,可能会有调整参数。

MPI 描述了几种通信模式。如上所述,默认为阻塞1标准 模式。 同步 发送 (MPI_Ssend) 必须等待接收被发布。这将保证出现死锁。

缓冲 发送 (MPI_Bsend) 必须完成,即使未发布接收也是如此。除了这些模式之外,还有非阻塞立即 调用,它们总是会在本地完成,但可能还不会复制数据。两者都将保证不会出现死锁。然而,boost.MPI 仅支持后者。

1:术语中的阻塞仅表示调用阻塞,直到可以重用发送缓冲区。要么因为它被发送了,要么因为它被本地缓冲了。另请查看 the standard .

关于c++ - 如何使用 boost MPI 出现死锁情况(我使用 MPICH 编译器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com