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