如何在Fortran中使用数组减少?

时间:2013-01-20 01:14:40

标签: 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 continue
    !$OMP END PARALLEL DO

我已经想出(我认为)如果我想正确添加它们,我需要减少co(k)和si(k),但据我所知,你不能拥有减少条款中的数组。我怎么能这样做呢?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,使用临时变量将起作用:

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

答案 1 :(得分:1)

您还可以使用associate块(F2003)或pointers(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

还要考虑将线程的创建移出循环。