3

mpi4py を使用して、一部の計算を複数の proc に分割しています。基本的には、tvtk と mayavi を使用して作成した凸包のボリュームを計算するだけです。

最初の proc のみがこれらのライブラリをインポートします:

...
if rank==0:
   from tvtk.api import tvtk
   from mayavi Import mlab
   ...
   mlab.figure(size=(1024,768),bgcolor=(1,1,1))
   ...

次に、すべてのプロシージャ間でオブジェクト mlab と tvtk を共有しようとします。

for i in range(comm.Get_size()):
    comm.send(mlab,dest=i)
    comm.send(tvtk,dest=i)
....

次の手順は次のようになります...

Points=local_data
ug=tvtk.UnstructuredGrid(Points=Points)
...
dataname="Data %s " % rank
ds=mlab.pipeline.add_dataset(ug,name=dataname)
delaunay=mlab.pipeline.delaunay3d(ds,name=dataname)
... calc volume...

ただし、次のエラーが常に発生するため、明らかにインスタンス/クラス (または mlab と tvtk が何であれ) を送信することはできません。

comm.send(mlab,dest=i)
File "Comm.pyx", line 753, in mpi4py.MPI.Comm.send (src/mpi4py.MPI.c:53848)
File "pickled.pxi", line 122, in mpi4py.MPI.PyMPI_send (src/mpi4py.MPI.c:20409)
 File "pickled.pxi", line 39, in mpi4py.MPI._p_Pickle.dump (src/mpi4py.MPI.c:19503)
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed

すべてのプロシージャ間でインスタンス mlab と tvtk を「共有」する方法はありますか?

編集:短い例; これを機能させることができますか?

from mpi4py import MPI
comm=MPI.COMM_WORLD

size=comm.Get_size()
rank=comm.Get_rank()

if rank==0:
        from tvtk.api import tvtk
        from mayavi import mlab

if __name__=='__main__':
        if rank==0:
                for i in range(size):
                        comm.send(mlab,dest=i)
                        comm.send(tvtk,dest=i)
        else:
                local_mlab=comm.recv(mlab,source=0)
                local_tvtk=comm.recv(tvtk,source=0)
4

2 に答える 2

0

問題は、この方法でパッケージを送信できないことだと思いますが、実行中のすべてのインスタンスにパッケージをインポートして、必要な場所で使用することができます。これにより、必要なことを実行できるようになります

ただし、これはグローバルモジュールデータを共有しません。これは、あなたがやろうとしている可能性があるため、個別に送信する必要があるため、次を使用することをお勧めします:

global_data = None

if rank == 0:
    global_data = {'value_of_interest': mlab.some_parameter}

global_data = MPI.COMM_WORLD.bcast(global_data, root=0)
于 2014-09-19T10:43:57.957 に答える