インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

浮動小数点の最適化

アプリケーションのパフォーマンス向上は、たとえデフォルトの最適化レベルであっても、インテル® C++ コンパイラーの重要な目的です。多くの最適化で、コンパイル時の定数式の評価、ループからの不変式のホイスティング、式評価の順序の変更など、アプリケーションの浮動小数点動作に影響を与える変換が行われます。このような最適化処理は通常、コンパイラーが、可能な限り最も効率の良いコードを生成するのに役立ちます。しかし、最適化はアプリケーションの浮動小数点の要件に反することがあります。

いくつかの最適化は、C および C++ の ANSI 規格や ISO 規格の厳密な解釈とは一致していません。このような最適化処理は、丸めによる差異や若干の変異により、ANSI 準拠の結果とは精度が異なる浮動小数点結果になる場合があります。

インテル® Fortran コンパイラーでは、-fp-model オプション (Linux* および macOS*) や /fp オプション (Windows*) が提供されており、アプリケーションをビルドする際に実行する最適化を制御することができます。このオプションにより、次のコンパイラー規則を指定することが可能です。

double a=1.5; int x=0; ... 
  __try {
    int t0=a; // raises inexact
    x=1;
    a*=2; 
  } __except(1) {
  printf("SEH Exception: x=%d\n", x); 
}

厳密な浮動小数点例外を指定しない場合、結果は SEH Exception: x=1 です。厳密な浮動小数点例外を指定する場合、結果は SEH Exception: x=0 です。

次の表は、コンパイラー規則と最適化におけるさまざまなオプションのキーワードの影響を説明しています。

キーワード

安全な値

浮動小数点式の評価

浮動小数点の縮約

浮動小数点環境アクセス

厳密な浮動小数点例外

precise
source
double
extended

安全

それぞれ異なる
ソース
倍精度
拡張

×

×

strict

安全

それぞれ異なる

×

consistent

安全

それぞれ異なる

×

×

×

fast=1 (デフォルト)

安全ではない

不明

×

×

fast=2

危険

不明

×

×

except
except-

影響なし
影響なし

影響なし
影響なし

影響なし
影響なし

影響なし
影響なし


×

except キーワードを Unsafe モードで指定するのは不正です。

アプリケーションの目的に応じて、さまざまなコンパイラー・オプションとキーワードのセットを選択して、特定の最適化を有効または無効にし、望ましい結果を得るようにできます。

関連情報