Maison >développement back-end >C++ >Pourquoi ma boucle est-elle lente lors du traitement de 8192 éléments ?

Pourquoi ma boucle est-elle lente lors du traitement de 8192 éléments ?

DDD
DDDoriginal
2024-12-10 09:51:10681parcourir

Why is My Loop Slow When Processing 8192 Elements?

Pourquoi les performances chutent lors d'une boucle sur 8192 éléments

Lors d'une boucle sur 8192 éléments, le programme rencontre un ralentissement significatif. Ceci est attribué à un problème d'alignement de la mémoire, exacerbé par une structure de boucle inefficace.

Alignement de la mémoire

Les processeurs modernes utilisent des hiérarchies de cache pour améliorer la vitesse d'accès aux données. Les accès mémoire alignés, où les données sont stockées à des adresses multiples de la taille de la ligne de cache, permettent une récupération plus rapide des données. Cependant, dans ce cas, le paramètre SIZE est défini sur 8192, ce qui n'est pas un multiple de la taille de la ligne de cache (généralement 64 octets). Ce désalignement peut ralentir les opérations d'accès à la mémoire.

Ordre des boucles

Le problème d'alignement de la mémoire est aggravé par l'ordre des boucles. Le code d'origine parcourt la matrice par colonnes, ce qui entraîne des accès mémoire non séquentiels. Cela oblige le processeur à effectuer des récupérations plus lentes et aléatoires des données de la mémoire.

Solution

Il existe deux solutions possibles :

  1. Aligner la mémoire : redéfinissez SIZE à un multiple de la taille de la ligne de cache (par exemple, 8192 64).
  2. Ordre des boucles d'échange : au lieu d'une itération par colonne, parcourez la matrice par ligne. Cela aligne les accès à la mémoire avec l'organisation de la ligne de cache, permettant une récupération des données plus rapide et plus efficace.

En interchangeant l'ordre des boucles dans le code, le goulot d'étranglement des performances est éliminé.

Exemple

Le code suivant illustre le correctif :

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        ...
    }
}

Comparaison des performances

Après l'application du correctif, les performances s'améliorent considérablement :

Code d'origine :

SIZE = 8191: 1.499 seconds
SIZE = 8192: 2.122 seconds
SIZE = 8193: 1.582 seconds

Code fixe :

SIZE = 8191: 0.376 seconds
SIZE = 8192: 0.357 seconds
SIZE = 8193: 0.351 seconds

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!

Déclaration:
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