如何解决使用 OpenMP 缩减时的精度损失
我正在 Fortran 中编写一个简单的子例程,用于使用 OpenMP 减少并行化的向量点积。然而,它的结果明显不同于 dot_product
和非 openMP 做循环求和。请看下面的代码:
program main
use iso_fortran_env
implicit none
real(real64),allocatable :: x(:)
real(real64) :: x_dot
integer(int32) :: i,n
n = 1000000
allocate(x(n))
x = 0.3_real64
print *,"sum: ",dot_product(x,x)
x_dot = 0.0_real64
do i = 1,n
x_dot = x_dot + x(i)*x(i)
enddo
print *,"loop: ",x_dot
x_dot= 0.0_real64
!$omp parallel do private(i) reduction(+:x_dot)
do i = 1,n
x_dot = x_dot + x(i)*x(i)
enddo
!$omp end parallel do
print *,"omp red: ",x_dot
end program main
生成的输出:
sum: 89999.999997827967
loop: 89999.999997827967
omp red: 90000.000000129017
正如您所看到的 omp 减少,我们在单精度级别上存在差异。我在某处遇到了一些竞争条件吗?
gfortran 7.5
编译标志:-O3 -fopenmp
OMP_NUM_THREADS=4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。