パフォーマンスに対する非正規浮動小数点数の影響
提供されたコード スニペットでは、重要ではないと思われる小さな変更がパフォーマンスに大きな影響を与えました。 0.1f から 0 にすると 10 倍の速度低下が発生しました。このパフォーマンスの違いは、非正規化 (非正規化) 浮動小数点数の処理によって生じます。
非正規数はゼロの近似値であり、表現できる最小の正規浮動小数点数よりも小さくなります。多くの場合、これらは非常に小さな値を生成する操作によって発生します。非正規数の演算は、正規化された浮動小数点数の演算に比べて遅いことで有名です。これは、多くのプロセッサには非正規数を直接処理する能力がなく、代わりに低速のマイクロコード ルーチンに頼らなければならないためです。
数値検査
2 つのコード スニペット (1 つは 0.1 を使用) f と 0 を使用するもう 1 つは、反復を繰り返した後に異なる出力を生成します。 0.1f を使用すると、値はゼロに近い非ゼロ値に収束します。ただし、0 を使用すると、値は 0 自体に収束します。この数値動作の違いは、パフォーマンスのギャップを説明します。
非正規化フラッシング
非正規数がパフォーマンスの差異の原因であることを確認するには、以下を追加することで非正規数をゼロにフラッシュできます。コードの先頭に次の行を追加します:
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
これは、すべての非正規数をゼロとして扱うようにプロセッサに指示します。この変更により、0.1f を使用した場合と 0 を使用した場合のパフォーマンスの違いは無視できる程度になります。これにより、非正規数が実際に速度低下の原因であることが確認されます。
結論
このシナリオでは、0.1f を 0 に置き換えることによって非正規数の作成を回避すると、劇的に改善されます。プロセッサが低速の非正規数処理ルーチンを実行するのを防ぐことで、パフォーマンスを向上させます。この最適化は、非正規化浮動小数点数がパフォーマンスに与える時々の悪影響と、数値計算における非正規化浮動小数点数の潜在的な存在を考慮することの重要性を思い出させるものです。
以上が0.1f を 0 に置き換えると、コードのパフォーマンスが 10 倍向上するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。