Fortran90 OpenMP中的非平凡私有数据

时间:2009-09-25 14:34:02

标签: 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, 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中用作工作数组的已分配空间。

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

另一种选择当然是在每个线程(存储在数组中)中创建原始数据的副本,并在调用prop时使用此私有复制数据。

1 个答案:

答案 0 :(得分:0)

从我对OpenMP 2.5标准的阅读中,您无法在private(或firstprivatethreadprivate)子句中使用Fortran指针的目标,这似乎排除了您的代码。话虽如此,这不是我在OpenMP中尝试过的东西,所以如果你向前冲并到任何地方,请告诉我们。

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

我猜你可能要实施你的计划B.