C++ 是否可以强制MPI在发送时始终阻止?

C++ 是否可以强制MPI在发送时始终阻止?,c++,mpi,boost-mpi,C++,Mpi,Boost Mpi,有没有办法在发送时强制MPI始终阻止?在分布式算法中查找死锁时,这可能很有用,否则死锁将取决于 例如,以下程序(使用2个进程运行)在我的计算机上运行时不会出现问题: // C++ #include <iostream> #include <thread> // Boost #include <boost/mpi.hpp> namespace mpi = boost::mpi; int main() { using namespace std::ch

有没有办法在发送时强制MPI始终阻止?在分布式算法中查找死锁时,这可能很有用,否则死锁将取决于

例如,以下程序(使用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);
    }
}
<代码> /C++ #包括 #包括 //促进 #包括 名称空间mpi=boost::mpi; int main(){ 使用名称空间std::chrono_文本; 环境环境; mpi::通信器世界; auto me=world.rank(); 自动其他=1-me; 字符缓冲区[10]={0}; while(true){ 发送(其他,0,缓冲区); recv(其他,0,缓冲区);
std::cout如果想要阻止行为,请使用MPI_Ssend。它将阻止,直到发布匹配的接收,而不缓冲请求。MPI_Ssend提供的缓冲量(有意地)特定于实现。在尝试不同的实现时,10000缓冲区的行为可能会有所不同

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


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

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

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


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

对于纯MPI代码,您描述的正是
MPI_Ssend()
提供给您。但是,在这里,您使用的不是纯MPI,而是boost::MPI。不幸的是,根据,
MPI\u Ssend()
不受支持


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

对于纯mpi代码,您所描述的正是
mpi_-Ssend()
提供给您的。然而,在这里,您并没有使用纯mpi,而是使用boost::mpi。不幸的是,根据
mpi_-Ssend()
的说法,它不受支持


,也许Boost::MPI提供了另一种方式,但我对此表示怀疑。

< p>可以考虑调整渴望极限值()。强制发送操作以阻止任何消息大小。建立急切极限的方法取决于<代码> MPI < /代码>实现。在<代码>英特尔MPI < /代码>中,您可以使用<代码> IyMPIIAgEyrOxList环境变量(参见)。

< P>可以考虑调整渴望极限值()。强制发送操作阻止任何消息大小。建立急切限制的方法取决于
MPI
实现。例如,在
Intel MPI
上,您可以使用
I\u MPI\u eager\u THRESHOLD
环境变量(请参阅)。

我想您需要的是
MPI\u Ssend()
但根据,它不受支持。也许还有其他方法,但我不知道boost::mpi是否足以帮助您。没错。请将其作为答案发布。我想您想要的是
mpi\u Ssend()
但根据,它不受支持。也许还有其他方法,但我对boost::mpi的了解不足以帮助您。没错。请将其作为答案发布。我将为测试目的修补boost。谢谢!我将为测试目的修补boost。谢谢!我无法使用“英特尔”链接。进行了编辑。抱歉,正确的链接是“英特尔”链接不适用于我。已进行编辑。抱歉,正确的链接为