回 帖 发 新 帖 刷新版面

主题:OpenMP中的可以指定哪些私有变量?

我有两个一直疑惑的问题,是关于OpenMP私有变量的
   1.如果我OpenMP的私有变量指定一个指针pointer,那么OpenMP各个线程得到的是这个指针,然后实际都是指向同一个区域,还是得到这个指针指向的区域的值,每个线程的操作都不会影响其他线程?
   2.OpenMP是不是只支持简单数据类型的私有变量(整形、实数等)?就是我如果定义一个复杂的数据类型,里面包括了指针、整形数组、单个实数变量等等,在各个线程中,能得到这个复杂变量的完整拷贝么?里面的指针会怎么样?

有人知道这两个问题的答案么?

回复列表 (共3个回复)

沙发

如果你学过C++,那我可以告诉你,复杂类型中,它肯定是浅拷贝。但对于Fortran的普通指针,它是非常特殊的。因为如果你定义一个指针指向什么不能像C/C++那样随意。指向数组与指向单一的变量是不能混用的。
就比如一个Allocatable数组,你如果把它设置为Private,那么程序是可以得到它的复本的。
而Pointer也一样。因为你在FORTRAN中是可以得到它指向空间的SIZE的:)

板凳

如果是浅拷贝的话,就是不拷贝资源,您的意思是假如是复杂类型的话,如果没有文件,或者引用了其他复杂结构这些资源相关的外部内容,得到的就是一个完整的副本了是么?例如
    type :: complex
        integer :: a,b
        integer dimension(:,:) :: c,d
        real dimension(:,:,:),pointer :: e,f
    end type complex
    这样的复杂类型,其他线程得到的就是一个完整的副本,对complex的操作不会互相影响了? 
    假如加上另外一个复杂结构
    type :: complex
        integer :: a,b
        integer dimension(:,:) :: c,d
        real dimension(:,:,:),pointer :: e,f
        type(complex2) :: g,h
    end type complex
    这样其他线程对g和h的操作就是针对同一个内存区域操作,是这样么?

3 楼

理论上应该是的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册