私は MPI ルーチンを使用するのに比較的慣れていないため、以下のコードで、使用するノードの数に応じて異なる結果が得られる理由について混乱しています。
コード:
import numpy as np
from mpi4py import MPI
def MPI_sum(comm,x):
xsum = np.sum(x)
vals = comm.gather(xsum,root=0)
if rank == 0:
s = np.sum(vals)
s = comm.bcast(s,root=0)
return s
comm = MPI.COMM_WORLD
size = comm.Get_size()
datalen = 80000/size
x = np.zeros(datalen) + 1. + 1e-5
xsum = MPI_sum(comm,x)
if rank == 0:
print xsum - np.floor(xsum)
このコードを 1 つのノードと 2 つのノードで実行しました。1 つのノードから得た答え: 0.800000153016 2 つのノードから得た答え: 0.800000035219
この不一致の原因は何ですか?
(追記として、MPI_sum のすべての x 配列データを root=0 に渡し、次に root=0 で合計すると、正しい答えが得られました。ノードの数に関係なく同じ出力が得られました。ただし、すべてを渡す1 つのノードへのデータは、これを実装するコードでは実用的ではありません。)
助けてくれてありがとう!