OpenMP:将fortran指针转换为PRIVATE()

时间:2014-01-23 12:44:48

标签: pointers fortran openmp

我正在尝试将OpenMP应用于大型Fortran代码。

大概是为了重用内存,许多循环依赖于在初始化期间创建的工作数组。循环通过一系列指针访问它们。

现在根据标准,Fortran中的任何PRIVATE()变量必须是可分配的或可定义的。他们是取消引用这个指针混乱的方法,还是用allocate(foo, source=bar)创建新变量的最佳选择?

我正在处理的完整结构是这样的:

type work_type
    allocatable :: bar
end type
type(work_type) :: work

pointer, type(work_type) :: w
w => work

pointer :: foo, bar
bar => w%bar
foo => bar

或者总结一下:

for => bar => w%bar
              w => work

1 个答案:

答案 0 :(得分:2)

如果我正确地得到你的问题,你的问题是在并行区域内初始化私有指针到同一个内存位置。

如果是这种情况,那么您应该使用copyprivate工作共享指令的single子句。此子句允许将私有变量的值广播到其他线程:

REAL, POINTER :: A(:)

...

!$OMP SINGLE
  ALLOCATE(A,10)
!$OMP SINGLE COPYPRIVATE(A)

! SPACE IS ALLOCATED ONLY ONCE BUT EVERY THREAD HAS A PRIVATE POINTER TO IT

OpenMP 4.0. Standard的相关引用应为:

  

copyprivate 子句提供了使用私有的机制   变量,用于从一个数据环境中广播一个值   隐式任务到其他隐式任务的数据环境   属于并行区域。

     

...

     

如果列表项具有 POINTER 属性,那么在所有其他属性中   属于并行区域的隐式任务,即列表项   接收,就像通过指针赋值一样,接收相同的关联状态   与隐式任务关联的相应列表项   执行结构化块的线程。

该条款的完整描述(如果您感兴趣)在2.14.1.2节中。