ループアンローリング

そのまま、ループを展開すること。普通はコンパイラがやってくれるけど、アンロール以上のことを手作業でやれば高速化が期待できる。
元のプログラムがこんなんだとする。


/* Σ[i=1..n](1/i^2) を求める。無論極限値は π^2/6 */
sum = 0.0;
for( i = 1 ; i <= n ; i++ ) {
sum += 1.0 / (i * i);
}
これを2倍にアンロールすると、大体以下のようになる。正確にはループの上限などの条件で誤差が出るが、それは自分で補正してくれ。

sum = 0.0;
for( i = 1 ; i <= n ; i += 2 ) {
sum += 1.0 / (i * i);
sum += 1.0 / ( (i + 1) * (i + 1) );
}
ついでに3倍アンロールも。それ以上は応用簡単にできるでしょ。

sum = 0.0;
for( i = 1 ; i <= n ; i += 3 ) {
sum += 1.0 / (i * i);
sum += 1.0 / ( (i + 1) * (i + 1) );
sum += 1.0 / ( (i + 2) * (i + 2) );
}

ここまでは単純にアンロールしただけ。場合によっては速くなっているかもしれない(iに関する条件確認の回数が減っているから)けど、もう一工夫するともっと速くなる。