c言語で書かれたプログラムがあり、Nの値に合わせて様々な処理を行うのですが、Nの値がある大きさ以上になると、セグメンテーション違反が出てしまい実行できません。
その対策として、コンパイルする際にオプション-mcmodel=mediumをつけるとうまくできていたのですが、N=55000以上になるとまたエラーが出てしまいます。
最大でNを150000まで増やす予定なのですが、どうすればよろしいでしょうか。
また、不明な点や必要な情報がありましたらお聞きください。宜しくお願い致します。
追記2018/10/26
様々なアドバイスどうもありがとうございます。
ttyp03さんに計算していただき96GBはかなり無駄が多いと感じ、プログラムの構造を考え直していました。
何名かの方も指摘してくださっていますが、なぜそんなに配列が必要かというと
まず、三次元のデータが150000個あります。
それぞれの点の距離を計算し、ある半径内に含まれる点のペアを作成し、それらの距離を規格化し次の処理を行います。
その際に、それぞれの距離を格納しておくためにNの二乗分の配列が必要になっています。
C
1N =55000以上でエラー 2 3double a[N][N]; 4double b[N][N][3]; 5double c[N]; 6 7int d[N][6]; 8int e[N]; 9int f[N]; 10int g[N]; 11 12double h[N][3]; 13double i[N][3]; 14double j[N][3]; 15. 16. 17. 18.
ヘッダファイルは最初のmain関数でのみ呼び出しており、複数回読み込んではいませんでした。
配列数 doubleの数 12100550000 intの数 495000 double及びintの数 12101045000 double a[N][N];(3025000000) double b[N][N][3];(9075000000) double c[N];(55000) int d[N][6];(330000) int e[N];(55000) int f[N];(55000) int g[N];(55000) double h[N][3];(165000) double i[N][3];(165000) double j[N][3];(165000)
gdbで確認してみると、以下のようなメッセージが出ています。
gdb
1During startup program terminated with signal SIGSEGV, Segmentation fault.
回答5件
あなたの回答
tips
プレビュー