Python - MPI4Py зависает при вызове comm.Scatterv
Мое коллективное параллельное матрично-векторное умножение висит на comm.Scatterv, как я запустил его с mpiexec -n 2 python (filename).py 10
как буферизованные, так и небуферизованные. Вот код:
from mpi4py import MPI
from numpy.random import rand as random
import numpy as np
import sys
comm=MPI.COMM_WORLD #mpi environment
rank=comm.Get_rank()#label per prosesor
size=comm.Get_size()
n=int(sys.argv[1])
local_n=[]
local_offset=[0]
for i in range(size):
local_n.append(n/size)
if i<(n%size):
local_n[i]+=1 #load balance
for i in range(1,size):
this=0
for j in range(i):
this+=local_n[j]
local_offset.append(this)
local_n=tuple(local_n)
local_offset=tuple(local_offset)
if rank==0: #init
A=random(n,n) #init matrix
x=random(n,1) #init vector
xlocal=np.zeros(local_n[rank])
alocal=np.zeros((local_n[rank],local_n[rank]))
else:
alocal=np.zeros((local_n[rank],local_n[rank]))
xlocal=np.zeros(local_n[rank])
comm.Scatterv([A,local_n,local_offset,MPI.DOUBLE],alocal,root=0)
comm.Barrier()
comm.Scatterv([x,local_n,local_offset,MPI.DOUBLE],xlocal,root=0)
local_dot=np.dot(alocal,xlocal) #local matvec
comm.Barrier()
if rank==0:
xgather=np.zeros(n)
else:
xgather=np.zeros(1)
comm.Gatherv(local_dot,[xgather,local_n,local_offset,MPI.DOUBLE])
print "parallel results at %d: %s"%(rank,xgather)
print "serial results: %s"%np.dot(A,x)
Несколько запутанных поездок к подобным записям SO, и это говорит мне, что проблема либо в неправильном размере буфера (что произошло на предыдущих итерациях этого кода, который я забыл сохранить), либо при вызове Scatterv, вроде как, но для Scatterv вместо Bcast. Кто-нибудь может сказать мне, где я не прав или, по крайней мере, указать мне правильное направление? Благодарю.
Я использую Python 2.7 с Enthought Canopy 1.7.4.3348, mpi4py 2.0.0, MS-MPI 8.1