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
Fortran 是否可以在OpenMP并行区域内使用具有共享属性的派生类型变量?_Fortran_Openmp - Fatal编程技术网

Fortran 是否可以在OpenMP并行区域内使用具有共享属性的派生类型变量?

Fortran 是否可以在OpenMP并行区域内使用具有共享属性的派生类型变量?,fortran,openmp,Fortran,Openmp,我正在运行一个Fortran代码(使用Intel Fortran编译),该代码有一个OpenMp并行区域,我希望在该区域内访问存储在派生类型向量中的数据(whis具有不同类型的可分配字段) 每个线程在这个向量中只处理一个位置,因此我希望向量具有“共享”属性 运行代码时,我会遇到一些奇怪的错误,因此我想知道是否可以这样使用派生类型向量?当然,使用派生类型没有问题: program derivedtype use omp_lib implicit none integer, pa

我正在运行一个Fortran代码(使用Intel Fortran编译),该代码有一个OpenMp并行区域,我希望在该区域内访问存储在派生类型向量中的数据(whis具有不同类型的可分配字段)

每个线程在这个向量中只处理一个位置,因此我希望向量具有“共享”属性


运行代码时,我会遇到一些奇怪的错误,因此我想知道是否可以这样使用派生类型向量?

当然,使用派生类型没有问题:

program derivedtype
   use omp_lib
   implicit none

   integer, parameter :: sz=20

   type mytype1
       integer, dimension(sz) :: a
       real   , dimension(sz) :: b
   end type mytype1

   type mytype2
       integer :: a
       real    :: b
   end type mytype2

   type(mytype1) :: var1
   type(mytype2), dimension(sz) :: var2
   integer:: i
   integer:: isum
   real   :: rsum

   var1%a = 2
   var1%b = 1.
   forall (i=1:sz)
       var2(i)%a = 3
       var2(i)%b = 4.
   endforall

   isum = 0
   rsum = 0.
   print *, var1%a
   print *, var1%b
   print *, [(var2(i)%a, i=1,sz)]
   print *, [(var2(i)%b, i=1,sz)]

!$omp parallel do default(none) shared(var1,var2), reduction(+:rsum), reduction(+:isum)
   do i=1,sz
      isum = isum + var1%a(i) + var2(i)%a
      rsum = rsum + var1%b(i) + var2(i)%b
   enddo

   print *,'isum = ', isum
   print *,'rsum = ', rsum
end program derivedtype
问题可能与可分配的部分有关,这有点微妙;OpenMP3.0并没有真正处理带有可分配组件的派生类型,我也不清楚3.1对这一问题的看法。但除此之外,OpenMP中的可分配项也有可能出错——C和指针也会出现同样的问题。你能给我们举一个例子说明什么是失败的吗