boost mpi: есть ли максимальная длина строковых переменных для передачи в mpi-сообщении? - PullRequest
1 голос
/ 11 июня 2019

В следующем тестовом коде, если я установлю параметр SIZE намного выше, чем 960, никакие сообщения не будут передаваться.Есть ли максимальная длина для строковых переменных, чтобы передать в сообщения MPI Boost?Возможно, в сериализации строк есть ограничение, но я не могу найти и ограничения в документах ... Любая помощь очень ценится.

//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 Ответ

2 голосов
/ 11 июня 2019

Ваша программа блокируется в world.send(0, 0, outmessage).

Для достаточно маленьких строк ваша библиотека MPI делает неблокирующим вызов, и программа запускается.При превышении любого порога, который ваша библиотека MPI использует для размера сообщения, она переключается на блокирующий вызов.Поскольку никто не получает сообщение, отправка не может быть продолжена, и программа зависает.Обратите внимание, что описанное поведение не требуется стандартом: нельзя полагаться на библиотеку MPI, используя неблокирующую функцию для небольших размеров.

Из стандарта MPI 3.1, раздел 3.2.4:

Источник = пункт назначения разрешен, то есть процесс может отправить сообщение самому себе.(Тем не менее, это небезопасно делать с блокирующими операциями отправки и получения, описанными выше, поскольку это может привести к тупику.

Смежный вопрос: Поведение связи MPIранг с самим собой четко определен?

Решение не состоит в том, чтобы отправлять что-либо из процесса 0 себе.

Максимальный размер, который может быть отправлен, - INT_MAX, чтоопределяется максимальным количеством, которое вы можете дать MPI_Send. Подробнее см. в этом вопросе .

...