在對不同大小的矩陣進行實驗後,出現了轉置矩陣的一個奇特現象:轉置矩陣維度為2^ 的矩陣n 在計算上比轉置維度為2^n 1 的計算成本更高。當 n 等於 512 時,差異變得顯著。
為轉置運算提供的程式碼如下:
#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; }
透過更改 MATSIZE 宏,可以修改矩陣的大小。以下基準說明了明顯的差異:
此異常背後的原因在於快取行為以及快取爭用的概念。以下是細分:
因此,由於快取爭用,對於維度為 2^n 倍數的矩陣,轉置操作會明顯變慢。
以上是為什麼轉置 512x512 矩陣比轉置 513x513 矩陣慢很多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!