4

複数のプロセスでプログラミングするための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

このエラーはどういう意味ですか? 私の意図は、8 項目の大きな配列を 8 / 4 = 2 項目の小さな配列に分割し、各プロセスにそのようなサブ配列を 1 つ送信することです。それ、どうやったら出来るの?また、3など8等分にならない工程数についても、可能であれば一般化したいと考えています。

4

1 に答える 1

11

引数としてとることができず、データとして正確に要素のリストが分散することを期待してcomm.scatterいるようです。したがって、プロセス間でデータを自分で分散する必要があります。このようなことはします:countcomm.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]

お役に立てれば。

于 2012-10-10T09:13:51.387 に答える