我用了openmpi和Linux Mint的, 考慮下面的例子:的boost :: MPI和boost ::系列化錯誤
#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味精= 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