我对python和MPI的世界还很陌生。我正在研究分散方法,想知道是否可以分散字典。
我已经使用整数和其他数据类型,但是自那以后,字典可以包含任何内容,我不确定它是否可以作为numpy对象散布。以下是我尝试过的方法,但显然不起作用。我不知道如何分散“数据”,即使数据是字典也是可能的。
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
答案 0 :(得分:0)
来自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'>