1

有没有办法强制 MPI始终阻止发送?这在寻找分布式算法中的死锁时可能很有用,否则依赖于缓冲 MPI 可能选择在 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,它会无限期地阻塞。

4

3 回答 3

2

对于纯 MPI 代码,您所描述的正是您所MPI_Ssend()提供的。但是,在这里,您使用的不是纯 MPI,而是使用 boost::mpi。不幸的是,根据boost::mpi 的文档MPI_Ssend()不支持。

也就是说,也许 boost::mpi 提供了另一种方式,但我对此表示怀疑。

于 2016-01-10T14:27:49.563 回答
1

如果您想要阻止行为,请使用 MPI_Ssend。它将阻塞直到发布了匹配的接收,而不缓冲请求。MPI_Send 提供的缓冲量(有意)是特定于实现的。尝试不同的实现时,您获得的 10000 缓冲区的行为可能会有所不同。

我不知道您是否可以实际调整缓冲配置,我不会尝试,因为它不可移植。相反,我会尝试在某些调试配置中使用 MPI_Ssend 变体,并在需要最佳性能时使用默认 MPI_Send。

(免责声明:我不熟悉 boost 的实现,但 MPI 是一个标准。此外,我在发布此答案后看到 Gilles 评论......)

于 2016-01-10T14:25:59.953 回答
1

您可以考虑调整急切限制值 ( 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)。

于 2016-01-10T14:30:26.447 回答