Gcc 将阵列作为派生数据类型的一部分与OpenMP一起分配

Gcc 将阵列作为派生数据类型的一部分与OpenMP一起分配,gcc,parallel-processing,openmp,Gcc,Parallel Processing,Openmp,在下面的示例中,我在并行块内部和外部分别分配一个数组(作为派生数据类型的一部分)。由于此阵列使用的是private,因此这两种方法都应根据OpenMP 3.0规范(我使用gcc-4.6.3编译) 在当前变体中,allocate应该是线程安全的。但是在运行时,我得到了保留一个已经保留的变量的错误 module Example_mod contains subroutine unter(n1,n2) implicit none type daten real, al

在下面的示例中,我在并行块内部和外部分别分配一个数组(作为派生数据类型的一部分)。由于此阵列使用的是
private
,因此这两种方法都应根据OpenMP 3.0规范(我使用gcc-4.6.3编译)

在当前变体中,
allocate
应该是线程安全的。但是在运行时,我得到了保留一个已经保留的变量的错误

module Example_mod
contains
  subroutine unter(n1,n2)
    implicit none
    type daten
       real, allocatable, dimension(:,:)::x
       integer::n1,n2
    end type daten
    integer, intent (in)::n1,n2
    integer l
    real,dimension(4)::ausgabe 
    type(daten)::xs

    ! initializing xs: 
    ! xs%n1 = n1
    ! xs%n2 = n2
    ! allocate(xs%x(n1,n2))  
    ! xs%x = 1.1

    !$omp parallel private(xs)
    xs%n1 = n1
    xs%n2 = n2
    allocate(xs%x(n1,n2))  
    xs%x = 1.1

    !$OMP DO
    do l = 1, 4
       xs%x = l**2
       ausgabe(l) = sum(xs%x)
    enddo
    !$omp end DO
    deallocate(xs%x)
    !$OMP end parallel
    ! deallocate(xs%x)
    write(*,*) ausgabe
  end subroutine unter
end module Example_mod

program main
  use Example_mod
  call unter(10,12)
end program main
在另一个变体中(取消对
!初始化xs:
后的4行的注释,并在
并行块中对这些行进行注释),
xs
到每个线程的副本的维度和分配状态应该继承自原始
xs
。但是在运行时,我得到了一个分段错误,根据
gdb
输入
PARALLEL
部分


我用
gfortran-g-fopenmp
编译。省略
-fopenmp
会显示所需的行为。

同时,我发现了一个关于这种行为的正确答案。事实证明,即使OpenMP 4.0也不支持可分配组件的Fortran2003功能

本OpenMP API规范将ISO/IEC 1539-1:2004称为Fortran 2003。不支持以下功能:

•Fortran 2003第14节中涉及的IEEE算术问题

•可分配增强

我希望这能帮助别人