Pointers OpenMP:将fortran指针获取到PRIVATE()中
我正在尝试将OpenMP应用于大型Fortran代码 据推测,为了重用内存,许多循环依赖于初始化期间创建的工作数组。循环通过一长串指针访问它们 现在根据标准,Fortran中的任何PRIVATE()变量都必须是可分配的或可定义的。他们是取消引用这个指针的方法,还是我用Pointers OpenMP:将fortran指针获取到PRIVATE()中,pointers,fortran,openmp,Pointers,Fortran,Openmp,我正在尝试将OpenMP应用于大型Fortran代码 据推测,为了重用内存,许多循环依赖于初始化期间创建的工作数组。循环通过一长串指针访问它们 现在根据标准,Fortran中的任何PRIVATE()变量都必须是可分配的或可定义的。他们是取消引用这个指针的方法,还是我用allocate(foo,source=bar)创建新变量的最佳选择 我要处理的完整结构是这样的: type work_type allocatable :: bar end type type(work_type) ::
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
如果我没有弄错你的问题,你的问题是在并行区域内初始化指向同一内存位置的私有指针 如果是这种情况,则应使用
single
worksharing指令的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
有关的报价应为:
copyprivate子句提供了一种使用私有
变量来广播一个数据环境中的值
隐式任务到其他隐式任务的数据环境
属于平行区域
如果列表项具有指针属性,则在所有其他
属于并行区域的隐式任务,列表项
接收与指针分配相同的关联状态
与关联的隐式任务中的相应列表项
执行结构化块的线程
第2.14.1.2节对本条款的完整描述(如果您感兴趣)非常有用。谢谢