Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何发送带有散射的阵列的一部分?_Python_Mpi - Fatal编程技术网

Python 如何发送带有散射的阵列的一部分?

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

我正在自学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)
用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位