Maison >développement back-end >C++ >Pourquoi l'ordre des boucles est-il crucial pour le traitement efficace d'une matrice 8 192 x 8 192 ?
Bouclage lent sur 8192 éléments : comprendre la pénalité de performance
Le code fourni traite une matrice, img, en calculant la moyenne des neuf cellules environnantes pour chaque élément non frontalier et stocke le résultat dans la matrice res. Lorsque la taille de la matrice est de 8192x8192, le programme présente une baisse de performances significative.
Ce ralentissement est attribué à des problèmes de gestion de la mémoire liés au super-alignement. Le compilateur aligne les structures de données en mémoire pour améliorer les performances, et dans ce cas, la disposition matricielle peut entraîner un accès mémoire inefficace.
Pour résoudre ce problème, l'ordre des boucles dans l'opération de moyenne doit être interchangé. Au lieu d'itérer par colonne, la boucle doit itérer par ligne.
Voici le code modifié :
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]; res[j][i] += img[j ][i-1]; res[j][i] += img[j+1][i-1]; res[j][i] += img[j-1][i ]; res[j][i] += img[j ][i ]; res[j][i] += img[j+1][i ]; res[j][i] += img[j-1][i+1]; res[j][i] += img[j ][i+1]; res[j][i] += img[j+1][i+1]; res[j][i] /= 9; } }
En changeant l'ordre de la boucle, la mémoire séquentielle l'accès est maintenu, éliminant ainsi la pénalité de performance associée à l'accès non séquentiel.
Performance Comparaison :
La structure de boucle échangée améliore considérablement les performances :
Code original :
Boucles échangées :
Cette modification garantit une gestion efficace de la mémoire et résout la lenteur des performances lors du bouclage sur 8192 éléments.
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!