2014-02-13 44 views
3

即時使用mpi4py在幾個過程中分割一些計算。基本上我只是計算一些凸包的體積,我使用tvtk和mayavi創建。mpi4py嘗試發送類時酸洗錯誤

只有第一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一個d 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) 

回答

2

我想下面可能工作你的情況

from mpi4py import MPI 
MPI._p_pickle.dumps = dill.dumps 
MPI._p_pickle.loads = dill.loads 
+0

對於mpi4py v2.0.0,所需的命令是'MPI.pickle.dumps = dill.dumps'和'MPI.pickle.loads = dill.loads' – Wokpak

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)