Большой массив Fortran Openmp на Eclipse; Сбой программы
Я использую Eclipse с компилятором GNU Fortran для вычисления больших массивов для решения матричной задачи. Тем не менее, я прочитал и заметил, что я не могу прочитать все мои данные в массив, что вызывает сбой моего project.exe, когда я вызываю -fopenmp в настройках компилятора; в противном случае программа работает нормально.
program Top_tier
integer, parameter:: n=145894, nz_num=4608168
integer ia(n+1), ja(nz_num)
double precision a(nz_num), rhs(n)
integer i
open (21, file='ia.dat')
do i=1, n+1
read(21,*) ia(i)
enddo
close(21)
open (21, file='a.dat')
do i=1, nz_num
read(21,*) a(i)
enddo
close(21)
open (21, file='ja.dat')
do i=1, nz_num
read(21,*) ja(i)
enddo
close(21)
open (21, file='b.dat')
do i=1, n
read(21,*) rhs(i)
enddo
close(21)
End
В своем стремлении найти решение вокруг этого я обнаружил, что наиболее вероятной причиной является ограничение размера стека, которое можно увидеть по тому факту, что если я установлю nz_num меньше или равным 26561, программа будет работать правильно. Возможное решение - установить переменную среды для увеличения размера стека, но программа не распознает, когда я набираю "setenv" или "экспортирую" OMP_STACKSIZE в программу. Я делаю что-то неправильно? Есть какой-нибудь совет, как я могу решить эту проблему?
Спасибо!
1 ответ
Вы размещаете a
, rhs
, ia
ja
в стеке, поэтому вам не хватает места в стеке. Я бы предложил всегда размещать большие массивы в куче:
integer, parameter:: n=145894, nz_num=4608168
integer, dimension(:), allocatable :: ia, ja
double precision, dimension(:), allocatable :: a, rhs
integer i
allocate(ia(n+1), ja(nz_num))
allocate(a(nz_num), rhs(n))
! rest of your code...
deallocate(ia, ja)
deallocate(a, rhs)
Вместо того, чтобы напрямую объявлять ваши четыре массива определенного размера (вызывая их размещение в стеке), вы объявляете их как выделяемые и придаете форму массивам. Затем вы можете расположить массивы под нужный вам размер. Этот размер может быть выбран во время выполнения. Это означает, что если вы читаете свои массивы из файла, вы также можете сохранить размер массивов в начале файла и использовать это для своего вызова allocate. Наконец, как всегда с динамически выделяемой памятью, не забывайте освобождать их, когда они вам больше не нужны.
Изменить: И я забыл сказать, что это на самом деле не имеет ничего общего с openmp, за исключением того, что потоки openmp, вероятно, имеют очень маленькие ограничения размера стека (в этом случае это будет только главный поток openmp).