Maison > développement back-end > C++ > Pourquoi l'ajout de 0,1f à un tableau float est-il significativement plus lent que l'ajout de 0, et comment ce problème de performances peut-il être résolu ?

Pourquoi l'ajout de 0,1f à un tableau float est-il significativement plus lent que l'ajout de 0, et comment ce problème de performances peut-il être résolu ?

Susan Sarandon
Libérer: 2024-12-19 13:10:10
original
503 Les gens l'ont consulté

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

Pourquoi l'ajout de 0,1f à un tableau flottant ralentit-il les performances de 10 fois par rapport à l'ajout de 0 ?

La différence de performances provient de la manipulation de nombres à virgule flottante dénormaux (ou subnormaux) par les processeurs. Les nombres dénormaux représentent des valeurs très proches de zéro, ce qui peut avoir un impact significatif sur les performances.

Lorsque vous ajoutez 0,1f à un tableau flottant, le résultat peut être un nombre dénormal, même si les valeurs d'origine ne l'étaient pas. Cela est dû à la précision limitée de la représentation à virgule flottante. Les opérations sur les nombres dénormaux sont généralement beaucoup plus lentes que sur les nombres normalisés car de nombreux processeurs ne peuvent pas les gérer directement et doivent les résoudre à l'aide d'un microcode.

En revanche, ajouter 0 à un tableau flottant ne produit pas de nombres dénormaux. C'est parce que 0 est déjà un nombre normalisé. Par conséquent, les opérations impliquant 0 peuvent être effectuées beaucoup plus efficacement.

Pour démontrer l'impact sur les performances des nombres dénormaux, considérons le code suivant :

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; // <--
    }
}
Copier après la connexion

Ici, en ajoutant 0,1f au tableau float entraîne un ralentissement significatif car les valeurs résultantes sont converties en nombres dénormaux.

Pour éviter l'impact sur les performances des nombres dénormaux, vous pouvez utiliser le _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); intrinsèque pour vider les dénormalisés à zéro. Cela signifie que toute valeur qui aurait été dénormalisée est arrondie à zéro. En utilisant cet intrinsèque, vous pouvez améliorer considérablement les performances de votre code lorsque vous travaillez avec des tableaux à virgule flottante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal