微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单的boot_mpi分散程序的编译过程中出错:无序列化元素

如何解决简单的boot_mpi分散程序的编译过程中出错:无序列化元素

我目前正在评估一个简单的程序,该程序允许将行/字符串的数组/向量分散在多个进程中。我创建了一个无法编译的简单测试程序。我希望有人可以帮助我找到解决方案。这是程序:
#include <boost/mpi.hpp>
#include <string>
#include <iostream>
#include <vector>

namespace mpi = boost::mpi;

int main(int argc,char* argv[])
{
  mpi::environment env(argc,argv);
  mpi::communicator world;

  std::vector< std::vector < std::string > > all (3,std::vector < std::string >());
  std::vector< std::string > mine;
  
  if (world.rank() == 0) {
    all[0].push_back("String1");
    all[0].push_back("String2");
    all[1].push_back("String3");
    all[1].push_back("String4");
    all[2].push_back("String5");
    all[2].push_back("String6");

  }
  mpi::scatter(world,all,mine,0);
  for (int r = 0; r < world.size(); ++r) {
    world.barrier();
    if (r == world.rank()) {
      std::cout << "Rank " << r << " got " << mine[0] << std::endl;
    }
  }
  return 0;
}

我尝试了以下两个命令对其进行编译:

mpic++ scatter_mini.cpp -o scatter_mpi -lboost_mpi
mpic++ scatter_mini.cpp -o scatter_mpi -lboost_mpi -lboost_serialization

这两种情况都会导致相同的错误,我在此处以缩短的版本为您提供(以德语对不起):

/usr/include/boost/serialization/access.hpp: In Instanziierung von »static void boost::serialization::access::serialize(Archive&,T&,unsigned int) [with Archive = boost::mpi::packed_iarchive; T = std::vector<std::__cxx11::basic_string<char> >]«:
/usr/include/boost/serialization/serialization.hpp:68:22:   erfordert durch »void boost::serialization::serialize(Archive&,unsigned int) [with Archive = boost::mpi::packed_iarchive; T = std::vector<std::__cxx11::basic_string<char> >]«
/usr/include/boost/serialization/serialization.hpp:118:14:   erfordert durch »void boost::serialization::serialize_adl(Archive&,unsigned int) [with Archive = boost::mpi::packed_iarchive; T = std::vector<std::__cxx11::basic_string<char> >]«
/usr/include/boost/archive/detail/iserializer.hpp:187:40:   erfordert durch »void boost::archive::detail::iserializer<Archive,T>::load_object_data(boost::archive::detail::basic_iarchive&,void*,unsigned int) const [with Archive = boost::mpi::packed_iarchive; T = std::vector<std::__cxx11::basic_string<char> >]«
/usr/include/boost/archive/detail/iserializer.hpp:121:1:   erfordert durch »class boost::archive::detail::iserializer<boost::mpi::packed_iarchive,std::vector<std::__cxx11::basic_string<char> > >«
/usr/include/boost/archive/detail/iserializer.hpp:409:27:   erfordert durch »static void boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&,const T&) [with T = std::vector<std::__cxx11::basic_string<char> >; Archive = boost::mpi::packed_iarchive]«
/usr/include/boost/archive/detail/iserializer.hpp:461:22:   [ 5 Instanziierungskontexte werden übersprungen,»-ftemplate-backtrace-limit=0« zum Ausschalten verwenden ]
/usr/include/boost/archive/detail/interface_iarchive.hpp:68:36:   erfordert durch »Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = std::vector<std::__cxx11::basic_string<char> >; Archive = boost::mpi::packed_iarchive]«
/usr/include/boost/mpi/collectives/scatter.hpp:124:14:   erfordert durch »void boost::mpi::detail::dispatch_scatter_sendbuf(const boost::mpi::communicator&,const buffer_type&,const std::vector<int>&,const T*,T*,int,int) [with T = std::vector<std::__cxx11::basic_string<char> >; boost::mpi::binary_buffer_oprimitive::buffer_type = std::vector<char,boost::mpi::allocator<char> >]«
/usr/include/boost/mpi/collectives/scatter.hpp:143:27:   erfordert durch »void boost::mpi::detail::scatter_impl(const boost::mpi::communicator&,mpl_::false_) [with T = std::vector<std::__cxx11::basic_string<char> >; mpl_::false_ = mpl_::bool_<false>]«
/usr/include/boost/mpi/collectives/scatter.hpp:159:23:   erfordert durch »void boost::mpi::scatter(const boost::mpi::communicator&,int) [with T = std::vector<std::__cxx11::basic_string<char> >]«
/usr/include/boost/mpi/collectives/scatter.hpp:168:27:   erfordert durch »void boost::mpi::scatter(const boost::mpi::communicator&,const std::vector<T>&,int) [with T = std::vector<std::__cxx11::basic_string<char> >]«
scatter_mini.cpp:28:35:   von hier erfordert
/usr/include/boost/serialization/access.hpp:116:11: Fehler: »class std::vector<std::__cxx11::basic_string<char> >« hat kein Element namens »serialize«

我很确定我已经安装了所有必需的软件包,我还可以编译其他boost mpi程序,尤其是boost mpi教程/示例中的程序。

解决方法

您的代码缺少必要的标头。尝试添加:

#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?