如何使用boost MPI(我使用MPICH编译器)获得死锁场景?

时间:2016-06-22 19:18:28

标签: c++ boost mpi boost-mpi

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

谢谢。

2 个答案:

答案 0 :(得分:2)

在发布收据之前,实施可能会或可能不会完成MPI_Send。您的代码不是正确的MPI应用程序。在正在下雨的满月期间,它可能会在特定网络上以特定的消息大小陷入僵局。

实际上,它主要取决于消息大小,因为实现通常会向预分配的缓冲区发送小消息。可能存在调整参数,具体取决于您的实现。

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

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

术语中的

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

答案 1 :(得分:1)

强制阻止行为的一般最简单的方法是使用更大的消息导致切换到所谓的“集合点”协议,其中发送方将等待接收方在开始数据传输之前发布匹配的接收操作。 / p>