1

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維持し、2 つの間のポインターを独立して維持する必要があります。これは、OpenMP の自動メモリ管理に少し要求しすぎているように思えます。これは正しいですか、それともそのままで動作するはずですか?

もちろん、別の方法として、各スレッド内で元のデータのコピーを作成し (配列に格納)、このコピーされたプライベート データを の呼び出しで使用することもできますprop

4

1 に答える 1

0

privateOpenMP 2.5 標準を読んだところ、 (orfirstprivateまたは) 句で Fortran ポインターのターゲットを使用できないため、threadprivateコードが除外されているようです。そうは言っても、これは私が OpenMP で試したことがないので、先に進んでどこかに到達した場合はお知らせください。

またfirstprivate、並列領域への入り口で、並列領域への入り口で同じ名前の変数の値を使用して、プライベート変数を初期化する場合は正しいです。

おそらく、プラン B を実行する必要があると思います。

于 2009-09-26T15:39:12.900 に答える