ホームページ > バックエンド開発 > C++ > float 配列に 0.1f を追加すると、0 を追加するよりも大幅に遅いのはなぜですか? このパフォーマンスの問題はどのように解決できるのでしょうか?

float 配列に 0.1f を追加すると、0 を追加するよりも大幅に遅いのはなぜですか? このパフォーマンスの問題はどのように解決できるのでしょうか?

Susan Sarandon
リリース: 2024-12-19 13:10:10
オリジナル
520 人が閲覧しました

Why is adding 0.1f to a float array significantly slower than adding 0, and how can this performance issue be addressed?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート