OpenMP 减少用户定义的包含可分配数组的 Fortran 类型

OpenMP reduction on user defined Fortran type containing allocatable array

我想对用户定义的 Fortran 类型执行 OpenMP 缩减。我知道 OpenMP 不支持归约子句中的 Fortran 类型,但可以定义 自己的减持。这是在以下示例中完成的。这也有效并且做它是什么 预计

 module types 
  !!! your type this can contain scalars and arrays
  type my_type
    Real*8,allocatable,dimension( : )  ::x
  end type

  !!! makes it possible to use the plus symbol for the reduction staement
  !!! replaces my_add by plus symbol
  interface operator(+)
     module procedure :: my_add
  end interface

 !$omp declare reduction (+ : my_type : omp_out = omp_out + omp_in) initializer (omp_priv = my_type ([0,0,0,0,0,0,0,0,0,0]))

 contains


  function my_add( a1 , a2 )
    type( my_type ),intent( in ) :: a1, a2
    type( my_type )              :: my_add
    my_add%x          =   a1%x + a2%x
    return
  end function my_add
 end module types 






program main
  use types
  use omp_lib
  type(my_type) :: my_var

  ! Initialize the reduction variable before entering the OpenMP region
  Allocate( my_var%x( 1:10 ) )  
  my_var%x = 0d0

  !$omp parallel reduction (+ : my_var) num_threads(4)
    my_var%x = omp_get_thread_num() + 6
    print*,omp_get_thread_num()
  !$omp end parallel

  print *, "sum of x is ", my_var%x
end program

我现在的问题是可分配数组。

因为我将 OpenMP 缩减语句的数组初始值设定项硬编码为 initializer (omp_priv = my_type ([0,0,0,0,0,0,0,0,0,0])) 我必须在那里放 10 个零,因为数组的分配长度为 10。 是否可以使用变量名 N(数组长度)??

在 reduction initializer 子句中,我们对变量的访问受到限制,这使得可变长度的数组构造函数变得困难。但是,我们可以使用 .

的 Fortran 版本

我们可以使用变量omp_orig来引用"storage of the original variable to be reduced":

!$omp declare reduction (+ : my_type : omp_out = omp_out + omp_in) &
!$omp&   initializer (omp_priv=omp_orig)

这里的赋值语句成功分配了每个私有副本的数组组件。