キャッシュの威力2008/12/30 10:53

雲は、年末年始の休暇を内積の高速化(マルチスレッド化)に捧げる決意をして、調査を行っています。その中で、キャッシュの効果を見せつけられることになりました。今、10000 x 10000 の配列を int 型で準備して、その配列を使って二乗和を求めてみました。

int v[10000][10000]; int w[10000]; for( int i = 0; i < 10000; i++ ){

  w[i] = inner_product( &v[i][0], &v[i][10000], &v[i][0], 0 );

}

といった感じの処理で速度を計測すると、シングルスレッドでの処理速度が、約 0.5秒なのに対して、4つのスレッドを立ち上げて計算すると、なんと、約1.2秒と倍以上遅くなってしまいました(Core2Quad Q6600)。

そこで、今度は、キャッシュが効きやすいように、i を 0 に置き換えて

    w[i] = inner_product( &v[0][0], &v[0][10000], &v[0][0], 0 );

このようにしてみると、なんと、4スレッドでも0.5秒で処理が終わるではないですか!いや~。びっくりしました。キャッシュの効果(たぶん)でパフォーマンスが倍になるということは、あまり想定できていなかったので、この結果はにわかには信じられません。

キャッシュとパフォーマンスについては、以下のような記述もあるし、雲もそこまで効果があるとは想像をしていませんでした。 http://www.ne.jp/asahi/comp/tarusan/main165.htm

もうちょっと、考察をしないといけませんが、あまりにもびっくりしたので念のために?書いておきます。

※12/31 補足

調べてみたところ、どうやら、メモリからの転送速度に影響されているようでした。結局、雲のX38 + PC2-5300 では、6~7GB/sec の転送速度で、その転送速度以上には処理速度が向上しない。ということになります。なので、SSEを使っても使わなくても、結局、データの局在性が保証されていない限り、高速化するのは無理なのでしょう。そういう意味で、今年最後の後藤さんの記事に雲は期待します。 (雲のプログラムは、大抵、数百MBのデータに対して繰り返してアクセスするので、その大きさのキャッシュがCPUに搭載されると、処理速度は、数倍に加速します)

http://pc.watch.impress.co.jp/docs/2008/1226/kaigai483.htm