2019年3月13日水曜日

いろんなBLASを使ってみた

最近はやっているディープラーニング、大体Pythonで書かれています。
Pythonだけでは行列の計算が貧弱なので、numpyというライブラリを使って行列の計算をしいます。
さらにnumpyは行列計算をBLAS(Basic Linear Algebra Subprograms)というライブラリで行っています。

以前このブログでも触れたのですが、このBLASは1979年に作られたため、その後いろいろな人が改良していろいろなBLASがあります。
しかもオリジナルはFORTRANという言語で書かれていて、最新のディープラーニングは半世紀も前のプログラムに支えられています。


組み込みで使いたいときはどうすればよいのかと思い、これらの半世紀前のプログラムをいろいろビルドしてみました。


1. reference BLASのビルド

オリジナルのBLASです。LAPACKというBLASの拡張もあります。
Fortanで書かれています。以前この日記にも書きました。
・まずf2cというFORTRANからC言語に変換するプログラムをまずビルドします。

・次にlibf2cというライブラリをビルドして、FORTRANの複素数型や高度な数学関数をビルドします。
・fc2でBLASとXBLASとLAPACKのFORTRANソースコードをC言語に変換してビルドします。
・CBLASとCLAPACKのラッパー関数もビルドします。

とってもめんどくさいんですが、半世紀前のソースコードがWindows10とVisualStudio2019でビルドできます。


2. OpenBLASのビルド

現在一番使われているBLASです。
マルチスレッド化してあるので、CPUのコア数が増えれば増えるほど高速に演算できます。
大部分がC言語で書かれていますが、高速化のため一部がアセンブラとフォートランで書かれています。このため、その特定の部分をVisualCなどでコンパイルできません。
このため、Windowsではなかなか手軽に遊べず。
しかしMinGWなどでコンパイルすればWindows版も作れます。
高速動作に命を懸けているので、コンパイラーに依存しています。
アセンブラ部分をなくてもビルドを通るようにしてくれればよいのに。
LAPACKというライブラリ部分はGFORTRANを使うので、GFORTRANがない場合はLAPACKがコンパイルされません。
ファイル数が1000個以上あるのでコンパイルに非常に時間がかかります。


3 GSL BLASのビルド

GNU Science Libraryの中に入っているBLASです。
LAPACKは入っていませんがC言語で書かれていて一番簡単にビルドできます。
テストコードも簡単にビルドできるので、Windows10のVisualStudio2019でもビルドできてテストにパスしました。


4 Eigen BLAS

Googleが機械学習用に作っている行列演算ライブラリEigenの中に入っています。
BLASはほぼ全関数、LAPACKは一部の関数が入っています。
一番ファイル数が少なくビルドも高速。
一番まともですごいのになんで全関数ないんだ。


ということで、BLASを組み込みや勉強で使うときはEigenかGSL BLASがよさそうです。
Torchなどの機械学習の学習で使うときはフルのLAPACKが必要でEigenが使えません。
なのでOpenBLASかGPU対応のcuDNNじゃないとだめですね。





0 件のコメント:

コメントを投稿