在下面的示例中,我在并行块内部分配一个数组(作为派生数据类型的一部分),并在其外部分配一次。由于此数组使用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
在另一个变体中(取消注释! initializing xs:
后面的4行并在PARALLEL
块中注释这些行),每个线程的xs
副本的维度和分配状态应该已从原始xs
继承。但是在运行时,根据gdb
进入PARALLEL
部分时,我会遇到分段错误。
我用gfortran -g -fopenmp <filename>
编译。省略-fopenmp
会显示出所需的行为。
答案 0 :(得分:0)
与此同时,我发现了bug report这个行为。事实证明,即使OpenMP 4.0也不支持可分配组件的Fortran2003功能。
此OpenMP API规范将ISO / IEC 1539-1:2004称为Fortran 2003.不支持以下功能:
•Fortran 2003第14节中涵盖的IEEE算术问题
•可分配增强
我希望这有助于其他人。