【发布时间】:2015-08-06 03:41:45
【问题描述】:
我一直在尝试将 OpenMP 应用于两个嵌套循环内的简单求和运算,但到目前为止它产生了不正确的结果。我一直在查看here 和here,也在here。所有人都建议使用reduction 子句,但它不适用于我的情况,因为它会产生非常大的数字,导致segmentation fault。
我也试过这种方式张贴在here 和我自己的问题here 已解决。两者都不使用reduction,只是将求和变量设置为shared,但它也会产生不正确的结果。有什么我想念的吗?什么时候使用reduction而不是在面临求和运算时使用?
使用reduction 子句的代码
index = 0
!$OMP PARALLEL DO PRIVATE(iy,ix) REDUCTION(:+index)
do iy = 1, number(2)
do ix = 1, number(1)
index = index + 1
xoutput(index)=xinput(ix)
youtput(index)=yinput(iy)
end do
end do
!$OMP END PARALLEL DO
不使用reduction 子句的代码
index = 0
!$OMP PARALLEL DO PRIVATE(iy,ix) SHARED(index)
do iy = 1, number(2)
do ix = 1, number(1)
index = index + 1
xoutput(index)=xinput(ix)
youtput(index)=yinput(iy)
end do
end do
!$OMP END PARALLEL DO
【问题讨论】:
-
应该是
REDUCTION(+:index)... -
在第二个版本中,
index在线程之间共享,index = index + 1行会导致竞争条件!
标签: parallel-processing fortran openmp fortran90 gfortran