Unity 勉強メモ

ゲームエンジンのUnityを勉強するブログです。

C言語でオレオレ行列積ルーチンを作るプロジェクト (その5)

今回はSIMD演算を使って見ました。

プログラム

プログラム全体は以下のGitHubリポジトリにあります。 今回利用するプログラムは、 main.cmy_dgemm04.cです。

コンパイル

$ clang -static -mavx -O3 main.c my_dgemm05.c -I/opt/OpenBLAS/include \
  -L/opt/OpenBLAS/lib -lopenblas -lpthread -lrt

実行結果

プログラムを5回実行した結果を以下に示します。

回数
1回目 6.529844
2回目 6.387908
3回目 6.439508
4回目 6.410661 (中央値)
5回目 6.333632

OpenBLASを100%とした時の各ルーチンのスピードを以下の表にまとめます。

BLAS 比率
OpenBLAS 1.610352 100%
Intel MKL 2.014311 79.9%
ATLAS 3.169463 50.8%
my_dgemm05 6.410661 25.1%
my_dgemm04 13.641321 11.8%
my_dgemm03 14.768021 10.9%
my_dgemm02 16.290370 9.89%
my_dgemm01 283.428661 0.568%

まとめ

SIMD演算を使ったら、前回の2.1倍の性能が出た。