デノーマル例外の影響の軽減

デノーマル浮動小数点値とは、正規化で表現するには小さすぎる値です。つまり、仮数は左揃えにできません。デノーマル値を処理するには、ハードウェアまたはオペレーティング・システムの介入が必要です。そのため、結果がデノーマル値になる浮動小数点演算はパフォーマンスに影響することがあります。

デノーマル値を処理し、アプリケーションのパフォーマンスを高める方法はいくつかあります。

例えば、大きなスカラー数を掛けて正規数に変換し、正規空間で残りの演算を行った後で、デノーマル範囲に戻す方法があります。小さなデノーマル値がプログラム設計に必要な場合はこの方法を検討してください。

より大きな範囲を持つ高い精度のデータ型を使用する方法もあります。例えば、float として宣言された変数を double として宣言するように変換します。ただし、この変更を加えると、プログラムの遅延を引き起こす可能性があることに注意してください。必要な容量は増え、データのロードと保存により時間がかかります。また、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) およびインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 命令のスループットが悪くなることもあります。

変数の型宣言を変更すると、それがジェネリック型でない限り、関連するライブラリー呼び出しも変えなければならないことがあります (例: cos() の代わりに cosf() など)。デノーマル値を排除することにより得られるパフォーマンス・ゲインが、大きな動的範囲を持つ高い精度のデータ型の使用で発生するオーバーヘッドよりも大きいことを確認する必要があります。

多くの場合、デノーマル値はプログラム結果に大きな影響を与えることなく、ゼロとして安全に扱われます。対象とするアーキテクチャーによって、FTZ (Flush-to-Zero) オプションを使用してください。

関連情報