float 配列に 0.1f を追加すると、0 を追加する場合に比べてパフォーマンスが 10 倍遅くなるのはなぜですか?
パフォーマンスの違いは処理によって生じます。プロセッサによる非正規化 (または非正規化) 浮動小数点数の計算。非正規数はゼロに非常に近い値を表し、パフォーマンスに大きな影響を与える可能性があります。
float 配列に 0.1f を追加すると、元の値が非正規数でなくても、結果が非正規数になることがあります。これは、浮動小数点表現の精度が限られているためです。非正規数に対する演算は、通常、正規化された数値に対する演算よりもはるかに遅くなります。これは、多くのプロセッサが非正規数を直接処理できず、マイクロコードを使用して非正規数を解決する必要があるためです。
対照的に、float 配列に 0 を加算しても、非正規数は生成されません。これは、0 がすでに正規化された数値であるためです。したがって、0 を含む演算はより効率的に実行できます。
非正規数のパフォーマンスへの影響を示すために、次のコードを検討してください。
const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6}; const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812, 1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690}; float y[16]; for (int i = 0; i < 16; i++) { y[i] = x[i]; } for (int j = 0; j < 9000000; j++) { for (int i = 0; i < 16; i++) { y[i] *= x[i]; y[i] /= z[i]; y[i] = y[i] + 0.1f; // <-- y[i] = y[i] - 0.1f; // <-- } }
ここでは、float 配列に 0.1f を追加しています。結果の値は非正規数に変換されるため、速度が大幅に低下します。
非正規数によるパフォーマンスへの影響を回避するには、 _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); は非正規化をゼロにフラッシュするための組み込み関数です。これは、非正規化されるはずの値がゼロに丸められることを意味します。この組み込みを使用すると、浮動小数点配列を操作する際のコードのパフォーマンスを大幅に向上させることができます。
以上がfloat 配列に 0.1f を追加すると、0 を追加するよりも大幅に遅いのはなぜですか? このパフォーマンスの問題はどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。