2014-01-23 37 views
0

我试图将OpenMP应用于大型Fortran代码。OpenMP:将Fortran指针设置为PRIVATE()

想必重用内存许多循环依赖于在初始化过程中创建的工作阵列。循环通过一系列的指针访问它们。

现在根据标准用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 

回答

2

如果我正确地得到你的问题,你的问题是与私人指针的初始化当位于并行区域内时,存储在相同的存储位置。

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

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条款提供了一种机制,以使用专用 可变广播从一个 隐任务的数据的环境中的属于平行区域中的其他隐任务 数据环境的值。

...

如果列表项具有指针属性,那么,在属于并行区域所有其他 隐含的任务,列表项 接收,仿佛指针赋值,与执行结构化块的 线程关联的隐式任务中的对应列表项的相同关联状态为 。

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

+0

这真的很有用。谢谢! – John