Parallel processing Fortran90 OpenMP中的非平凡私有数据

Parallel processing Fortran90 OpenMP中的非平凡私有数据,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,我有一部分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,

我有一部分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
中某个元素的指针。此外,
目标%work
包含分配的空间,用作快速傅立叶变换中的工作数组

显然,每个线程都需要维护
目标
脉冲
的独立副本,并独立维护两者之间的指针。在我看来,这可能对OpenMP的自动内存管理要求有点过高。这是正确的,还是应该开箱即用


当然,另一种选择是在每个线程内创建原始数据的副本(存储在数组中),并在调用
prop
时使用此私有复制数据。根据我对OpenMP 2.5标准的阅读,您不能在
private
中使用Fortran指针的目标(或
firstprivate
threadprivate
)子句,它们似乎排除了您的代码。话虽如此,我从未在OpenMP中尝试过这一点,因此如果您奋力前进并取得任何进展,一定要让我们知道

如果要在进入并行区域时初始化私有变量,并且在进入并行区域时使用相同名称的变量值,则
firstprivate
是正确的

我想你可能不得不实施你的B计划