Fortran90のOpenMPの中の非自明なプライベートデータ
-
16-09-2019 - |
質問
私は、OpenMPで並列化されなければならないFortran90のプログラムのセクションを持っています。
!$omp parallel num_threads(8) &
!$omp private(j, s, prop_states) &
!$omp firstprivate(targets, pulses)
! ... modify something in pulses. targets(s)%ham contains pointers to
! elements of pulses ...
do s = 1, n_systems
prop_states(s) = targets(s)%psi_i
call prop(prop_states(s), targets(s)%grid, targets(s)%ham, &
& targets(s)%work, para)
end do
!$omp end parallel
複雑なデータ構造は、各スレッドにプライベート可能かどうかについて、私はわからないんだ何を(そしてどのようにこれが行われるべき - ?firstprivate
正しいです)。上記のコード例では、targets
は等しく複雑なサブフィールドで、やや複雑なユーザー定義タイプのものです。例えば、targets(s)%ham%op(1)%pulse
は配列pulses
のいくつかの要素へのポインタです。また、targets(s)%work
は、高速フーリエトランスフォームのワーク配列として使用される割り当てられた領域を含んでいます。
もちろん、すべてのスレッドがtargets
のとpulses
の両方の独立したコピーを維持し、独立して両者の間のポインタを維持する必要があります。 OpenMPの自動メモリ管理から少しあまりを尋ねるかもしれないと私には思えます。これは正しいですか、この作品は、箱から出してすべきか?
コースの代替案は、(アレイに格納されている)各スレッド内の元のデータのコピーを作成し、prop
するコールでこのプライベートコピーされたデータを使用することである。
解決
のOpenMP 2.5標準の私の読書から、あなたのコードを除外するように思わprivate
(またはfirstprivate
またはthreadprivate
)句でFortranのポインタのターゲットを使用することはできません。あなたが先にbashのとどこに行く場合は、私たちに知らせんので、それは私が今までのOpenMPに試みたものではないのです、と述べた。
そして、あなたのプライベート変数が並列領域への入口で同じ名前の変数の値を、並列領域に入るには、初期化されるようにしている場合firstprivate
が正しいます。
私は、あなたはおそらく、あなたのプランBを実装する必要があります推測します。