質問

私は、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を実装する必要があります推測します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top