使用Cython返回MPI通信器的Wrap C ++函数

时间:2015-03-11 14:15:07

标签: python c++ mpi cython mpi4py

我正在尝试包装一个不接受任何输入并返回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时,我遇到了一个分段错误,valgrind给出的错误是:

Access not within mapped region at address 0x8

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

1 个答案:

答案 0 :(得分:0)

我认为您从未分配*thisptr,因此在尝试呼叫getMPIComm时会收到访问冲突。尝试按如下方式创建Foo实例:

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