【发布时间】:2017-03-22 02:48:19
【问题描述】:
我正在尝试理解矩阵中的缓存和阻塞的概念。我正在尝试转置一个矩阵。
我了解按行内存布局的概念,因此当我尝试按行访问数据时,与按列相比,缓存未命中次数更少。
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];
}
}
}
}
上面的代码使用了阻塞技术。我不太明白屏蔽对性能有何帮助?
【问题讨论】:
-
我不能声称理解使用缓存的算法性能优化,但 Demaine 教授有 quite a few 的主题讲座。也许他们会提供帮助。