在对不同大小的矩阵进行实验后,出现了转置矩阵的一个奇特现象:转置维度为 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中文网其他相关文章!