インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
-fp-model オプション (Linux* および macOS*) または /fp オプション (Windows*) は、浮動小数点データの最適化を制御します。このオプションを使用して、プラットフォーム間や最適化レベルにおいて浮動小数点アプリケーションのパフォーマンス、精度、出力結果の一貫性を調整できます。
デノーマル数のサポートが必要ないアプリケーションでは、-fp-model または /fp オプションを、[Q]ftz オプションにともに使用してデノーマル結果をゼロにフラッシュし、すべてのインテル® アーキテクチャー上でランタイム・パフォーマンスを向上させることができます。
キーワードで、使用するセマンティクスを指定します。このオプションで指定したキーワードによって、呼び出される数学ルーチンの種類が異なることがあります。libirc、libm、および libsvml ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。指定できる値は次のとおりです。
キーワード |
説明 |
---|---|
precise |
浮動小数点データの精度に影響しない最適化を有効にします。 |
fast[=1|2] |
浮動小数点データにより強力な最適化を有効にします。 |
consistent |
異なる最適化レベルや同じアーキテクチャーの異なるプロセッサーで、一貫した再現性のある結果を有効にします。この設定は、次のオプションを指定するのと同じです。 Windows*: /fp:precise /Qfma- /Qimf-arch-consistency:true Linux* および macOS*: -fp-model precise -no-fma -fimf-arch-consistency=true |
strict |
precise と except を有効にし、縮約を無効にし、プラグマ stdc fenv_access を有効にします。 |
source |
中間結果をソースで定義された精度に丸め、精度に影響しない最適化を有効にします。 |
double |
中間結果を 53 ビット (double) 精度まで丸め、精度に影響しない最適化を有効にします。 |
extended |
中間結果を 64 ビット (extended) 精度まで丸め、精度に影響しない最適化を有効にします。 |
[no-]except (Linux* および macOS*) または |
厳密な浮動小数点例外セマンティクスを使用するかどうかを決定します。 |
このオプションのデフォルトは、-fp-model fast=1 または /fp:fast=1 です。コンパイラーは、浮動小数点演算により強力な最適化を使用します。
デフォルトのオプションキーワード -fp-model fast または /fp:fast を使用すると、浮動小数点演算を実装するべくコンパイラーが x87 またはインテル® SSE/AVX 命令を使用するかどうかによって、結果に大きな差異が発生することがあります。別のオプションキーワードを使用する場合、結果はより一定になります。
以下にキーワードの使用方法の例をいくつか示します。例には次の点が含まれます。
ソースコード例
同じソースコードがすべての例で使用されることに注意してください。
ソースコードで浮動小数点演算の解釈に適用されるセマンティクス
コンパイラーによるソースコードの解釈方法
コンパイラーによるソースコードの解釈方法は、複数ある可能性がありますが、例ではその一部を紹介します。
ソースコード例:
例 |
---|
float t0, t1, t2; ... t0 = 4.0f + 0.1f + t1 + t2; |
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
加算は任意の順序で行われます。
中間式は、single、double、extended または double を使用します。
定数の追加により、デフォルトの丸めモードを想定して、事前計算される可能性があります。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
例 |
---|
float t0, t1, t2; ... t0 = (float)((double)t1 + (double)t2) + 4.1f; float t0, t1, t2; ... t0 = (t1 + t2) + 4.1f; float t0, t1, t2; ... t0 = (t1 + 4.1f) + t2; |
この設定は、IA-32 アーキテクチャー・ベースの Linux* システムの -fp-model precise に相当します。
ソースコード例:
float t0, t1, t2; ... t0 = 4.0f + 0.1f + t1 + t2;
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
プログラムの順序で加算が行われます。
中間式は、拡張倍精度を使用します。
定数の追加により、デフォルトの丸めモードを想定して、事前計算される可能性があります。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
float t0, t1, t2; ... t0 = (float)(((long double)4.1 + (long double)t1) + (long double)t2);
これは、インテル® 64 アーキテクチャー・ベース・システムの -fp-model precise または /fp:precise に相当します。
ソースコード例 |
---|
float t0, t1, t2; ... t0 = 4.0f + 0.1f + t1 + t2; |
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
プログラムの順序で加算が行われます。
中間式は、ソースコードで指定された精度、つまり単精度を使用します。
定数の追加により、デフォルトの丸めモードを想定して、事前計算される可能性があります。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
例 |
---|
float t0, t1, t2; ... t0 = ((4.1f + t1) + t2); |
この設定は、IA-32 アーキテクチャー・ベース・システムの -fp-model precise または /fp:precise に相当します。
ソースコード例:
float t0, t1, t2; ... t0 = 4.0f + 0.1f + t1 + t2;
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
プログラムの順序で加算が行われます。
中間式は、倍精度を使用します。
定数の追加により、デフォルトの丸めモードを想定して、事前計算される可能性があります。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
float t0, t1, t2; ... t0 = (float)(((double)4.1 + (double)t1) + (double)t
ソースコード例 |
---|
float t0, t1, t2; ... t0 = 4.0f + 0.1f + t1 + t2; |
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
プログラムの順序で加算が行われます。
式評価では、keyword precise での式評価と一致します。
プログラム実行時にどの丸めモードがアクティブかを指示する方法がないため、定数の追加は、事前計算されません。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
例 |
---|
float t0, t1, t2; ... t0 = (float)((((long double)4.0f + (long double)0.1f) + (long double)t1) + (long double)t2); |