2015-11-25 5 views
2

Я использую OpenMPI и Linux Mint, рассмотрим следующий пример:повышение :: МПИ и бустер :: Ошибки сериализации

#include <boost/mpi.hpp> 
#include <iostream> 
#include <string> 
#include <boost/serialization/string.hpp> 

namespace mpi = boost::mpi; 
using namespace std; 

int main() 
{ 
    mpi::environment env; 
    mpi::communicator world; 

    if (world.rank() == 0) 
    { 
     world.send(1, 0, std::string("3664010")); 
     while (1) 
     { 
      world.send(1, 0, std::string("3664012")); 
      sleep(1); 
     } 
    } 
    else 
    { 
     std::string msg; 
     string dst; 
     bool first = true; 

     while (1) 
     { 
      world.recv(0, 0, msg); 
      if (first) {dst = msg;first = false;} 
      std::cout << "slave received=" << dst << " msg=" << msg << std::endl; 
     } 
    } 

    return 0; 
} 

Компиляция: КОМП ++ -std = C++ 0x test.cc -lboost_serialization -lboost_mpi
Пробег: mpirun -np 2 ./a.out
Выход: ведомые получено = 3664010 тзда = 3664010
ведомые получены = 3664012 тзда = 3664012
ведомый получен = 3664012 Сообща = 3664012

Ошибка отображается только в том случае, если все сообщения имеют одинаковую длину. Если второе сообщение, например, будет "3664012andmore" все работает нормально:
рабских получили = 3664010 Сообщи = 3664010
раба получил = 3664010 тзд = 3664012andmore
раб получил = 3664010 тзд = 3664012andmore
раб получил = 3664010 тзд = 3664012andmore

Похоже, что dst и msg используют один и тот же буфер памяти. И они начинают использовать другой буфер памяти только в том случае, если длина строк различна. Я использую следующий метод обхода (сообщ = строка()), чтобы сообщить компилятору, что сообщ изменяется:

std::cout << "slave received=" << dst << " msg=" << msg << std::endl; 
msg = string(); 

И это прекрасно работает. Есть ли лучшие решения? Спасибо.

+0

Скомпилировать с -O0. С меньшим количеством символов все в порядке. Проблема только с равной длиной – Alex

+1

вы можете проверить с помощью отладчика, если 'dst' и' msg' действительно используют одну и ту же память для массива символов? возможно, копирование на запись было отменено в «сериализации»? – BeyelerStudios

+0

Я вывел адреса (int *) dst.c_str() и (int *) msg.c_str(). Они равны – Alex

ответ

0

Проблема была решена с помощью gcc C++ 11 без строчной коровы