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。此外,还targets(s)%work包含在快速傅里叶变换中用作工作数组的分配空间。

显然,每个线程都需要维护 和 的独立副本,并独立维护两者targets之间pulses的指针。在我看来,这可能对 OpenMP 的自动内存管理提出了太多要求。这是正确的,还是应该开箱即用?

当然,另一种选择是在每个线程中创建原始数据的副本(存储在一个数组中),并在对prop.

4

1 回答 1

0

根据我对 OpenMP 2.5 标准的阅读,您不能在private(or firstprivateor threadprivate) 子句中使用 Fortran 指针的目标,这似乎排除了您的代码。话虽如此,这不是我在 OpenMP 中尝试过的东西,所以如果你勇往直前并取得任何进展,请告诉我们。

firstprivate如果您的私有变量要在进入并行区域时被初始化,并且在进入并行区域时使用同名变量的值,那么这是正确的。

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

于 2009-09-26T15:39:12.900 回答