Unity 勉強メモ

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

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

今回はブロック化を適用してみました。

プログラム

BNがブロックサイズです。ブロック化を適用するとこで、 行列がキャッシュに乗りやすくなります。

問題はこのブロックサイズをいくつに定めるかですが、 とりあえず20から1000まで10刻みで試してみて折れ線グラフを作って見ました。

f:id:lambdataro:20150304052526p:plain

なんとも微妙なグラフですが、 どうやら300から500ぐらいの値にするのが良さそうです。 ここでは計測結果も良かったBN = 500を採用しました。

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

コンパイル

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

実行結果

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

回数
1回目 15.103703
2回目 14.865213
3回目 14.768021 (中央値)
4回目 14.704157
5回目 14.742018

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

BLAS 比率
OpenBLAS 1.610352 100%
Intel MKL 2.014311 79.9%
ATLAS 3.169463 50.8%
my_dgemm3 14.768021 10.9%
my_dgemm2 16.290370 9.89%
my_dgemm1 283.428661 0.568%

まとめ

前回に比べてブロック化をしたことで少しだけ速くなりました。 でも端数処理などでプログラミングに手間がかかった割に、 期待したほどは早くならなかったのは残念です。