2

私は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) を正しく追加するには、それらを削減する必要があることを理解しました (私が思うに) が、私が知る限り、次のような配列を持つことはできません。削減条項内のこと。どうすればこれを行うことができますか?

4

2 に答える 2

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
于 2013-01-20T01:30:16.893 に答える
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

また、スレッドの作成をループの外に移動することも検討してください。

于 2013-01-20T09:02:12.560 に答える