インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
数学関数が正しい結果を提供すべき入力引数のドメインを指定します。
Linux* および macOS*: | -fimf-domain-exclusion=classlist[:funclist] |
Windows*: | /Qimf-domain-exclusion:classlist[:funclist] |
classlist |
次のいずれかです。
|
||||||||||||||||||||||||||||||||||
funclist |
属性が適用される 1 つまたは複数の数学ライブラリー関数のリストです (オプション)。Fortran 標準の数学関数名ではなく、実際の数学ライブラリー名を指定する必要があります。複数の関数を指定する場合は、カンマで区切る必要があります。 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) ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。
Fortran 標準の数学組込み関数名は、数学ライブラリーの数学組込み関数名と異なります。該当する Fortran 数学関数に対応する、生成された実際の数学ライブラリー名を見つける必要があります。
この 1 つの方法として、/Fa または /S (Windows*) あるいは -S (Linux*) オプションを指定して、アセンブリー・コードを生成します。アセンブリー・コードで実際の数学ライブラリー名を確認できます。
例えば、SIN(x) を呼び出すプログラムを作成し、x を REAL(KIND=4) として宣言して、/S (Windows*) を指定してプログラムのアセンブリー・コードを生成すると、アセンブリー・コードで sinf の呼び出しを確認できます。
この場合、単精度の正弦関数の入力引数のドメインを指定するには、-fimf-domain-exclusion=sinf (または /Qimf-domain-exclusion:sinf) と指定します。
なし
次の単精度の 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 |