C++ 是否可以强制MPI在发送时始终阻止?
有没有办法在发送时强制MPI始终阻止?在分布式算法中查找死锁时,这可能很有用,否则死锁将取决于 例如,以下程序(使用2个进程运行)在我的计算机上运行时不会出现问题: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
// 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。谢谢!我无法使用“英特尔”链接。进行了编辑。抱歉,正确的链接是“英特尔”链接不适用于我。已进行编辑。抱歉,正确的链接为