哪種優化更好,哪種情況下更好?爲什麼?循環交換與循環平鋪
憑直覺,我越來越覺得循環平鋪將一般 是一個更好的優化。
怎麼樣了下面的例子? 假設一個緩存在任何時候只能存儲大約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