我有一段 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
.