Я использую 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();
И это прекрасно работает. Есть ли лучшие решения? Спасибо.
Скомпилировать с -O0. С меньшим количеством символов все в порядке. Проблема только с равной длиной – Alex
вы можете проверить с помощью отладчика, если 'dst' и' msg' действительно используют одну и ту же память для массива символов? возможно, копирование на запись было отменено в «сериализации»? – BeyelerStudios
Я вывел адреса (int *) dst.c_str() и (int *) msg.c_str(). Они равны – Alex