線形代数ライブラリ
超高性能プログラミング技術のメモ(11)
数値計算を簡単に高速化できる線形代数ライブラリを紹介しておきます。
線形代数ライブラリとは?
線形代数ライブラリとは、ベクトルと行列のかけ算や足し算を担うBLASと、連立線型方程式や固有値方程式、特異値分解の解法を担うLAPACKの2つをパッケージングしたライブラリです。昔は、これら以外にも多くのライブラリが存在しましたが、現在ではBLASとLAPACKがデファクトスタンダードになっています。
BLASとLAPACKは、Pythonの数値計算ライブラリnumpyやscipy、数値計算ソフトMATLABやそのクローンoctave、統計処理ソフトR、機械学習のtensorflowなど、数値計算を行うソフトウェアの大部分で使用されています。ただし、ソフトウェアから呼び出されるソフトウェアライブラリなため、プログラマーが直接目にすることはあまりありません。
行列計算ライブラリBLASに含まれる行列積計算ルーチンDGEMMは、高性能比較のベンチマークによく用いられます。
線形代数ライブラリ
実は、オリジナルのBLASはあまり高性能ではありません。そのため、関数インターフェースを共通にし、実装をより高速にしたライブラリが、CPUベンダーや研究者から提供されています。
関数インターフェースが共通なので、使用しているソフトウェアのBLAS/LAPACK部分を、より高速な線形代数ライブラリに置き換えるだけで、うまくいけばプログラムの処理速度を10倍程度速くすることができます。これは、1分かかっていた処理を6秒で終わらせる計算になるため、試行錯誤の時間を増やせますし、体感的にも処理待ちのストレスを軽減してくれます。
以下では、主な線形代数ライブラリを紹介します。下記以外の実装については、Wikipediaにリストがあるのでご覧ください。これは、アセンブリ言語で実装されているソフトウェアが多いので、使用するコンピュータのアーキテクチャに対応したライブラリを選ぶ必要があります。
BLAS/LAPACK
Netlib公式参照実装。あまり高速ではなく、DGEMMは理論最高性能の10%くらい。パブリックドメインライセンスで自由に利用できる。
http://www.netlib.org/blas/
http://www.netlib.org/lapack/
ATLAS
パラメータサーベイによって BLASを自動チューニングする実装。DGEMMは、理論最高性能の80%くらい。BSDライセンスのオープンソース。
https://sourceforge.net/projects/math-atlas/
OpenBLAS
旧GotoBLAS。GotoBLAS時代は、DGEMMは理論最高性能の97%を出していたが、OpenBLAS移行直後は90%程度になっていた。現在は、MKLと同程度に改善された様子。BSDライセンスのオープンソース。
http://www.openblas.net
MKL
Intel謹製の数値計算ライブラリ。有料。Intel製CPUを使っていて、お金に余裕があるなら、これを利用するべき。DGEMMは、理論最高性能の96~97%を出す。最新のアーキテクチャにも対応している。
https://software.intel.com/mkl
参考:
Wikipedia - Basic Linear Algebra Subprograms
計算時間が長いなと思ったら
数値計算をするソフトウェアの大部分は、BLAS/LAPACKを使用しています。これを、高性能なライブラリに置き換えることを検討してみてください。