Я пытаюсь разбросать массив размером (3 512 512,48,2) с типом данных двойной точности np.float64
между 3 процессами, используя Scatter()
:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatter([a, MPI.DOUBLE], a_split, root = 0)
Однако программа заходит в тупик. Из того, что я нашел отсюда
разброс и сбор mpi4py с большими массивами numpy
и тут
Вдоль какой оси делает mpi4py Scatterv функция разбивает массив numpy?
для больших массивов я должен использовать функцию Scatterv()
. Итак, вот еще один код, использующий эту функцию:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
size = 512*512*48*2
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatterv([a,(size,size,size),(0,size,2*size),MPI.DOUBLE],a_split,root =0)
Однако это также приводит к тупику. Я также пытался отправлять массивы, используя двухточечную связь с Send()
,Recv()
, но это не помогает. Похоже, взаимоблокировка зависит только от размера массива - например, если я изменяю размер массивов с [512,512,48,2]
на [512,10,48,2]
, код работает.
Может ли кто-нибудь предложить, что я могу сделать в этой ситуации?