高速化

人間は機械のお手伝い

そういや、全く書いていなかった、一番重要な点。これまで述べたような点も、場合によってはこれ1個で超えられるかも。ということで、今回はコンパイルオプションについて。 一般的に知られてるgccなら % gcc hoge.cとやるのが一番楽なの。そして多少慣れて…

メモリアクセスを連続に

とりあえず、問題設定としてはNxNサイズの正方行列A,B,CについてC=ABと積を計算すること。 C=Oの初期化は別にされてるとして、それ以降の計算。基本的にはこうなる。 for( i = 0 ; i < N ; i++ ) { for( j = 0 ; j < N ; j++ ) { for( k = 0 ; k < N ; k++ )…

除算のご利用は計画的に

浮動小数点の四則演算を速度で比較すると、加算=減算=乗算>>除算(一般論)、ということになるので多少他の演算が増えようが除算は減らす方がいい。ただし実際には試行錯誤が必要。ということで、上記のプログラムを2倍アンロールして除算を減らしてみる。…

ループアンローリング

そのまま、ループを展開すること。普通はコンパイラがやってくれるけど、アンロール以上のことを手作業でやれば高速化が期待できる。 元のプログラムがこんなんだとする。 /* Σ[i=1..n](1/i^2) を求める。無論極限値は π^2/6 */ sum = 0.0; for( i = 1 ; i s…