複数のプロセスでプログラミングするための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等分にならない工程数についても、可能であれば一般化したいと考えています。