2

ifort で -O0 を付けてコンパイルすると、プログラムは正しく実行できます。しかし、最適化オプション (-O、-O3、-fast など) を開いている限り、SIGSEGV セグメンテーション エラーが発生します。

このエラーは、maketable() という名前のサブルーチンで発生しました。そして以下は現象です:

(1) このサブルーチンで fftw ライブラリを呼び出します。fftwの文章にコメントしてくれればOKです。しかし、このコードの他の場所でも fftw を使用しているので、fftw のせいではないと思います。

(2) fftw はループ内で呼び出され、プログラムがクラッシュしたときにループが数回実行される可能性があります。ループに入った最初の時点ではセグメンテーション違反は発生しません。

(3) スタックオーバーフローも考えましたが、今は考えていません。私はずっと前に他の人がコンパイルした実行可能ファイルを持っています。それは私のコンピューターで実行できます。システムスタックオーバーフローが原因ではないことを示唆していると思います。

ifort のバージョンは 10.0、fftw のバージョンは fftw-2.1.5 です。CPUタイプはIntel Xeon 5130です。どうもありがとう。

4

1 に答える 1

2

Fortran プログラムでセグメンテーション違反が発生する一般的な原因は 2 つあります。

  1. 配列の境界外の要素にアクセスしようとしています。
  2. プロシージャー呼び出しでの実引数と仮引数の不一致。

どちらも比較的簡単に見つけることができます。

  1. コンパイラには、実行時に配列境界チェックを実行するコードを生成するオプションがあります。コンパイラのドキュメントを確認し、コードを再構築して再実行してください。これが問題の原因である場合は、コードのどこが間違っているかを示すエラー メッセージが表示されます。
  2. プログラム内のサブルーチンと関数の明示的なインターフェイスをプログラムするか、モジュールを使用してコンパイラがそのようなインターフェイスを生成するようにするか、コンパイラ オプション (ドキュメントを参照) を使用してコンパイル時に引数の型が一致することを確認します。

最適化を高くした場合にのみ、このようなエラーが発生する (ように思われる) ことは珍しくありません。

編集

最適化によってエラーが発生することを示唆しているわけではありませんが、エラーがプログラムの実行に影響を与えて明らかになることに注意してください。

間違ったプログラムが何回も実行されることはよく知られています。たとえば、毎回クラッシュする実行可能ファイルを作成するために新しいバージョンのコンパイラで再コンパイルするだけです。

セグメンテーション違反が発生しているように見えるサブルーチンに対してのみ最適化をオフにしたいというあなたの希望は、完全に間違っていると思います。私は自分のプログラムがどのレベルの最適化でも正しく実行されることを期待しています (コンパイラのバグの明確な証拠を除いて、そのようなことは不明ではありません)。最適化をオフにすることで、いわばプログラムの実際の問題をカーペットの下に一掃していると思います。

于 2013-01-21T22:14:01.533 に答える