3

以下に示すように、OpenMP を並列に適用する必要がある pot.f という名前のレガシー Fortran ソース ファイルがありますが、予期しない終了状態などに関するエラー メッセージが表示されることがあります$OMP。最初の列にはエラーはありません。

私には本当に奇妙です。誰が何がうまくいかなかったのか教えてもらえますか?

subroutine pot_osc(rvp,R_pot,e_pot,pe_pot,ftmp,gtmp,vtmp,natoms)
   implicit none
   include 'sizes.h'
   include 'constants.h'
   include 'omp_lib.h'

   double precision  ftmp(maxatoms,3),gtmp(3),R_pot(maxatoms,3)

   !$OMP PARALLEL WORKSHARE  SHARED(gtmp,ftmp)
   !$OMP PARALLEL NUM_THREADS(16)
      gtmp = 0d0
      ftmp = 0d0
   !$OMP END PARALLEL WORKSHARE 
   return
end

subroutine pot_asym(rvp,vtmp)
   implicit none
   include 'constants.h'  
   return
end

エラー メッセージ:

 end
   1

Error: Unexpected END statement at (1)


  subroutine pot_asym(rvp,vtmp)
  1
Error: Unclassifiable statement at (1)
4

1 に答える 1

6

parallelで終了しない 2 番目の OpenMP ディレクティブで 2番目のセクションを開始しend parallelます。したがって、OpenMP ディレクティブは次のようになります。

!$OMP PARALLEL WORKSHARE SHARED(gtmp,ftmp) NUM_THREADS(16)
       gtmp = 0d0
       ftmp = 0d0
!$OMP END PARALLEL WORKSHARE

または、改行を使用したい場合

!$OMP PARALLEL WORKSHARE SHARED(gtmp,ftmp) &
!$OMP NUM_THREADS(16)
       gtmp = 0d0
       ftmp = 0d0
!$OMP END PARALLEL WORKSHARE

過去に、まさにこの種の初期化でいくつかの問題を経験しました。gfortranマスタースレッドでコンパイルすると、すべての作業が行われたようです。さらに悪いことに、「最初のタッチの原則」によって、配列全体が最初のスレッドに関連付けられたメモリに配置されました。私たちの CCNUMA マシンでは、これが大幅な速度低下につながります。

これを解決するために、明示的なループを使用して初期化しました。

!$OMP PARALLEL DO SHARED(gtmp,ftmp) NUM_THREADS(16)
       do i=1,maxatoms
         ftmp(i,:) = 0d0
       enddo
!$OMP END PARALLEL DO
!      No need to do three elements in parallel
       gtmp = 0d0

彼らがこの問題を修正したかどうかはわかりませんが、それ以来、共有メモリ内の配列に対してこの初期化方法を使用しています。

于 2013-10-11T18:01:01.937 に答える