MPI 루틴을 사용하는 데 비교적 익숙하지 않으며 아래 코드에서 내가 사용하는 노드 수에 따라 다른 결과를 얻는 이유에 대해 혼란 스럽습니다.MPI4PY : 다른 수의 노드가 다른 결과를 반환합니다.
코드 :
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으로 합산하여 올바른 답을주었습니다. 노드 수에 관계없이 같은 결과가 나타납니다. 그러나 하나의 노드에 모든 데이터를 전달하는 코드는 실용적이지 않습니다.이 코드는 구현할 것입니다.
도움을 주셔서 감사합니다!
64 비트 부동 소수점을 사용할 때 2^64 (10^19) 개의 유효 숫자가 아닌 10^10의 순서 여야합니다. – Bremsstrahlung
정수 부분에는 5 자리가 있고 7 자리에는 소수 부분이 다릅니다. 정확도는 12 자리입니다. 나머지는 80000 (~ 10^6) 개의 숫자를 합산하는 동안 반올림 오류로 인해 손실됩니다. Kahan 알고리즘의 결과와 비교하십시오. –