これらの最適化のうちどれがより優れており、どのような状況で使用されますか? なんで?
直感的に、ループ タイリングは一般的に最適化に適していると感じています。
以下の例ではどうですか?常に約 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];
}
}
}