2011年8月8日月曜日

FLOPS で測定してみた

この前の Matlab の高速化だが、やはりまだボトルネックになっているらしく、さらなる高速化が必要とのことであった。
そこで、現在の実装がどれだけ CPU を活用できているかについて検討してみた。

すると、3x800万の行列の列ごとに要素を掛ける計算の場合、100回繰り返しで 16.16 秒かかった。
これから計算すると
1/16.16 * 3 * 800万 * 100 flops = 138Mflops
出ていることになる。

比較として、octave で行列積を使ってみた。基本的に octave の行列積は ATLAS の dgemm (BLAS level3)が用いられているので、それなりに CPU を効率的に使うことができているはずである。
(GotoBLAS などを用いると、さらにベターだが、今回は簡略化)
結果として 5000x5000 の行列積で 143.35 秒かっかった。これから計算すると
1/143.35 * 5000 * 5000 * 5000 flops = 812Mflops
であった。500x500 だと 0.3807 秒で 300Mflops である。

level3 に対して 6分の1程度の性能まで来ているので、これ以上のスピードアップを図るのであればキャッシュなどの利用も検討対象となる。ただ、Matlab の mex に組み込む必要があり、Linux 専用に組み込むわけにもいかず、そのあたりも考える必要がありそうだ。


あと、ついでに気がついたが、Ubuntu の apt-get でインストールされる octave について、リンクされている ATLAS はマルチスレッドに対応していないようだ。複数コアのCPUで実験してみたが dgemm 利用時でも 101 % を超えることがなかった。


今日の作業内容:Matlab 高速化 2h + 論文読み 4h
今日のランチ:味庵 翡翠麺の冷やし中華
明日の予測作業時間:3h




0 件のコメント:

コメントを投稿