我正在教自己的Python mpi4py模块,用于在多个进程中进行编程.我编写了以下代码来练习分散.
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
if rank == 0:
data = [i for i in range(8)]
else:
data = None
data = comm.scatter(data, root=0)
print str(rank) + ': ' + str(data)
Run Code Online (Sandbox Code Playgroud)
使用8个进程运行上面的代码非常有效.但是,当我用4个进程运行它时,我收到一个错误:
Traceback (most recent call last):
File "scatter.py", line 11, in <module>
data = comm.scatter(data, root=0)
File "Comm.pyx", line 874, in mpi4py.MPI.Comm.scatter (src/mpi4py.MPI.c:68023)
File "pickled.pxi", line 656, in mpi4py.MPI.PyMPI_scatter (src/mpi4py.MPI.c:32402)
File "pickled.pxi", line 127, in mpi4py.MPI._p_Pickle.dumpv (src/mpi4py.MPI.c:26813)
ValueError: expecting 4 items, got 8
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我的目的是将我的大量8个项目拆分成8/4 = 2项的小数组,并将每个进程发送一个这样的子数组.我怎么做?我还想在可能的情况下概括一些不均衡分为8的过程,例如3.
它似乎comm.scatter不能count作为一个参数,并期望一个精确comm.size元素的列表作为数据分散; 所以你需要自己在进程之间分配数据.这样的事情会做:
if rank == 0:
data = [i for i in range(8)]
# dividing data into chunks
chunks = [[] for _ in range(size)]
for i, chunk in enumerate(data):
chunks[i % size].append(chunk)
else:
data = None
chunks = None
data = comm.scatter(chunks, root=0)
print str(rank) + ': ' + str(data)
[physics@tornado] ~/utils> mpirun -np 3 ./mpi.py
2: [2, 5]
0: [0, 3, 6]
1: [1, 4, 7]
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
3181 次 |
| 最近记录: |