C言語でオレオレ行列積ルーチンを作るプロジェクト (その3)
今回はブロック化を適用してみました。
プログラム
BN
がブロックサイズです。ブロック化を適用するとこで、
行列がキャッシュに乗りやすくなります。
問題はこのブロックサイズをいくつに定めるかですが、 とりあえず20から1000まで10刻みで試してみて折れ線グラフを作って見ました。
なんとも微妙なグラフですが、
どうやら300から500ぐらいの値にするのが良さそうです。
ここでは計測結果も良かったBN = 500
を採用しました。
プログラム全体は以下のGitHubリポジトリにあります。 今回利用するプログラムは、
main.c
とmy_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% |
まとめ
前回に比べてブロック化をしたことで少しだけ速くなりました。 でも端数処理などでプログラミングに手間がかかった割に、 期待したほどは早くならなかったのは残念です。