簡単なシミュレーション・プログラムでMatlabの遅さに愕然とする

学生の時に数値解析の講義は取ったもののシミュレーションに関してはちゃんと勉強したことがなかったので、春休みということもあり教科書を紐解いてみました。数式だけでプログラムは載っていない教科書だったので、実際にMatlabで平面上の熱拡散現象シミュレーションをするプログラムを書いてみました*1。32×32のシミュレーション点で1,000世代を計算させるだけで20.3秒かかってしまいました。もうすこし規模の大きなシミュレーションをしたかったのに、これではさすがに遅すぎです。

速度を稼ぐために、同じプログラムをC言語でも書いてみました。今世紀に入ってからはずっとJavaMatlabだけを使ってきて、ちょこちょことPythonRubyLISPなんかで遊ぶくらいだったので、C言語でプログラムを書くのは実に10年ぶりでしたが、昔取った杵柄とはよく言ったもので、基本的なところは意外に覚えています。

完成したプログラムでMatlabと同じ規模のシミュレーションをしたら、C言語版は実行時間0.032秒とのこと。256×256点で10,000世代を計算させても14.5秒。同じCPU上なのに、実行速度がこんなに違うんですね。頭では「Matlabでプロトタイプ作ってから、C言語で書きなおせばいいじゃん」と理解していましたが、500倍以上の速度差を実際に体感すると愕然とします。嗚呼。

*1:音響シミュレーション業界では、差分法や有限要素法なんてのがよく使われているようです。今回作ったプログラムはそういった方法とは比べものにならないくらい単純なものです。僕はシミュレーションを自分の研究に使おうとは思っていませんので、ゆっくりと勉強を進めて遊んでいこうと思います。今回参考にしたのは川村哲也著『数値シミュレーション入門』です。数値シミュレーションに関する学部レベルの教科書かな?