2016-05-23 2 views
0

Я использую Eclipse с компилятором GNU Fortran для вычисления больших массивов для решения проблемы с матрицей. Тем не менее, я прочитал и заметил, что я не могу прочитать все свои данные в массиве, что приводит к сбою моего project.exe при вызове -fopenmp в мои настройки компилятора; в противном случае программа работает нормально.Большой массив Fortran Openmp на Eclipse; Program Crash

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» или «export» OMP_STACKSIZE в программу. Я делаю что-то неправильно? Есть ли какие-либо рекомендации относительно того, как я могу решить эту проблему?

Спасибо!

+1

Просто найдите соответствующие вопросы. Эта проблема возвращается снова через регулярные промежутки времени. –

+0

'OMP_STACKSIZE' не влияет на стек основного потока. 'ulimit -s ...' делает. –

+0

@HristoIliev Я пробовал ваши решения, и все они не работали в отличие от ohm's – ceeely

ответ

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) 

Вместо того, чтобы сразу объявить свой четыре массива определенного размера (в результате чего они будут выделены в стеке) вы объявите их как размещаемые и дать форму массивы. Далее вниз вы можете распределить свои массивы по размеру, который вы хотите. Этот размер можно выбрать во время выполнения. Это означает, что если вы читаете свои массивы из файла, вы также можете сохранить размер массивов в начале файла и использовать его для вашего вызова выделения. Наконец, как всегда с динамически распределенной памятью, не забудьте освободить их, когда они вам больше не понадобятся.

Редактировать: И я забыл сказать, что это действительно не имеет ничего общего с openmp, за исключением того, что нитки openmp, вероятно, имеют небольшие ограничения размера стека (в этом случае это будет только основной поток openmp).

+0

Ах, спасибо большое, ohm314! Это решает эту проблему. Я думал, что другие способы, которыми я могу пойти, будут проблемой размера стека. Спасибо за решение allocate. – ceeely

+0

Не беспокойтесь, рад, что я мог бы помочь;) –

+1

Напротив, это имеет много общего с OpenMP. Большинство компиляторов Fortran реализуют автоматическое распределение кучи для больших массивов, и эта функция отключается, когда включен OpenMP, даже если нет настоящих директив OpenMP. –

Смежные вопросы