我对并行计算和Boost库完全陌生。但是在我当前的项目中,我需要发送/ recv一个包含序列化类对象的向量,大小将在运行时决定。在阅读了boost :: mpi和boost :: serialization文档之后,我在Google中搜索时找到了以下代码,并使用vs2008进行了编译,没有错误。
#include <boost/mpi.hpp>
#include <iostream>
#include <vector>
namespace mpi = boost::mpi;
class gps_position
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
public:
int degrees;
int minutes;
float seconds;
gps_position() {};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
int main(int argc, char *argv[]) {
mpi::environment env(argc, argv);
mpi::communicator world;
if(world.rank() == 0) {
std::vector<gps_position> positions;
positions.push_back(gps_position(1, 2, 3.));
positions.push_back(gps_position(5, 6, 10.0));
std::cout<< "Sent GPS positions:"<<positions.size()<<std::endl;
world.send(1, 0, positions);
}
else {
std::vector<gps_position> positions;
world.recv(0, 0, positions);
std::cout << "Received GPS positions: "<<positions.size() << std::endl;
for(unsigned int i=0;i<positions.size(); i++) {
std::cout << positions[i].degrees << "\t"
<< positions[i].minutes << "\t"
<< positions[i].seconds << std::endl;
}
}
return 0;
}
但是程序运行不正常。看起来process1永远不会从process0接收包含gps_position对象的向量。输出是
c:\mpi3>mpiexec -n 2 mpitest
Sent GPS positions:2
Received GPS positions: 0
我修改了代码以允许它传递单个元素而不是整个向量,它完美地工作。所以我完全不知道原代码有什么问题。 boost :: mpi是否能够传递这种类型的向量?非常感谢任何建议。
提前谢谢大家
扎克
答案 0 :(得分:0)
Boost说它可以处理矢量......而你的类型本身显然也可以处理。天真,我希望能够工作。
从增强文档中查看以下内容
将数据发送到另一个进程。
此例程执行带有标记标记的潜在阻塞发送 具有等级dest的过程。它可以由目标进程接收 与匹配的recv电话。
给定值必须适合通过MPI传输。有 满足这些要求的几类类型:
Types with mappings to MPI data types: If is_mpi_datatype<T> is convertible to mpl::true_, then value will be transmitted using the
MPI数据类型get_mpi_datatype()。所有原始C ++数据类型 具有MPI等价物,例如int,float,char,double等 MPI数据类型的内置映射。您可以转为Serializable类型 通过专门化将固定结构转换为MPI数据类型 你的类型的is_mpi_datatype。
Serializable types: Any type that provides the serialize() functionality required by the Boost.Serialization library can be
传输和接收。
Packed archives and skeletons: Data that has been packed into an mpi::packed_oarchive or the skeletons of data that have been backed
进入mpi :: packed_skeleton_oarchive可以传输,但是会 收到mpi :: packed_iarchive和mpi :: packed_skeleton_iarchive, 分别允许通过提取值(或骨架) 目的地过程。
Content: Content associated with a previously-transmitted skeleton can be transmitted by send and received by recv. The receiving process
可能只会将内容接收到已经存在的值的内容中 用匹配的骨架构建。
对于具有到MPI数据类型的映射的类型(包括 一个类型的集中,这个例程的调用将导致a 单个MPI_Send呼叫。对于可变长度数据,例如,序列化类型 和压缩的档案,将通过MPI_Send发送两条消息:一条 包含数据的长度,第二个包含数据 本身。注意,可变长度数据的传输模式是 可能会发生变化的实施细节。
答案 1 :(得分:0)
谢谢大家的帮助。
最后通过在VS 2010下重新编译它解决了这个问题。虽然不确定根本原因。我猜头文件和库中有些不匹配?