我正在尝试将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
答案 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节中。