浮動小数点の最適化

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

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

インテル・コンパイラーでは、-fp-model (Linux* および Mac OS*) オプションや /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

安全

変化あり
ソース
倍精度
拡張

X

X

strict

安全

変化あり

X

fast=1 (デフォルト)

安全ではない

不明

X

X

fast=2

非常に安全ではない

不明

X

X

except
except-

影響なし
影響なし

影響なし
影響なし

影響なし
影響なし

影響なし
影響なし


X

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

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