哪种优化更好,哪种情况下更好?为什么?循环交换与循环平铺
凭直觉,我越来越觉得循环平铺将一般 是一个更好的优化。
怎么样了下面的例子? 假设一个缓存在任何时候只能存储大约20个元素。
Original Loop:
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 1000; j++)
{
a[i] += a[i]*b[j];
}
}
Loop Interchange:
for(int i = 0; i < 1000; i++)
{
for(int j = 0; j < 10; j++)
{
a[j] += a[j]*b[i];
}
}
Loop Tiling:
for(int k = 0; k < 1000; k += 20)
{
for(int i = 0; i < 10; i++)
{
for(int j = k; j < min(1000, k+20); j++)
{
a[i] += a[i]*b[j];
}
}
}
我怀疑它在很大程度上取决于你的数据集的大小。如果数据集相对较小(即可完全适合缓存),则平铺没有多大意义。 – twalberg
的确如此。我正在考虑一个假设情况,其中缓存大小非常低(假设缓存在任何时候只能存储大约20个元素)。 – codepk