Компиляторы Fortran с OpenMP обычно выделяют автоматическую переменную (включая массивы) в стеке. Когда вы делаете явное распределение I, они будут размещаться в куче, но обратите внимание, что стандарт 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