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)
Для mpi4py v2.0.0 необходимыми командами являются 'MPI.pickle.dumps = dill.dumps' и' MPI.pickle.loads = dill.loads' – Wokpak