BLAS, LINPACK, LAPACK
BLAS とは
ベクトルと行列に関する積や和などの基本的な操作を提供するライブラリのことっぽい。機能はレベルに分類されるらしい。
- Level 1:ベクトル演算
- Level 2:行列ベクトル演算
- Level 3:行列同士の演算
有名な操作として GEMM (ジェム)がある。GEMM とは General Matrix Multiplication のことで、C = αAB + βC を計算する。
精度を頭につけて識別する。例えば SGEMM は 32bit float、DGEMM は 64bit float。
LINPACK, LAPACK とは
線形方程式や固有値問題などを解くための線形代数のライブラリ。BLAS を利用している。LAPACK は LINPACK の後継。両方 Fortran で書かれている。
BLAS と同様の命名規則が採用されているようだ。 DGESV は double (D) の一般行列 (GE) の方程式の求解 (SV) である。
BLAS の実装
BLAS実装はATLASとOpenBLASとMKLがメイン
— Takami Sato (@tkm2261) 2017年2月23日
ATLAS: 最適化されたBLAS元祖、最初に色々問題といて自動チューン
OpenBLAS:フリー最強。numpyとの相性問題も解決されたぽい
MKL:有料かつ最強。MKLビルドnumpyを配布するAnacondaは神 https://t.co/3gciPopEBQ
@tkm2261 ちなみに、OpenBLASの前身はGotoBLASで
— Takami Sato (@tkm2261) 2017年2月23日
後藤和茂氏という神が開発されましたhttps://t.co/KfEtEgkpRu
ありがたい情報を貰いました……感謝!!
MKL は BLAS のみならず LAPACK や FFTW と互換性のある関数群も含んでいるらしいです。
CUDA の BLAS には NVIDIA 公式の cuBLAS がある。CUDA の LAPACK には CULA と MAGMA というものがあるようだ(どちらも公式ではなさそう)。
BLAS, LAPACK の間接的な利用
- NumPy は BLAS, LAPACK を使うようにできるようです。ちゃんと BLAS, LAPACK が使われるようになってないとかなり遅いらしいです。Anaconda は numpy が Intel MKL がリンクされた状態で配布されるので楽ちん。
- Eigen は BLAS, LAPACK を使うようにできるようです — Eigen: Using BLAS/LAPACK from %Eigen
- MShadow も BLAS を使えるようになってます。 — mshadow/config.mk at master · dmlc/mshadow · GitHub
- Boost uBLAS は BLAS っぽい機能を提供するという話であって OpenBLAS とかを使うことはできないようだ。噂ではあまり速くないっぽい。