【发布时间】:2013-09-26 16:41:15
【问题描述】:
这些优化中哪一个更好,在什么情况下?为什么?
直觉上,我感觉循环平铺通常会 做一个更好的优化。
下面的例子呢? 假设一个缓存在任何时候只能存储大约 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];
}
}
}
【问题讨论】:
-
我怀疑这在很大程度上取决于您的数据集的大小。如果您的数据集相对较小(即可以完全放入缓存中),则平铺没有多大意义。
-
确实如此。我正在考虑一个缓存大小非常低的假设情况(假设一个缓存在任何时候只能存储大约 20 个元素)。
标签: c performance loops caching optimization