clMathは、現在clBLASとclFFTがあり、行列計算や高速フーリエ変換をOpenCLを使ってできるようです。
今回は、clBLASの使い方について簡単にメモっておきます。
OpenCLはインストール済みと仮定します。
githubにclMathのデータがあります。
[1] https://github.com/clMathLibraries
ユーザ登録が必要かどうかはわかりませんが、自分の場合はgithubにユーザ登録して、clBLASのDownload ZIPをダウンロードしました。
clblas-develop.zipを適当なフォルダに解凍して、CMake(cmake-gui)を立ち上げます。
clBLAS-develop/srcフォルダをソースフォルダに設定し、適当にclBLAS-develop/buildフォルダを作成してそこをビルドフォルダに設定します。
Configureを押すと、ACMLが見つからないというエラーと、Boostが見つからないというエラーがでていました。
ACMLとBoostは、サンプルプログラム?等に必要な雰囲気でなくてもかまわない気がしましたが、一応入れることにしました。
ACMLは、下記のページからacml5.3.1-win64.exe PGI fortran用をダウンロードしてインストールしました。
[2] http://developer.amd.com/tools-and-sdks/cpu-development/amd-core-math-library-acml/acml-downloads-resources/
ACML_ROOTにF:/AMD/acml5.3.1/win64といったインストールフォルダを指定すればACMLのエラーは消えます。
Boostは、省略します。
Generateを押せば、buildフォルダにclBLAS.slnができていますので、ビルドすればエラーなく成功しました。
ライブラリを使用するときは、clBLAS-develop/src及びclBLAS-develop/src/includeにあるヘッダファイルと、clBLAS-develop/build/library/ReleaseフォルダにあるclBLAS.libとclBLAS.dllがあれば良さそうです。
一番基本となる行列同士の掛け算は、[3]の下のほうにサンプルソースコードがあります。
[3] https://github.com/clMathLibraries/clBLAS
APIの説明は、[4]にあります。
[4] http://clmathlibraries.github.io/clBLAS/
[3]では、clblasSgemmという関数を使って行列の掛け算を計算しています。
Sはsingle precision、gemmはGeneral matrix-matrix multiplicationの略で、double型で計算をしたい場合はclblasDgemmという関数になります。
で、引数がかなりわかりにくかったです。APIドキュメントには書かれていますが、ひとつの関数で下記のような計算を行うことができるようになっています。
[4]より引用
α、βは複素数のバージョンもあるのですが、上記の2関数は実数用のものになっています。
C=αAB+βCで、AやBは引数によって転置させて計算することも可能となっています。
つまり、普通掛け算というとC=ABだと思いますが、これを行うためにはα=1.0、β=0.0に設定しないとおかしな結果になってしまいます。
それ以外は、引数の説明に気をつけながら値を渡せば特に問題はないかと思います。
実行結果
自作行列掛け算と、clBLASを使用した場合(clblasDgemm)の計算時間を比較してみました。
1024x1024の行列A,B(値は-1.0~1.0の一様乱数)を掛けて、行列Cに代入します。
自作行列掛け算の時間:9629[ms]
clBLAS(転送時間含む):55[ms]
自作行列クラスでデータ生成して、それを一時配列にコピーして、GPU上にメモリを作成して、CPU->GPUにデータ転送して、掛け算計算して、GPU->CPUにデータ転送して、自作クラスにデータコピーして結果を返すまでの時間が上記の結果でした。
一応計算結果をファイルに出力して比較してみましたが、どちらも同じ結果になっていたので合っていると思います。
無駄なデータ転送時間を入れてもこの差はさすが並列処理ですね。まぁ比較対象がひどすぎるというのもありますが。
とりあえず後はGEMV - General matrix-Vector multiplicationとかを試してみようとは思います。
○○solveとかあるので逆行列とかも計算できそうな気がしますが、まだやり方はわかっていません。