Я использую 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;
}
Компиляция: mpic ++ -std = c ++ 0x test.cc -lboost_serialization -lboost_mpi
Запустите: mpirun -np 2 ./a.out
Выход:
получено ведомого = 3664010 сообщений = 3664010
получено ведомого = 3664012 msg = 3664012
получено ведомого = 3664012 msg = 3664012
Ошибка воспроизводится только тогда, когда все сообщения имеют одинаковую длину. Если второе сообщение, например, будет «3664012 и более», все будет работать нормально:
получено ведомого = 3664010 сообщений = 3664010
получено ведомым = 3664010 сообщений = 3664012 и более
получено ведомым = 3664010 сообщений = 3664012 и более
получено ведомым = 3664010 сообщений = 3664012 и более
Похоже, что dst и msg используют один и тот же буфер памяти. И они начинают использовать другой буфер памяти, только если длина строк различна. Я использую следующий обходной путь (msg = string ()), чтобы сообщить компилятору об изменении msg:
std::cout << "slave received=" << dst << " msg=" << msg << std::endl;
msg = string();
И это прекрасно работает. Есть ли лучшие решения? Спасибо.
Проблема была решена с помощью GCC C ++ 11 без строки коровы
Других решений пока нет …