Eine besondere Beobachtung beim Transponieren von Matrizen ergab sich nach der Durchführung von Experimenten mit Matrizen unterschiedlicher Größe: Transponieren einer Matrix mit den Dimensionen 2^ n ist rechenintensiv als die Transponierung eines mit den Dimensionen 2^n 1. Das Die Diskrepanz wird signifikant, wenn n gleich 512 ist.
Der für die Transpositionsoperation bereitgestellte Code lautet wie folgt:
#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; }
Durch Ändern des MATSIZE-Makros kann die Größe der Matrix geändert werden. Die folgenden Benchmarks verdeutlichen den krassen Unterschied:
Der Grund für diese Anomalie liegt im Cache-Verhalten und dem Cache-Konzept Streit. Hier ist eine Aufschlüsselung:
Daher wird der Transponierungsvorgang für Matrizen mit Dimensionen, die ein Vielfaches von 2^n sind, aufgrund von Cache-Konflikten erheblich langsamer.
Das obige ist der detaillierte Inhalt vonWarum ist das Transponieren einer 512x512-Matrix deutlich langsamer als das Transponieren einer 513x513-Matrix?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!