boost mpi:字符串变量在 mpi 消息中传递是不是有最大长度?
Posted
技术标签:
【中文标题】boost mpi:字符串变量在 mpi 消息中传递是不是有最大长度?【英文标题】:boost mpi: Is there a max length for string variables to pass in an mpi message?boost mpi:字符串变量在 mpi 消息中传递是否有最大长度? 【发布时间】:2019-10-25 10:01:37 【问题描述】:在以下测试代码中,如果我将 SIZE 参数设置为远高于 960,则不会发送任何消息。在 boost mpi 消息中传递的字符串变量是否有最大长度? 也许字符串序列化有限制,但我在文档中找不到和限制...... 非常感谢任何帮助。
//compile: mpic++ -Wall gather-002.cpp -o gather-002 -lboost_mpi -lboost_serialization
//run: mpirun -np 4 ./gather-002
#include <boost/mpi.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#define SIZE 960
namespace mpi = boost::mpi;
using namespace std;
int main(int argc, char* argv[])
mpi::environment env(argc, argv);
mpi::communicator world;
if (world.rank() == 0)
string my_string = "MAIN";
for (int proc = 0; proc < world.size(); ++proc)
string outmessage = "";
for (int i = 0; i < SIZE; i++) outmessage = outmessage + "-";
world.send(proc, 0, outmessage);
vector<string> all_strings;
gather(world, my_string, all_strings, 0);
for (int proc = 0; proc < world.size(); ++proc)
cout << "Process #" << proc << " " << all_strings[proc] << endl;
else
string inmessage;
world.recv(0,0,inmessage);
gather(world, inmessage, 0);
return 0;
【问题讨论】:
您使用哪个SIZE
值来证明问题?
您正在从 proc 0 发送到 proc 0,因此阻塞发送将死锁。也许您希望发送 proc 循环从 1 而不是 0 开始。
【参考方案1】:
您的程序在world.send(0, 0, outmessage)
中死锁。
对于足够小的字符串,您的 MPI 库使调用成为非阻塞的,并且程序恰好运行。当超过 MPI 库用于消息大小的任何阈值时,它会切换到阻塞调用。由于没有人收到消息,发送无法继续,程序挂起。请注意,标准不要求所描述的行为:您不能依赖 MPI 库对小尺寸使用非阻塞。
来自 MPI 3.1 标准,第 3.2.4 节:
Source = Destination 是允许的,即进程可以向自己发送消息。 (但是,使用上述阻塞发送和接收操作这样做是不安全的,因为这可能会导致死锁。
相关问题:Is the behavior of MPI communication of a rank with itself well-defined?
解决方案是不要从进程 0 向自身发送任何内容。
可以发送的最大大小是INT_MAX
,这取决于您可以提供给 MPI_Send 的最大计数。请参阅this question 了解更多信息。
【讨论】:
好答案。也许您想强调 1) 一个人应该永远不要依赖标准发送来以非阻塞方式处理小数据。即使它在某些情况下适用于一个系统/实现。 2)***.com/questions/27966262/… 如果 OP 想了解更多信息,请尝试在谷歌上搜索“MPI eager vs rendezvous”协议,这是描述这一点的常用术语。 如前所述,这里最好不要向任务0
发送任何内容以上是关于boost mpi:字符串变量在 mpi 消息中传递是不是有最大长度?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 boost::mpi::request.test() 返回无效的统计信息
如何使用 Visual Studio 2010 在 Windows 上使用 Open MPI 构建 boost::mpi 库