gpt4 book ai didi

fortran - MPI_REDUCE 精度问题

转载 作者:行者123 更新时间:2023-12-04 04:38:03 25 4
gpt4 key购买 nike

我在 fortran 中遇到 MPI_REDUCE() 的精度问题。我测试了两种对存储在每个节点上的 double 数字求和的方法。我使用的 MPI_REDUCE() 行是

call MPI_REDUCE(num,total,1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,ierr)

它存储每个核心上“num”的值的总和,并将其发送到根核心上的“total”。

我使用的另一种方法涉及发送和接收
if (rank .eq. 0) total = num
do i = 1,nproc-1
if (rank .eq. i) call MPI_SEND(num,1,MPI_DOUBLE_PRECISION,0,&
100,MPI_COMM_WORLD,ierr)
if (rank .eq. 0) then
call MPI_RECV(num,1,MPI_DOUBLE_PRECISION,i,&
100,MPI_COMM_WORLD,stat,ierr)
total = total + num
end if
end do

后者总是给我相同的总数,而前者根据我使用的处理器数量产生不同的值(通常变化 1x10^-5 左右)。 ierr 在所有情况下都是 0。我做错了什么吗?

谢谢

最佳答案

浮点运算不是严格关联的,执行运算的顺序会对结果产生影响。尽管

(a+b)+c == a+(b+c)

对于实数(如在数学中,而不是 Fortran 术语中)数字是正确的,但对于浮点数则不是(普遍)正确。因此,内置还原产生与您自己的自制还原不同的结果也就不足为奇了。当您改变处理器的数量时,您无法控制计算中各个添加的顺序;即使在固定数量的处理器上,我也不会对同一程序不同执行结果之间的微小差异感到惊讶。相比之下,您自己的归约总是以相同的顺序进行加法。

两个结果的相对误差是多少? 10^(-5)的数据只告诉我们绝对误差,这不允许我们得出结论,您的误差可以完全由 f-p 算术的非结合性来解释。

关于fortran - MPI_REDUCE 精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com