0

我试图找出在什么情况下可能阻塞的 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

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

谢谢你。

4

2 回答 2

2

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

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

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

即使未发布接收,缓冲发送 ( ) 也必须完成MPI_Bsend除了这些模式之外,还有非阻塞立即调用将始终在本地完成,但可能尚未复制数据。两者都将保证没有死锁。但是 boost.MPI 只支持后者。

1:术语中的阻塞仅表示调用阻塞,直到可以重用发送缓冲区。要么是因为它是被发送的,要么是因为它是在本地缓冲的。也看看标准

于 2016-06-22T21:40:13.747 回答
1

通常最简单的强制阻塞行为的方法是使用更大的消息,这会导致切换到所谓的“会合”协议,其中发送方将等待接收方发布匹配的接收操作,然后再开始数据传输。

于 2016-06-22T19:22:51.993 回答