B.2.29 -fsimple[= n]
オプティマイザが浮動小数点演算に関する前提事項を単純化できるようにします。
デフォルトは -fsimple=0 です。-fsimple は -fsimple=1 と同義です。
n を指定する場合、0、1、2 のいずれかにしなければいけません。
表 B–9
-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 命令を使用して縮約を計算できるようにします。
コンパイラは積極的な浮動小数点演算の最適化を試み、この結果、丸めの変化によって、多くのプログラムが異なる数値結果を生じる可能性があります。たとえば、-fsimple2 を指定し、あるループ内に x/y の演算があった場合、x/y がループ内で少なくとも 1 回は必ず評価され、z=1/yで、ループの実行中に y と z が一定の値をとることが明らかである場合、オプティマイザは x/y の演算をすべて x*z で置き換えます。
|
本来浮動小数点例外を発生しないプログラムならば、-fsimple=2 を指定してもオプティマイザが浮動小数点例外を発生させることはありません。
最適化が精度に与える影響の詳細は、『Techniques for Optimizing Applications: High Performance Computing』(Rajat Garg と Ilya Sharapov 著) をお読みください。