【发布时间】:2015-08-05 22:12:58
【问题描述】:
这是我第一次使用 OpenMP,并将其应用于 Fortran。我碰巧在调整循环时遇到问题,其中有一个变量需要从其先前的值进行更新。我尝试使用 PRIVATE 子句,但结果与串行计算(没有 OpenMP)产生的结果相差甚远。
我在OpenMP website 的某个地方查看了一个使用!$OMP PARALLEL DO ORDERED 的解决方案,该解决方案最终有效(产生与串行解决方案相同的结果)。但似乎使用这个,计算速度比只使用PRIVATE子句要慢很多。
有没有其他方法可以在这种情况下应用 OpenMP 以获得最大速度?
使用ORDERED 选项的代码。
!$OMP PARALLEL DO ORDERED PRIVATE(i,j)
do i = ca,cb
incre(i) = 0.0d0
value = 17.0d0*li(i)
do j = cx,cy
qx = hi(i) - hj(j)
mij = dsqrt(qx)
if( mij <= value ) then
beta = li(i)*li(j)
!$OMP ORDERED
incre(i) = incre(i) + beta
!$OMP END ORDERED
end if
end do
end do
!$OMP END PARALLEL DO
仅使用 PRIVATE 子句的代码
!$OMP PARALLEL DO PRIVATE(i,j,incre,value,beta)
do i = ca,cb
incre(i) = 0.0d0
value = 17.0d0*li(i)
do j = cx,cy
qx = hi(i) - hj(j)
mij = dsqrt(qx)
if( mij <= value ) then
beta = li(i)*li(j)
incre(i) = incre(i) + beta
end if
end do
end do
!$OMP END PARALLEL DO
【问题讨论】:
-
incre 应该是“public”,mij 应该是“private”。请在您的 !$OMP 语句中添加 DEFAULT(NONE) 以确保不要忘记变量的状态
-
我忘记了 qx 是无用的(但私有的)。只有第二个版本可以加快你的代码。子句 ORDERED 仅用于调试目的...
-
啊,我忘了把
mij私下,但非常感谢您指出将incre公开。我只知道 ORDERED 子句仅用于调试。也许下次我应该仔细阅读其他代码。
标签: parallel-processing fortran openmp fortran90 gfortran