Ошибка ключевого слова при реализации Scatterv в mpi4py - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь использовать Scatterv для распределения частей массива по каждому из моих процессоров, но строка, в которой я выполняю вызов Scatterv, завершается неудачно, и я получаю эту ошибку:

Traceback (most recent call last):
  File "<ipython-input-16-e1f960b94347>", line 1, in <module>
    comm.Scatterv([init_data, (sendcount,split)], init_data_local, root=0)
  File "mpi4py/MPI/Comm.pyx", line 626, in mpi4py.MPI.Comm.Scatterv
  File "mpi4py/MPI/msgbuffer.pxi", line 538, in mpi4py.MPI._p_msg_cco.for_scatter
  File "mpi4py/MPI/msgbuffer.pxi", line 440, in mpi4py.MPI._p_msg_cco.for_cco_send
  File "mpi4py/MPI/msgbuffer.pxi", line 266, in mpi4py.MPI.message_vector
  File "mpi4py/MPI/msgbuffer.pxi", line 100, in mpi4py.MPI.message_basic
KeyError: '38w'

Понятия не имею, что я делаю не так или как исправить эту ошибку. Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: Вот воспроизводимый пример кода. Изменение типа данных массива init_data изменяет число после KeyError, но все равно выдает ту же ошибку. Я выбрал '<U38' в качестве dtype, потому что именно это np.loadtxt использует при загрузке массива в моем реальном коде.

import numpy as np
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

if rank==0:
    init_data=np.ones((5187,3), dtype='<U38')
    length=len(init_data[:,0])
else:
    length=None
    init_data=None

length=comm.bcast(length, root=0)

sendcount=[]
split=[]
for r in range(size):
    split.append(r*length//size)
    if r<size-1:
        sendcount.append(length//size)
    else:
        sendcount.append(length-(r*length//size))
sendcount=tuple(sendcount)
split=tuple(split)

init_data_local=np.empty((sendcount[rank], 3),dtype=str)

comm.Scatterv([init_data, (sendcount,split)], init_data_local, root=0)
...