前の投稿で、intel MKLをMacにインストールしましたが、こうなってくるとAccelerate frameworkとどちらが速度が早いのか気になるところです。Accelerate frameworkはMacに最適化されているということで結果が気になります。
cblas_dgemmを使って比較してみました。
Source code for Mac Accelerate
下記コマンドでコンパイルしました。
c++ -framework Accelerate -o dgemm_accel dgemm_accel.cpp
Source code for Intel MKL
下記コマンドでコンパイルしました。
c++ -DMKL_ILP64 -m64 -I${MKLROOT}/include ${MKLROOT}/lib/libmkl_intel_ilp64.a ${MKLROOT}/lib/libmkl_intel_thread.a ${MKLROOT}/lib/libmkl_core.a -liomp5 -lpthread -lm -ldl -o dgemm_mkl dgemm_mkl.cpp
結果
どちらも3回づつ実行して比較しました。結果は下記の通り。
| Mac Accelerate framework [sec] | Intel MKL [sec] | |||
| Real time | CPU time | Real time | CPU time | |
| 1 | 14.408 | 104.854 | 11.716 | 46.5299 |
| 2 | 14.811 | 102.439 | 15.101 | 59.2974 |
| 3 | 14.961 | 103.652 | 13.153 | 52.1992 |
結果はほぼ同じですね。Accelerate frameworkの方が結果が安定しているでしょうか。なぜだかわかりませんが。そしてどちらも指定しなくても並列計算してくれています。CPU timeに差が出てしまいましたがなぜでしょう…?
おまけ
MKLと自作の”for loop program”を比較してみました。コードは下記。
コンパイルして実行してみます。
> g++-8 -fopenmp -o dgemm_forloop dgemm_forloop.cpp
> for i in 100 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000;
do
./dgemm_forloop $i
done
結果は下記のとおり。

MKLすごいですね。アセンブリレベル?で最適化されているということなので、どう頑張っても太刀打ちできないんでしょう。