Разбросать словарь в Python, используя MPI - PullRequest
0 голосов
/ 03 апреля 2019

Я довольно новичок в мире Python и MPI.Я смотрю на метод разброса и задаюсь вопросом, можно ли разбросать словарь.

Я работал с целыми числами и другими типами данных, но, так как словарь может содержать все, что я не уверен, можно ли его разбросатькак обалденный объект.Ниже я попробовал, но это, очевидно, не работает.Я не знаю, как разбросать «данные», даже если это возможно, поскольку данные - это словарь.

from mpi4py import MPI
import numpy as np

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

#data = None
data = {'a': 7,'b': 3.14}
if rank == 0:
   data = np.linspace(1,size) #this is wrong...how do I scatter a dictionary

recvbuf = np.empty(data,dtype=None)
print  comm.Scatter(data, recvbuf, root=0)

print "Rank: ",rank," recvbuf received:",recvbuf

1 Ответ

0 голосов
/ 11 апреля 2019

Из документации mpi4py:

Поддерживается точка-точка (отправка, получение) и коллективный (транслирует, разбрасывает, собирает) сообщения любого отборного Python объект, а также оптимизированные коммуникации выставления объекта Python односегментный буферный интерфейс (массивы NumPy, встроенный объекты байт / строка / массив)

Методы для выбираемых объектов Python (таких как словари) не одинаковы для объектов, представляющих односегментный интерфейс буфера. Вы должны работать с первым или последним семейством методов.

В вашем случае, я полагаю, вы хотите разбросать словарь как пару ключ / значение. Следующее не работает, как вы можете ожидать, так как разбросаны только ключи словаря:

from __future__ import print_function
from collections import OrderedDict
from mpi4py import MPI

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

if rank == 0:
    data = OrderedDict({'a': 7, 'b': 3.14})
else:
    data = None

data = comm.scatter(data, root=0)

data_type = type(data)
print(f'Data is {data} on rank {rank} with type {data_type}')

# Output
# Data is a on rank 0 with type <class 'str'>
# Data is b on rank 1 with type <class 'str'>

В вашем случае наилучшим подходом, по-видимому, является создание списка словарей и его разброс:

from __future__ import print_function
from collections import OrderedDict
from mpi4py import MPI

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

if rank == 0:
    data = [{'a': 7}, {'b': 3.14}]
else:
    data = None

data = comm.scatter(data, root=0)

data_type = type(data)
print(f'Data is {data} on rank {rank} with type {data_type}')

# Output:
# Data is {'a': 7} on rank 0 with type <class 'dict'>
# Data is {'b': 3.14} on rank 1 with type <class 'dict'>
...