Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers OpenMP:将fortran指针获取到PRIVATE()中_Pointers_Fortran_Openmp - Fatal编程技术网

Pointers OpenMP:将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) ::

我正在尝试将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

如果我没有弄错你的问题,你的问题是在并行区域内初始化指向同一内存位置的私有指针

如果是这种情况,则应使用
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节对本条款的完整描述(如果您感兴趣)非常有用。谢谢