Fortran OpenMP将在哪里分配数组

我有一个关于Fortran-OpenMP和可分配数组的问题。 很简单:空间将分配在哪里? 如果我有类似的东西

!$omp parallel default(shared) private(arr)
!$omp critical
  allocate( arr(BIGNUMBER) )
!$omp end critical

!do calculations with many arr accesses

!$omp critical
  deallocate( arr )
!$omp end critical
!$omp end parallel

将该空间分配在堆栈上还是堆上? 如果它在堆上,上面的代码和类似的东西有区别

allocate( arr(BIGNUMBER, nThread) )
!$omp parallel default(shared) private(localArr)
  iThread = omp_get_thread_num()

  localArr => arr(:, iThread)

  !do calculations with many localArr accesses
!$omp end parallel

deallocate( arr )
  • 在第一个代码中,有两个关键区域。 我认为,他们会放慢执行速度,不能很好地扩展。 (我实际上不确定是否可以忽略它们,因为分配是线程保存?)但是如果数组在堆栈上分配,那么它应该更快,因为访问速度更快。
  • 在第二个代码中,我肯定会在堆上有这个数组,这是较慢的访问。 但是,如果第一个代码中的数组也分配在堆上,那么我将保存关键的参数+它只有一个分配/释放。 应该更快?
  • 阵列的大小是否在这个方面起作用?
  • 如果它是在堆上分配的,有没有办法强制在堆栈上分配?
  • 简单的问题基本上是:这似乎是问题的最佳解决方案?


    OpenMP倾向于在堆栈上分配自动变量(包括数组)。 当你做明确的分配时,我会假设它们将被分配到堆上,但是请注意,Fortran标准根本不会谈论堆栈或堆,它取决于编译器。 在前。 编号1我会离开关键部分,因为您正在分配私有变量。 关于大小,由于自动数组太大,有时会出现堆栈溢出,但这可能不是您的情况。 什么是我不知道的最快方法。

    编辑:这个程序似乎在堆上分配数组

    integer,parameter :: BIGNUMBER = 100000000
    real,dimension(:),allocatable :: arr
    
    !$omp parallel default(shared) private(Arr)
    allocate( arr(BIGNUMBER) )
      iThread = omp_get_thread_num()
    
      arr = 5
    
      print *, arr
    
    deallocate( arr )
    !$omp end parallel
    
    
    end
    

    和这个在堆栈上(它失败)

    integer,parameter :: BIGNUMBER = 100000000
    real arr(BIGNUMBER)
    
    !$omp parallel default(shared) private(Arr)
      iThread = omp_get_thread_num()
    
      arr = 5
    
      print *, arr
    
    !$omp end parallel
    
    
    end
    

    好的,弗拉基米尔说大部分我会说的话(标准中没有提到,这完全取决于实施,为什么你要使用批评来保护你的私生子?)

    但是......你给人的印象是,你认为在堆栈上分配的内存访问速度比在堆上快。 在任何典型的实现中,情况并非如此 - 访问时间是相同的。 在堆栈上分配内存通常比在堆上分配更快,但一旦分配了访问它的时间是相同的。 所以我会削减关键因素并且走第一条路线 - 这很简单,保持私密性好,指针不好,如果内存分配时间是限制步骤,那么在并行区域中几乎可以肯定没有足够的工作来进行并行化这是值得的。

    链接地址: http://www.djcxy.com/p/13899.html

    上一篇: Fortran OpenMP where will the array be allocated

    下一篇: How to ensure a dynamically allocated array is private in openmp