起きたら一面の雪景色.夜の間に降って積もったみたいです.滋賀県南部の今冬の初雪&初積雪です(たぶん).たかたかが帰宅した20時頃までには溶けちゃってましたが.
で,いきなりですが,C言語で行列の積を計算するプログラム.二つの n x n 行列 A, B を乱数で作って C = A x B を10回計算します.
最後に printf してる理由は 無駄なことを…共用体による擬似SIMDとコンパイラの最適化 - まんぼう日記 を読むと分かります.
このプログラムを,
- Mac Pro Late 2013
- CPU: 3.5GHz 6-Core Intel Xeon E5 (Ivy Bridge)
- メモリ: 64GB 1867 MHz DDR3 ECC
- Mac OS X 10.9.5 (Mervericks)
という環境で cc -O3 でコンパイルして実行時間を測ってみると,こんな感じ.
$ time ./matrix 1000 real 1m8.978s user 1m8.924s sys 0m0.031s $ time ./matrix 2000 real 11m38.012s user 11m37.504s sys 0m0.332s
当たり前ですが,普通のCのプログラムなので,1スレッドで動きます.
で,お次は Python + Numpy で同じことをするプログラム.
上記と同じ環境で,MacPorts でインストールした python 2.7.8 + Numpy 1.8.2 で動かして実行時間を測ってみると…
$ time python matrix.py 1000 real 0m0.342s user 0m1.051s sys 0m0.043s $ time python matrix.py 2000 real 0m1.805s user 0m7.924s sys 0m0.093s $ time python matrix.py 4000 real 0m12.406s user 1m3.226s sys 0m0.453s $ time python matrix.py 8000 real 1m35.756s user 8m50.644s sys 0m3.187s
Cのプログラムよりはるかに高速です.まあ,わかってる人には「何を今さら」な話ですよね.「アクティビティモニタ」で観察すると,スレッド数は6でした.Numpy が最適化された数値計算ライブラリを呼び出してて,そいつがマルチスレッドで動く,っちゅうことですね.細かいこというと,上記の環境ではハイパースレッディングが有効なので,12スレッド並列に動いてもおかしくないんですが…(実際,このプログラムを実行中に「アクティビティモニタ」で観察される「ユーザ」時間は50%程度にしかなりません.なんでこうなるんか気になってますが未解決. cf. Numpy / Theano で行列の積を高速に計算するには - まんぼう日記 ).
何が言いたいかというと,今どきはC言語でがんばってプログラム書くよりも,Pythonみたいなお手軽言語使った方が,プログラミングが簡単で済むだけじゃなくて,マルチコアでの並列処理の恩恵にあずかれてずっと高速やったりするよ,と.繰り返しになりますがわかってる人には「何を今さら」な話です.ただ,こういうこと知らない人は結構多くて(専門家でもわかってないことも…),しょっちゅう同じ話をしてるので,書いといてみることにしました.