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
。