Большой массив 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, iaja в стеке, поэтому вам не хватает места в стеке. Я бы предложил всегда размещать большие массивы в куче:

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).

Другие вопросы по тегам