boost mpi:字符串变量在传递mpi消息时是否有最大长度?

时间:2019-06-11 03:08:10

标签: c++ string boost mpi

在以下测试代码中,如果我将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;
}

1 个答案:

答案 0 :(得分:2)

您的程序在world.send(0, 0, outmessage)中处于死锁状态。

对于足够小的字符串,您的MPI库正在使该调用成为非阻塞状态,并且该程序恰好在运行。当超过MPI库用于消息大小的阈值时,它将切换为阻塞调用。由于没有人收到消息,因此发送无法继续,程序将挂起。请注意,该行为不是标准所必需的:您不能依赖MPI库使用非阻塞的小尺寸。

根据MPI 3.1标准的3.2.4节:

  

Source =目的地是允许的,也就是说,进程可以向自身发送消息。 (但是,使用上述阻止发送和接收操作这样做是不安全的,因为这可能导致死锁。

相关问题:Is the behavior of MPI communication of a rank with itself well-defined?

解决方案是不从进程0向自身发送任何消息。

可以发送的最大大小为INT_MAX,这取决于您可以给MPI_Send分配的最大数量。有关更多信息,请参见this question