【问题标题】:Wrap C++ function that returns MPI communicator using Cython使用 Cython 包装返回 MPI 通信器的 C++ 函数
【发布时间】:2015-05-13 09:13:50
【问题描述】:

我正在尝试包装一个不接受任何输入并返回 MPI 通信器的 C++ 函数。

Foo.h

class Foo{
 public:
  Foo(MPI_Comm _comm){
   _comm = comm;
  }
  MPI_Comm getMPIComm(){
   return comm
  }
  virtual void Foo1() = 0 

我尝试了以下方法:

source.pyx

cimport mpi4py.MPI as MPI
from mpi4py.libmpi cimport *

cdef extern from  Foo.h:
   cdef cppclass Foo:
      Foo(MPI_Comm _comm)
      MPI_Comm getMPIComm()
      void Foo1() 

cdef class pyFoo:
   cdef Foo *thisptr
   def __cinit__(self,MPI.Comm _comm):
      pass
   def get MPIComm(self):
      c_comm = self.thisptr.getMPIComm()
      return <MPI.Comm> c_comm
   def Foo1(self):
      pass       

此代码已编译,我能够编写继承此类的 python 代码。但是,当我尝试在python级别访问getMPIComm时,遇到了segmentation fault,valgrind给出的错误是:

Access not within mapped region at address 0x8

这是否意味着我没有正确包装 getMPIComm() ?有谁知道我应该如何处理它?

【问题讨论】:

    标签: python c++ mpi cython mpi4py


    【解决方案1】:

    我认为您永远不会分配*thisptr,因此在尝试调用getMPIComm 时会遇到访问冲突。尝试如下创建Foo 实例:

    cdef class pyFoo:
       cdef Foo *thisptr
       def __cinit__(self,MPI.Comm _comm):
          self.thisptr = new Foo(_comm)
       # ...
    

    【讨论】:

    • 我不确定在这种情况下如何分配 *thisptr 因为纯虚函数 Foo1 并且当我尝试进行指针分配时它会引发编译错误。这应该发生吗?
    • @user279545:是的,没错。您不能实例化抽象类。但是你根本不能使用this-指针。也许您应该包装一个可以实例化的Foo 的子类。另一种方法是将Foo1 的签名更改为virtual void Foo1() = {}。这取决于您的需求。
    • 如果我想在这种情况下包装一个 [Foo] 的子类,我该怎么做呢?我对 cython 还是很陌生,并试图弄清楚。
    • 即使在 C++ 中也无法获得 Foo 的实例,因为它是抽象的。这意味着应该有其他类继承自Foo。而不是包装 Foo 本身,您可以像上面尝试的那样简单地包装子类。在这种情况下它会起作用,因为您可以实例化thisptr
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多