B.2.26 -fsimple[= n]
オプティマイザが浮動小数点演算に関する前提事項を単純化できるようにします。
デフォルトは -fsimple=0 です。-fsimple は -fsimple=1 と同義です。
n を指定する場合、0、1、2 のいずれかにしなげればいけません。
表 B–8
-fsimple のフラグ
|
値
|
意味
|
|
-fsimple=0
|
前提事項の単純化を行えないようにします。IEEE 754 に厳密に準拠します。
|
|
-fsimple=1
|
適度の単純化を行えるようにします。生成されるコードは IEEE 754 に厳密には準拠していませんが、大半のプログラムの数値結果は変わりありません。
-fsimple=1 の場合、次に示す内容を前提とした最適化が行われます。
-
IEEE 754 のデフォルトの丸めとトラップモードは、プロセスの初期化後は変化しない。
-
浮動小数点例外以外には、目に見える結果が生じない演算は削除できる。
-
オペランドに無限または NaN を持つ演算は、その結果に NaN を伝達する必要はない。 たとえば、x*0 は 0 で置き換えられる。
-
演算はゼロの符号を区別しない。
-fsimple=1 を指定した場合は、オプティマイザは必ず四捨五入または例外に応じた最適化を行います。特に、浮動小数点演算を、実行時に一定に保たれる丸めモードにおいて異なる結果を生成する浮動小数点演算と置き換えることはできません。
|
|
-fsimple=2
|
-fsimple=1 のすべての機能が含まれ、-xvector=simd が有効な場合に、SIMD
命令を使用して縮約を計算できるようにします。
コンパイラは積極的な浮動小数点演算の最適化を試み、この結果、丸めの変化によって、多くのプログラムが異なる数値結果を生じる可能性があります。たとえば、あるループ内に x/y の演算があった 場合、x/y がループ内で少なくとも 1 回は必ず評価され、z=1/y で、ループの実行中に y と z が一定の値をとることが明らかである
場合、オプティマイザは x/y の演算をすべて x*z で置き換えます。
|
本来浮動小数点例外を発生しないプログラムならば、-fsimple=2 を指定してもオプティマイザが浮動小数点例外を発生させることはありません。
最適化が精度に与える影響の詳細は、Rajat Garg、Ilya Sharapov 共著の『Techniques for
Optimizing Applications:High Performance Computing 』をお読みください。