我有一个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
包含在Fast-Fourier-Transforms中用作工作数组的已分配空间。
显然,每个线程都需要维护targets
和pulses
的独立副本,并独立维护两者之间的指针。在我看来,这可能会对OpenMP的自动内存管理有点过分要求。这是正确的,还是应该开箱即用?
另一种选择当然是在每个线程(存储在数组中)中创建原始数据的副本,并在调用prop
时使用此私有复制数据。
答案 0 :(得分:0)
从我对OpenMP 2.5标准的阅读中,您无法在private
(或firstprivate
或threadprivate
)子句中使用Fortran指针的目标,这似乎排除了您的代码。话虽如此,这不是我在OpenMP中尝试过的东西,所以如果你向前冲并到任何地方,请告诉我们。
如果要在进入并行区域时初始化私有变量,并且firstprivate
是正确的,并且在并行区域的条目中使用同名变量的值。
我猜你可能要实施你的计划B.