使用MPI在python中分散字典

问题描述 投票:0回答:1

我是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
python numpy mpi mpi4py
1个回答
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'>
© www.soinside.com 2019 - 2024. All rights reserved.