3

数値プログラミングに安全に使用できる gcc コンパイラ オプションはどれですか?

gcc の最適化を有効にする簡単な方法は-0#、コンパイラ オプションに追加することです。と言いたくなる-O3-O3ただし、このオプションが含まれると数値計算の結果が異なる可能性があるという意味で保存されない最適化が含まれていることは知っています。アルゴリズムが安定している場合、結果の小さな変化は重要ではない場合があります。一方、特定の数学演算では精度が問題になる可能性があるため、数学の最適化は大きな影響を与える可能性があります。

デバッグの過程でコンパイラに依存する問題を考慮するのは不便だと思います。つまり、コンパイラが内部的に最適化を変更したため、コードの小さな変更が大幅に異なる動作につながるかどうか疑問に思いたくありません。

コード内で決定論的 (したがって制御可能) な動作が必要な場合、追加しても安全なオプションはどれですか? ほぼ安全なものはどれですか?つまり、パフォーマンス上の利点と比較して、わずかな不確実性しか引き起こさないオプションはどれですか?

私は次のようなオプションを考えています:-finline -finline-limit=2000関数が長くても関数をインライン化します。

4

1 に答える 1

7

-O3数値的に安全でない最適化を含むというのは正しくありません。マニュアルによると、 に-O3は、 と比較して次の最適化パスが含まれています-O2

-finline-functions-funswitch-loops-fpredictive-commoning-fgcse-after-reload-ftree-vectorizeおよび-fipa-cp-clone

を参照している可能性があり-ffast-mathます。-Ofast-O3

-ffast-math-fno-math-errno-funsafe-math-optimizations-ffinite-math-only-fno-rounding-math-fno-signaling-nansおよび を設定し-fcx-limited-rangeます。このオプションにより、プリプロセッサ マクロ__FAST_MATH__が定義されます。

このオプションは、数学関数の IEEE または ISO ルール/仕様の正確な実装に依存するプログラムの出力が正しくない可能性があるため、それ以外のオプションによってオンにされることはありません。-O-Ofastただし、これらの仕様の保証を必要としないプログラムでは、より高速なコードが生成される場合があります。

つまり、-O-O2、およびのすべてが-O3数値プログラミングに対して安全です。

于 2012-11-22T22:28:39.810 に答える