2014-02-13 2 views
3

im использование mpi4py для разделения некоторых вычислений между несколькими процессами. В принципе, я просто вычисляю объемы некоторого выпуклого корпуса, который я создаю с помощью tvtk и mayavi.mpi4py Ошибка травления при попытке отправить классы

только первый прок импортирует эти LIBS:

... 
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... 

Однако, очевидно, что его невозможно отправить экземпляры/классы (или что-то другое 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 среди всех проки?

EDIT: короткий пример; вы можете получить эту работу?

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

Я думаю, что проблема в том, что вы не можете отправлять пакеты таким образом, вы можете импортировать их, хотя на всех запущенных случаях, хотя и использовать их где это необходимо, что, по-видимому, позволит вам делать то, что вы хотите

Это, однако, не будет передавать какие-либо данные глобального модуля, что может быть тем, что вы пытаетесь сделать, поэтому вам потребуется отправить его отдельно, а i предложит использовать:

global_data = None 

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

global_data = MPI.COMM_WORLD.bcast(global_data, root=0)