1

入力を受け取らず、MPI コミュニケーターを返す C++ 関数をラップしようとしています。

フー。

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

私は次のことを試しました:

ソース.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() を適切にラップしなかったということですか? 誰も私がそれにアプローチする方法を知っていますか?

4

1 に答える 1

0

*thisptr決して割り当てないため、呼び出そうとするとアクセス違反が発生すると思いますgetMPICommFoo次のようにインスタンスを作成してみてください。

cdef class pyFoo:
   cdef Foo *thisptr
   def __cinit__(self,MPI.Comm _comm):
      self.thisptr = new Foo(_comm)
   # ...
于 2015-03-11T15:07:52.597 に答える