使用MPI在python中分散字典

时间:2019-04-02 22:09:31

标签: python numpy mpi mpi4py

我对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

1 个答案:

答案 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'>