Syntax 如何在Fortran中使用数组的约简?
我刚刚开始学习openMP,我有以下几点Syntax 如何在Fortran中使用数组的约简?,syntax,parallel-processing,fortran,openmp,reduction,Syntax,Parallel Processing,Fortran,Openmp,Reduction,我刚刚开始学习openMP,我有以下几点 do 100 k=1,lines !$OMP PARALLEL DO PRIVATE(dotprod) REDUCTION(+:co(k),si(k)) do 110,i=1,ION_COUNT dotprod=(rx(k)*x(i)+ry(k)*y(i)...) co(k)=co(k)+COS(dotprod) si(k)=si(k)+SIN(dotprod) 110 conti
do 100 k=1,lines
!$OMP PARALLEL DO PRIVATE(dotprod) REDUCTION(+:co(k),si(k))
do 110,i=1,ION_COUNT
dotprod=(rx(k)*x(i)+ry(k)*y(i)...)
co(k)=co(k)+COS(dotprod)
si(k)=si(k)+SIN(dotprod)
110 continue
!$OMP END PARALLEL DO
我已经发现(我想)如果我想正确地添加它们,我需要对co(k)和si(k)做一个缩减,但是据我所知,在reduce子句中不能有这样的数组。我怎样才能做到这一点呢?如果我理解正确,使用临时变量可以:
do 100 k=1,lines
co_tmp = 0.0
si_tmp = 0.0
!$OMP PARALLEL DO PRIVATE(dotprod) REDUCTION(+:co_tmp,si_tmp)
do 110,i=1,ION_COUNT
dotprod=(rx(k)*x(i)+ry(k)*y(i)...)
co_tmp=co_tmp+COS(dotprod)
si_tmp=si_tmp+SIN(dotprod)
110 continue
!$OMP END PARALLEL DO
co(k) = co_tmp
si(k) = si_tmp
100 continue
您还可以使用
关联
块(F2003)或指针
(F90)来避免临时变量。在任何情况下,我都会使用end do
,因为我看到您使用的是自由格式源代码,所以您有F90
do k=1,lines
c => co(k)
s => si(k) !use associate in Fortran 2003 here
!$OMP PARALLEL DO PRIVATE(dotprod) REDUCTION(+:c,s)
do i=1,ION_COUNT
dotprod = (rx(k)*x(i) + ry(k)*y(i) ...)
c = c + COS(dotprod)
s = s + SIN(dotprod)
end do
!$OMP END PARALLEL DO
end do
还可以考虑将线程的创建移出循环。我不是OpenMP方面的专家,因此它可能很简单,但在这种情况下为什么需要减少(+:co(k),si(k))呢?co(k)和si(k)根本不出现在并行化循环中。@BálintAradi:这是一个拼写错误,现在似乎已经修复:-)