为什么循环平铺?
Why loop tiling?
根据维基百科 (http://en.wikipedia.org/wiki/Loop_tiling) 和许多其他来源,循环平铺 是一种循环优化技术,有助于利用缓存(参考位置)。迭代 space 被分成块数,因此可以更好地利用缓存。
从上面的 link 中,有人可以解释它对 1D 情况(概述部分)有何不同?在我看来,两种情况下都会发生相同数量的缓存未命中。
“一维案例”不完整,只是用来描述阻塞的想法。没有"body"所以你无法分析。
阻塞在算法中多次使用相同数据的情况下很有用,阻塞可确保数据在您重复使用时一直在缓存中。
举个例子
for(i=0; i<N; ++i){
// Processing 1
...
}
for(i=0; i<N; ++i){
// Processing 2
...
}
对
for(j=0; j<N; j+=B){
for(i=j; i<min(N, j+B); ++i){
// Processing 1
....
for(i=j; i<min(N, j+B); ++i){
// Processing 2
....
}
}
会更有说服力
根据维基百科 (http://en.wikipedia.org/wiki/Loop_tiling) 和许多其他来源,循环平铺 是一种循环优化技术,有助于利用缓存(参考位置)。迭代 space 被分成块数,因此可以更好地利用缓存。
从上面的 link 中,有人可以解释它对 1D 情况(概述部分)有何不同?在我看来,两种情况下都会发生相同数量的缓存未命中。
“一维案例”不完整,只是用来描述阻塞的想法。没有"body"所以你无法分析。
阻塞在算法中多次使用相同数据的情况下很有用,阻塞可确保数据在您重复使用时一直在缓存中。
举个例子
for(i=0; i<N; ++i){
// Processing 1
...
}
for(i=0; i<N; ++i){
// Processing 2
...
}
对
for(j=0; j<N; j+=B){
for(i=j; i<min(N, j+B); ++i){
// Processing 1
....
for(i=j; i<min(N, j+B); ++i){
// Processing 2
....
}
}
会更有说服力