Cab*_*ath 3 arrays fortran heap-memory openmp stack-memory
我有一个关于 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
Run Code Online (Sandbox Code Playgroud)
空间是分配在栈上还是堆上?如果它在堆上,上面的代码和类似的代码之间有区别吗
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 )
Run Code Online (Sandbox Code Playgroud)
简短的问题基本上是:哪一个似乎是问题的最佳解决方案?
使用 OpenMP 的 Fortran 编译器倾向于在堆栈上分配自动变量(包括数组)。当你进行显式分配时,它们将在堆上分配,但请注意,Fortran 标准根本不谈论堆栈或堆,这取决于编译器。在前。第 1 我会忽略关键部分,因为您正在分配私有变量。关于大小,有时会由于自动数组太大而导致堆栈溢出,但这可能不是您的情况。我不知道最快的方法是什么。
该程序在我的编译器中的堆上分配数组
integer,parameter :: BIGNUMBER = 100000000
real,dimension(:),allocatable :: arr
allocate( arr(BIGNUMBER) )
!$omp parallel default(shared) private(Arr)
iThread = omp_get_thread_num()
arr = 5
print *, arr
!$omp end parallel
deallocate( arr )
end
Run Code Online (Sandbox Code Playgroud)
和这个在堆栈上(然后它崩溃了)
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
Run Code Online (Sandbox Code Playgroud)