Impact sur les performances lors du bouclage sur 8192 éléments
Certaines opérations matricielles présentent des anomalies de performances lorsque la taille de la matrice, en particulier le nombre de lignes, est un multiple de 2048 (par exemple, 8192). Ce phénomène, appelé super-alignement, est dû aux pratiques spécifiques de gestion de la mémoire des processeurs modernes.
L'extrait de code fourni illustre ce problème, où une matrice res[][] est calculée à partir d'une matrice img[. ][]. Les performances pour différentes tailles de matrice, en particulier 8191, 8192 et 8193, révèlent un ralentissement significatif lorsque la taille de la matrice est de 8192.
Effets de super-alignement
Les performances les variations proviennent de l'accès non uniforme à la mémoire provoqué par les boucles imbriquées itérant par colonne sur la matrice img[][]. Ce modèle d'accès non séquentiel entraîne des pénalités de performances sur les processeurs modernes, qui fonctionnent plus efficacement avec un accès séquentiel à la mémoire.
Résolution : échange de boucles externes
La solution réside dans réorganiser les boucles imbriquées, en donnant la priorité à l'itération par ligne plutôt qu'à l'itération par colonne. Ce faisant, l'accès à la mémoire devient séquentiel, améliorant considérablement les performances :
for(j=1;j<SIZE-1;j++) { for(i=1;i<SIZE-1;i++) { // Code to compute res[j][i] } }
Résultats de performances
Les résultats de performances suivants démontrent l'amélioration obtenue en interchangeant les boucles externes :
Matrix Size | Original Code (s) | Interchanged Loops (s) |
---|---|---|
8191 | 1.499 | 0.376 |
8192 | 2.122 | 0.357 |
8193 | 1.582 | 0.351 |
Cette optimisation réduit considérablement l'écart de performances pour les matrices dont les dimensions sont des multiples de 2048, ce qui entraîne des performances constantes. sur différentes tailles de matrice.
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!