Python 如何发送带有散射的阵列的一部分?
我正在自学Python mpi4py模块,用于在多个进程中编程。我已经写了下面的代码来练习分散Python 如何发送带有散射的阵列的一部分?,python,mpi,Python,Mpi,我正在自学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 st
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)
用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
回溯(最近一次呼叫最后一次):
文件“scatter.py”,第11行,在
数据=通信散点(数据,根=0)
文件“Comm.pyx”,第874行,在mpi4py.MPI.Comm.scatter(src/mpi4py.MPI.c:68023)中
文件“pickled.pxi”,第656行,在mpi4py.MPI.PyMPI_散点中(src/mpi4py.MPI.c:32402)
文件“pickled.pxi”,第127行,在mpi4py.MPI.\u p\u Pickle.dumpv(src/mpi4py.MPI.c:26813)中
ValueError:应为4项,但得到8项
这个错误意味着什么?我的意图是将包含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]
希望这有帮助。我不熟悉Python中的MPI。我认为在C/Fortran中调用散布例程时应该提供计数和位移。我想是这样,但我没有尝试,因为在我们的超级计算机上没有安装python 3。因为它在python2上工作完美,但在python3上,我遇到了同样的问题。我们正在迁移到python3,因为它有长int(在C中)64位