我正在尝试理解缓存和阻塞在矩阵中的概念。 我试图转置一个矩阵。
我了解行内存布局的概念,所以我知道当我按行访问数据时,与按列访问相比,我会获得更少的缓存未命中。
for( int i = 0; i < n; i++ )
for( int j = 0; j < n; j++ )
destination[j+i*n] = source[i+j*n];
对于源矩阵,我将会有更少的缓存未命中,而对于目标矩阵,我将会有更多的缓存未命中。
以下是带有阻塞的代码:
for (int i = 0; i < n; i += blocksize) {
for (int j = 0; j < n; j += blocksize) {
// transpose the block beginning at [i,j]
for (int k = i; k < i + blocksize; ++k) {
for (int l = j; l < j + blocksize; ++l) {
dst[k + l*n] = src[l + k*n];
}
}
}
}
上述代码使用了阻塞技术。我不太理解阻塞如何有助于提高性能?