【问题标题】:How to have a deadlock scenario with boost MPI (I use MPICH compiler)?如何使用 boost MPI(我使用 MPICH 编译器)出现死锁场景?
【发布时间】:2016-10-24 21:32:32
【问题描述】:

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

谢谢。

【问题讨论】:

  • Boost 不是 MPI 实现,它只是一个接口包装器,以使其更适合 C++。您想询问具体的 MPI 实现,例如 MPICH、OpenMPI、MVAPICH、Intel MPI、Cray、IBM、SGI 等。

标签: c++ boost mpi boost-mpi


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它执行 MPI 库认为最有效的任何事情。如果程序的结构是MPI_Send 阻塞会导致死锁,那么这是一个应该修复的错误。
    猜你喜欢
    • 2015-11-08
    • 2015-08-05
    • 2011-04-17
    • 2013-01-19
    • 1970-01-01
    • 2017-01-22
    • 2013-12-25
    • 2012-03-07
    • 2023-04-09
    相关资源
    最近更新 更多