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 ?

Pourquoi l'ordre des boucles est-il crucial pour le traitement efficace d'une matrice 8 192 x 8 192 ?

DDD
DDDoriginal
2024-12-06 16:03:16226parcourir

Why is Loop Order Crucial for Efficient Processing of an 8192x8192 Matrix?

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 :

  • 8191 : 1,499 secondes
  • 8192 : 2,122 secondes
  • 8193 : 1,582 secondes

Boucles échangées :

  • 8191 : 0,376 secondes
  • 8192 : 0,357 secondes
  • 8193 : 0,351 secondes

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!

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