これは答えるのに経験が必要なので、どんな教科書にもそれはありません。私は現在、コードのテスト/検証/バグのハンティングを行って本番環境に移行する段階にあります。暗い側面。
デバッグ目的でFortran用にプログラムをコンパイルするときに、どのようなフラグを設定しますか?
本番システムにはどのようなフラグを設定しますか?
展開する前に何をしますか?
製品版ではifort
をコンパイラとして使用していますが、テストはgfortran
を使用して行っています。私はそれを間違っていますか?
-Og
/ -O0
-O0
は、基本的にコンパイラーに最適化を行わないように指示します。オプティマイザーは、一部のローカル変数を削除したり、一部のコードブロックをマージしたりすることができ、結果としてデバッグを予測不能にする可能性があります。 -O0
オプションの価格は非常に遅いコードの実行ですが、バージョン4.8以降のGCCコンパイラ(Fortranコンパイラを含む)は新しく導入されたものを受け入れます最適化レベル-Og
:
-Og
デバッグエクスペリエンスを最適化します。 -Ogは、デバッグを妨げない最適化を有効にします。これは、標準の編集-コンパイル-デバッグサイクルに最適な最適化レベルであり、高速なコンパイルと優れたデバッグエクスペリエンスを維持しながら、妥当なレベルの最適化を提供します。
したがって、可能であれば-Og
を使用し、そうでない場合は-O0
を使用してください。
-g
このオプションは、対話型デバッガー(GDB)で使用するためのデバッグ情報を生成するようコンパイラーに要求することで、実際にデバッグを可能にします。
それらはたくさんあります。私の意見では最も有用です:
-Wall
「一部のユーザーが疑わしいと考える構造に関するすべての警告を有効にし、マクロと組み合わせても、簡単に回避(または変更して警告を回避)できます。」
-Wextra
「-Wallで有効になっていない追加の警告フラグを有効にします。」
-pedantic
gfortranでサポートされているが、公式のFortran 95標準には含まれていない言語機能に関する警告を生成します。警告がエラーになるようにするには、さらに「細かく」し、 -std=f95
フラグを使用することができます。
-fimplicit-none
"明示的なIMPLICITステートメントでオーバーライドされない限り、暗黙の型指定が許可されないことを指定します。これは、暗黙のnoneをすべてのプロシージャの先頭に追加するのと同じです。"
-fcheck=all
「ランタイムテストを有効にする」。たとえば、配列の境界チェックなど。
-fbacktrace
"ランタイムエラーが発生したとき、または致命的な信号が発生したときに(セグメンテーション違反、不正な命令、バスエラーまたは浮動小数点例外)、Fortranランタイムライブラリがエラーのバックトレースを出力します。」
デバッグには-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace
を使用します。まだ説明されていないものについては、gfortranのマニュアルを確認してください。 -fcheck=all
には-fcheck=bounds
が含まれます。
本番環境では-O3 -march=native -fimplicit-none -Wall -Wline-truncation -fwhole-file -std=f2008
を使用します。境界チェックなどのランタイムチェックは、結果の実行可能ファイルの実行時間を増加させます。コストは驚くほど低いことがよくありますが、高くなることもあります。したがって、本番環境でのコンパイル時のランタイムチェックはありません。