繁体   English   中英

boost.mpi.world Communicator与C ++签名不匹配:boost :: mpi :: communicator

[英]boost.mpi.world Communicator did not match C++ signature: boost::mpi::communicator

我正在尽力将C ++模块链接到python绑定。 我正在努力实现增强的mpi通信。 我正在将boost.mpi.world对象发送到C ++,并且它期望一个boost::mpi::communicator对象。 当我从python调用C ++函数时,会引发不匹配的签名错误。

myModule.myfunc(Communicator, NoneType, NoneType, _ExcInfo) did not match C++ signature:
myfunc(boost::mpi::communicator {lvalue}, char*, char*, boost::python::api::object)

我不明白-确实看起来这些是同一对象,因此应该具有相同的C ++签名。

我是否正确使用boost mpi? 是什么导致此问题?

尝试一个可重复的例子

为了重新创建它,我制作了一个setup.py文件和一个包含函数的wrapper.cpp文件:

wrapper.cpp:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/numeric.hpp>
#include <boost/mpi.hpp>

#ifdef WINDOWS
#include <windows.h>
#endif

namespace bp = boost::python;
namespace bpn = boost::python::numeric;

int run_mod_mpi(boost::mpi::communicator &_mpi)

{
  return 111;
}

#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(myMod)
{
  using namespace bpn;

  def("run_my_mpi_mod", run_mod_mpi, "run my module with mpi");
}

setup.py:

from setuptools import setup
from setuptools.extension import Extension
import os

include_dirs = ['/nopt/nrel/apps/boost/1.55.0-openmpi-gcc_140415/include']
library_dirs = ['/nopt/nrel/apps/boost/1.55.0-openmpi-gcc_140415/lib']

EXTRA_LIBS = ['gfortran']

sources = ['wrapper.cpp']

external_libs = [
    'boost_regex', 'boost_filesystem', 'boost_serialization', 'boost_system',
    'boost_signals', 'boost_python']#, 'lapack', 'blas']

external_libs.append('boost_mpi')
os.environ['CC'] = 'mpicxx'


libraries = external_libs + EXTRA_LIBS

myMod = Extension(name='myMod',
                     sources=sources,
                     include_dirs=include_dirs,
                     library_dirs=library_dirs,
                     libraries=libraries,
                     language='c++')

setup(name='myMod',
      description='a module I made',
      py_modules=['dakota', 'test_dakota'],
      ext_modules=[myMod],
      zip_safe=False,
      )

问题:

$ python setup.py build
$ cd build/lib.linux-x86_64-2.7
$ ipython

In [1]: import myMod
In [2]: from boost.mpi import world
In [3]: myMod.run_my_mpi_mod(world)
Out[3]: 111

因此,我误诊了我的问题。

您应该将**char*, char***作为第二个参数,但是您在其中放置了两个NoneType对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM