Une observation particulière dans la transposition de matrices est apparue après avoir mené des expériences sur des matrices de différentes tailles : transposer une matrice de dimensions 2^ n est plus coûteux en termes de calcul que d'en transposer un de dimensions 2 ^ n 1. Le l'écart devient significatif lorsque n est égal à 512.
Le code fourni pour l'opération de transposition est le suivant :
#define SAMPLES 1000 #define MATSIZE 512 #include <time.h> #include <iostream> int mat[MATSIZE][MATSIZE]; void transpose() { for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) { int aux = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = aux; } } int main() { //initialize matrix for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) mat[i][j] = i+j; int t = clock(); for ( int i = 0 ; i < SAMPLES ; i++ ) transpose(); int elapsed = clock() - t; std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES; }
En altérant la macro MATSIZE, la taille de la matrice peut être modifiée. Les références suivantes illustrent la différence marquée :
La raison de cette anomalie réside dans le comportement du cache et la notion de cache contestation. En voici une répartition :
Ainsi, l'opération de transposition devient considérablement plus lente pour les matrices dont les dimensions sont des multiples de 2^n en raison de conflits de cache.
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!