2016-05-23 10 views
0

私はGNU FortranコンパイラでEclipseを使用して、行列の問題を解決するために大きな配列を計算しています。しかし、私は読んで、配列に私のすべてのデータを読み込むことができないことに気付きました。私のコンパイラ設定に-fopenmpを呼び出すと、私のproject.exeがクラッシュする原因になります。そうでなければ、プログラムは正常に動作します。その周りに解決策を見つけるために私の探求でEclipse上のFortran Openmp大規模配列。プログラムクラッシュ

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 

、私は、最も可能性の高い原因は、私はあまりまたは26561に等しいにnz_numを設定した場合という事実によって見ることができるスタックサイズの上限である発見しましたプログラムは正常に実行されます。可能な解決策は、stacksizeを増やすために環境変数を設定することですが、プログラムに "setenv"または "export" OMP_STACKSIZEを入力するとプログラムは認識しません。私は何か間違っているのですか?この問題をどのように解決できるかについてのアドバイスはありますか?

ありがとうございます!

+1

関連する質問のみを検索してください。この問題は、定期的な間隔で再び戻ってきています。 –

+0

'OMP_STACKSIZE'はメインスレッドのスタックに影響しません。 'ulimit -s ...'はそうです。 –

+0

@HristoIliev私はあなたのソリューションを試しましたが、それらはすべてohmのものとは違って動作しませんでした – ceeely

答えて

1

あなたが最初の場所でスタック領域が不足している理由であるスタック、上arhsiajaを割り当てています。あなたが割り当て可能として宣言(それらがスタックに割り当てられることが原因)を直接特定のサイズのあなたの4つの配列を宣言する代わりに

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!それがその問題を解決します。スタックサイズの問題になる可能性のある他の方法を考えていました。割り当てソリューションをありがとう。 – ceeely

+0

心配しないと、うれしく思います;) –

+1

逆に、OpenMPにはたくさんのことがあります。ほとんどのFortranコンパイラは、大きな配列の自動ヒープ割り当てを実装しています。実際のOpenMPディレクティブが存在しない場合でも、OpenMPが有効になるとその機能は無効になります。 –

関連する問題