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...