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

fimf-domain-exclusion、Qimf-domain-exclusion

数学関数が正しい結果を提供すべき入力引数のドメインを指定します。

構文

Linux* および macOS*:

-fimf-domain-exclusion=classlist[:funclist]

Windows*:

/Qimf-domain-exclusion:classlist[:funclist]

引数

classlist

次のいずれかです。

  • プログラムの正当性に影響することなく、次の 1 つまたは複数の浮動小数点数のクラスを指定して関数ドメインから除外することができます。サポートされているクラス名は次のとおりです。

    extremes

    指定された関数の引数の通常のドメイン範囲内にない値。

    nans

    "x=Nan"。

    infinities

    "x=infinities"。

    denormals

    "x=denormal"。

    zeros

    "x=0"。

    classlist 要素は、2 の累乗に対応します。除外属性は、指定された要素の値 (ビット・マスク) の OR (論理和) になります。

    以下は各 classlist 要素とその値の現在のマッピングです。

    extremes

    1

    nans

    2

    infinities

    4

    denormals

    8

    zeros

    16

    none

    0

    all

    31

    common

    15

    その他の組み合わせ

    指定された値のビット単位の OR (論理和)

    除外するクラスに対応する整数値を指定する必要があります。

    除外されたクラスでは、予期しない結果を引き起こす可能性があることに注意してください。

  • 次のいずれかのトークンを指定して除外することができます。

    none

    サポートされているクラスをすべてドメインから除外しません。このトークンを指定するには、対応する値 0 を使用して -fimf-domain-exclusion=0 (または /Qimf-domain-exclusion:0) のように指定します。

    all

    サポートされているクラスをすべてドメインから除外します。このトークンを指定するには、対応する値 31 を使用して -fimf-domain-exclusion=31 (または /Qimf-domain-exclusion:31) のように指定します。

    common

    extremes、nans、infinities、および denormals を指定した場合と同じです。このトークンを指定するには、対応する値 15 (1 + 2+ 4 + 8) を使用して -fimf-domain-exclusion=15 (または /Qimf-domain-exclusion:15) のように指定します。

funclist

属性が適用される 1 つまたは複数の数学ライブラリー関数のリストです (オプション)。複数の関数を指定する場合は、カンマで区切る必要があります。

sin と sinf のように特定の精度向けのバリエーションは異なる関数と見なされるため、単精度と倍精度の両方の正弦関数で高い精度を指定するには、-fimf-domain-exclusion=4:sin,sinf (または /Qimf-domain-exclusion:4:sin,sinf) を使用する必要があります。

また、単精度除算は /f、倍精度除算は /、拡張精度除算は /l、4 倍精度除算は /q のように、記号を使って指定することもできます。例えば、次のように指定します。

-fimf-domain-exclusion=4 または /Qimf-domain-exclusion:4

-fimf-domain-exclusion=5:/,powf または /Qimf-domain-exclusion:5:/,powf

-fimf-domain-exclusion=23:log,logf,/,sin,cosf または /Qimf-domain-exclusion:23:log,logf,/,sin,cosf

funclist 引数を指定しない場合、すべての数学ライブラリー関数にドメインの制約が適用されます。

デフォルト

0 (ゼロ)

コンパイラーは、数学ライブラリー関数を呼び出すときにデフォルトのヒューリスティックを使用します。

説明

このオプションは、数学関数が正しい結果を提供すべき入力引数のドメインを指定します。funclist で指定した関数が浮動小数点数のクラスの標準に準拠しない結果を生成しても、プログラムが正しく動作することを示します。

このオプションは、実行時のパフォーマンスと結果の精度に影響します。除外されるクラスの数が多いほど、より速いコードシーケンスが使用されます。

特定の数学関数の精度を定義する必要がある場合は、その関数名を指定します。例えば、倍精度の正弦関数の場合は sin、単精度の正弦関数の場合は sinf を指定します。そして、-fimf-domain-exclusion=denormals:sin または /Qimf-domain-exclusion:denormals:sin (倍精度の正弦の場合)、-fimf-domain-exclusion=extremes:sqrtf または /Qimf domain-exclusion:extremes:sqrtf (単精度の平方根の場合) のように指定します。

関数名を指定しない場合、すべての関数 (およびすべての精度) に設定が適用されます。ただし、個々の関数名を指定すると、指定された関数の対応する精度のみに設定が適用されます。例えば、sinf は単精度の正弦関数のみ、sin は倍精度の正弦関数のみ、sinl は拡張精度の正弦関数のみ、というように適用されます。

LIBM (数学ライブラリー) および SVML (Short Vector Math Library) ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。

IDE オプション

なし

代替オプション

なし

次の単精度の exp2f 関数について考えてみます。

演算 y = exp2f(x)
精度 1.014 ulp
命令数 4 (修正なしの場合は 2)

以下は、修正なしの 2 命令のシーケンスです。

vcvtfxpntps2dq  zmm1 {k1}, zmm0, 0x50      // zmm1 <-- rndToInt(2^24 * x)
vexp223ps       zmm1 {k1}, zmm1            // zmm1 <-- exp2(x)

上記の 2 命令のシーケンスは NaN を正しく処理しません。 NaN を正しく処理するため、次の修正を含める必要があります。

vpxord          zmm2, zmm2, zmm2             // zmm2 <-- 0
vfixupnanps     zmm1 {k1}, zmm0, zmm2 {aaaa} // zmm1 <-- QNaN(x) (x が NaN <F> の場合)

vfixupnanps 命令を含めない場合、NaN 値を除くすべての引数は正しく処理されます。例えば、次のオプションは 2 命令のシーケンスを生成します。

-fimf-domain-exclusion=2:exp2f      <- NaN を除外 (2 は NaNs に対応する値)
-fimf-domain-exclusion=6:exp2f      <- NaN と infinities を除外 (4 は infinities に対応する値、2 + 4 = 6)
-fimf-domain-exclusion=7:exp2f      <- NaN、infinities、extremes を除外 (1 は extremes に対応する値、2 + 4 + 1 = 7)
-fimf-domain-exclusion=15:exp2f     <- NaN、infinities、extremes、denormals を除外 (8 は denormals に対応する値、2 + 4 + 1 + 8=15)

vfixupnanps 命令を含める場合、NaN 値を含むすべての引数が正しく処理されます。例えば、次のオプションは 4 命令のシーケンスを生成します。

-fimf-domain-exclusion=1:exp2f      <- extremes のみ除外 (1 は extremes に対応する値)
-fimf-domain-exclusion=4:exp2f      <- infinities のみ除外 (4 は infinities に対応する値)
-fimf-domain-exclusion=8:exp2f      <- denormals のみ除外 (8 は denormals に対応する値)
-fimf-domain-exclusion=13:exp2f     <- extremes、infinities、denormals のみ除外 (1 + 4 + 8 = 13)

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804

関連情報