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

时间:2015-05-20 17:17:45

标签: 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, 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会显示出所需的行为。

1 个答案:

答案 0 :(得分:0)

与此同时,我发现了bug report这个行为。事实证明,即使OpenMP 4.0也不支持可分配组件的Fortran2003功能。

  

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

     

•Fortran 2003第14节中涵盖的IEEE算术问题

     

•可分配增强

我希望这有助于其他人。