是否可以强制MPI始终阻止发送?

时间:2016-01-10 14:12:25

标签: c++ mpi boost-mpi

有没有办法强制MPI 始终阻止发送?在查找分布式算法中的死锁时,这可能很有用,否则取决于buffering MPI might choose to do on 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 ,它会无限期地阻止。

3 个答案:

答案 0 :(得分:2)

对于纯MPI代码,您所描述的正是MPI_Ssend()为您提供的内容。但是,在这里,你没有使用纯MPI,你使用的是boost :: mpi。不幸的是,根据boost::mpi's documentationMPI_Ssend()不受支持。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您可以考虑调整 eager limit 值(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)。