LoginSignup
9
2

More than 5 years have passed since last update.

matlab プログラムと mex プログラムの速度を比較する

Last updated at Posted at 2016-05-22

matlab プログラムは mex プログラムと比べて遅い?

matlabプログラムは、if文や、for文を多用すると、途端に遅くなります。
「mexプログラムに置き換えたら、100倍速くなった!」なんてことは珍しくないです。

では、単純な計算処理についてはどうでしょうか?
mex化&最適化すると早くなるでしょうか?
matlabも内部的には、mexでの高速化が行われいます。
果たして、それがどのくらいの最適化なのでしょうか。
今回は、その調査をしてみます。

比較は、vector と vector の内積計算速度で行います。
メモリ位置などの考慮をほとんど必要としない単純な処理です。
matlabのみでの計算、mexでの計算、openmp使用、SIMD使用と色々試してみます。

プログラムは以下です。

実験条件は以下です。
・CPU:Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz [core数:4、thread数:8]
・OS:Windows10 64bit
・MATLAB:2016a
・mex compiler:Microsoft Windows SDK 7.1 (C++)
・実験条件:vector長64,000,000 の内積演算 y = wTx を、100回実施する時間を測定

実験結果と考察

動かしてみた結果は以下です。

condition time (sec) cpu usage(%)
matlab 6.00 50%
mex 10.54 12%
mex + openmp 6.03 100%
mex + openmp + SSE 3.32 100%
mex + openmp + AVX 4.03 100%

(※openmpはフルスレッド指定で、CPUメーターでは100%パンパンです)
(※SSE:single×4並列、AVX:single×8並列)

以上。
「頑張れば、matlabを凌げる!」という感じ。

面白いポイントとしては、openmpを使って並列演算を行っただけでは、
matlab単体での演算速度と同程度とまでしか行かないところです。
きっと、matlab単体計算に、SIMDが使われているか、
Intel compilerとか優秀なコンパイラを使ってるんでしょう。
コードの最適化で早くする余地は、もう無い気がします。

また、もう一つ面白いポイントとして、
Microsoft Windows SDK 7.1 (C++) コンパイラによる、
SIMD命令(SSE、AVX)の最適化はちょっと甘そうです。
こちらも、コードに問題は無いと思うのですが、高速化度合いがいまいちです。
これについては、また別途検証を行えれば、と思いますが、
網羅的にやると、CPU複数種類試すとか、Intel Compiler買うとか、お金かかりそう、、、

という訳で、今日は以上となります。
ここまで読んで下さった方、ありがとうございました。orz...

9
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2