我有一段應該與OpenMP並行的Fortran90程序。Fortran90中的非平凡私人數據OpenMP
!$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
時使用此私有複製數據。