C言語でオレオレ行列積ルーチンを作るプロジェクト (その7)
色々試行錯誤した結果、大分速くなった。 OpenMPの使い方も大分わかってきた。 前のプログラムが動かなかったのはprivate節を指定していなかったからだった。
プログラム
プログラム全体は以下のGitHubリポジトリにあります。 今回利用するプログラムは、
main.c
とmy_dgemm07.c
です。
コンパイル
iccでもgccでも通るようになったが、なぜかgccでコンパイルしたほうが速くなるので、 gccでコンパイルした。
$ gcc -static -fopenmp -mavx -O3 main.c my_dgemm07.c -I/opt/OpenBLAS/include -L/opt/OpenBLAS/lib -lopenblas -lpthread -lrt
実行結果
プログラムを5回実行した結果を以下に示します。
回数 | 秒 |
---|---|
1回目 | 2.739869 |
2回目 | 2.676472 |
3回目 | 2.769849 |
4回目 | 2.743161 (中央値) |
5回目 | 2.747036 |
速度の比較
BLAS | 秒 | 比率 |
---|---|---|
OpenBLAS | 1.475622 | 100% |
Intel MKL | 1.574675 | 93.7% |
my_dgemm07 | 2.743161 | 53.8% |
ATLAS | 5.104218 | 28.9% |
まとめ
行列積ルーチンをいじくり回した結果大分速くなってきた。 OpenBLASの50%超えたのは相当嬉しい。