主题:OpenMP中的可以指定哪些私有变量?
yesshi06
[专家分:0] 发布于 2011-08-05 15:44:00
我有两个一直疑惑的问题,是关于OpenMP私有变量的
1.如果我OpenMP的私有变量指定一个指针pointer,那么OpenMP各个线程得到的是这个指针,然后实际都是指向同一个区域,还是得到这个指针指向的区域的值,每个线程的操作都不会影响其他线程?
2.OpenMP是不是只支持简单数据类型的私有变量(整形、实数等)?就是我如果定义一个复杂的数据类型,里面包括了指针、整形数组、单个实数变量等等,在各个线程中,能得到这个复杂变量的完整拷贝么?里面的指针会怎么样?
有人知道这两个问题的答案么?
最后更新于:2011-08-05 15:44:00
回复列表 (共3个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-08-05 23:30:00
如果你学过C++,那我可以告诉你,复杂类型中,它肯定是浅拷贝。但对于Fortran的普通指针,它是非常特殊的。因为如果你定义一个指针指向什么不能像C/C++那样随意。指向数组与指向单一的变量是不能混用的。
就比如一个Allocatable数组,你如果把它设置为Private,那么程序是可以得到它的复本的。
而Pointer也一样。因为你在FORTRAN中是可以得到它指向空间的SIZE的:)
板凳
yesshi06 [专家分:0] 发布于 2011-08-06 13:55:00
如果是浅拷贝的话,就是不拷贝资源,您的意思是假如是复杂类型的话,如果没有文件,或者引用了其他复杂结构这些资源相关的外部内容,得到的就是一个完整的副本了是么?例如
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 楼
cgl_lgs [专家分:21040] 发布于 2011-08-07 14:30:00
理论上应该是的。
我来回复