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算术问题
•可分配增强
我希望这能帮助别人