| 開発元 | The University of Tennessee and The University of Tennessee Research Foundation, The University of California Berkeley, The University of Colorado Denver |
|---|---|
| 最新版 |
3.12.0
/ 2023年11月25日 |
| リポジトリ |
github BLASとLAPACKをまとめて実装している |
| プログラミング 言語 | Fortran、C言語 |
| 種別 | 数値線形代数 |
| ライセンス | 三条項BSDライセンス |
| 公式サイト |
www |
Basic Linear Algebra Subprograms(BLAS)は数値線形代数の基礎的演算に必要な関数を定義するAPIである。ベクトル・行列演算を含む38の関数からなるLevel 1 BLASが1979年に発表されたのち、Level 2 および Level 3 まで拡張された。多数の実装が作成・整備され続けており、この分野におけるデファクトスタンダードとなっている。BLASの基礎演算を利用してLAPACKなどの上位パッケージが構築されており、科学技術計算・高性能計算で多用される。
BLASの関数を多用するソフトウェアにおいてBLAS実装(ライブラリ)の質は速度に直結する。高度な最適化は実装が動くハードウェアに依存するため、多くのハードウェアベンダーが自社デバイスに特化したライブラリを提供している(インテル:Intel oneAPI Math Kernel Library)。オープンソースの最適化 BLAS 実装として OpenBLAS などがある。
LINPACK ベンチマークの性能は、BLAS のサブルーチンである DGEMM(倍精度汎用行列乗算)の性能に大きく影響される。
対応しているデータ型は単精度浮動小数点数と倍精度浮動小数点数。近年 CPU および GPU で広く実装されている bfloat16 は、各 BLAS 実装が独自拡張として実装していていて、今のところ、公式の BLAS 実装では実装されていない。
BLASの機能は以下の3レベルに分類される。
このレベルには、以下のような形式のベクトル演算が含まれる。
Level 2 BLAS は の行列を含み のオーダーを持つ演算のセットである。元々の BLAS(Level 1 BLAS)を拡張し1段階抽象度の高い演算セットとして提案された。
行列の種類を示す記号には GE (GEneral matrix)、HE (HErmitian matrix)、SY (SYmmetric matrix)、TR (TRiangular matrix) などがある。演算を示す記号には MV (matrix-vector product)、 R (Rank-one update)、 R2 (Rank-two update)、 SV (solving a system of linear equations) がある。
一般行列ベクトル積(英: general matrix vector products; GEMV)は一般行列(GE)を用いた行列ベクトル積(MV)である。すなわち次の演算である( はGeneral Matrix)。
このレベルには、以下のような形式の行列同士の演算が含まれる。
また、 を三角行列 について解く演算なども含まれる。このレベルにはよく使われる汎用行列乗算(GEMM)操作が含まれる。
BLASはAPIであり、各演算関数を次のように定義する。
各行列の変換フラグ・次元・係数・アクセスオフセットを引数に取り、行列積和演算を実行、演算結果がCへ書き出される。
Trans = "N" | "T" | "C"
T = float32 | float64 | complex
def _GEMM<T>(
TRANSA: Trans, # Flag of A transformation (None, Transpose, Conjugate_transpose)
TRANSB: Trans, # Flag of B transformation (None, Transpose, Conjugate_transpose)
M: int, # The number of C row == (A row (TRANSA=N) OR A col (TRANSA=T))
N: int, # The number of C col == (B col (TRANSA=N) OR B row (TRANSA=T))
K: int, # The number of A_col & B_row (TRANSA=N) OR A_row & B_col (TRANSA=T)
ALPHA: T, # a scalar of "C <- aAB + bC"
A: Matrix[T], # A matrix of "C <- aAB + bC"
LDA: int, # Leading dimension of A
B: Matrix[T], # B matrix of "C <- aAB + bC"
LDB: int, # Leading dimension of B
BETA: T, # b scalar of "C <- aAB + bC"
C: Matrix[T], # C matrix of "C <- aAB + bC" (scaled accumulator)
LDC: int
) -> None
高速に計算するにはキャッシュヒット率を高める必要がある。OpenBLASの元となったGotoBLASを開発した後藤和茂が2008年にその手法を説明した論文を書いている。また、それを元にAlgorithmicaに分かりやすく解説した文章がある。BLASには、行列積、つまり、かけ算して足し算する計算しか含まれていないが、この手法は任意の二項演算子に対して使用可能である。
Sparse BLASは、疎行列を対象としたBLASである。疎行列は格納形式と演算実装を工夫することで高効率の計算が可能である。Sparse BLAS はこの用途に特化した実装をもつBLASである。疎行列を示す記号には Sp (Sparse) が用いられる。
疎行列ベクトル積(英: sparse matrix vector products; SpMV)は疎行列(Sp)を用いた行列ベクトル積(MV)である。すなわち次の演算である( は Sparse Matrix)。
PBLASは、コンピュータ・クラスター(並列計算)向けの並列BLAS(Parallel Basic Linear Algebra Subprograms)。MPI などの上で動作する BLACS を通信プロトコルとして利用する。
BLAS演算は多数の積和演算からなる。またLevel 2およびLevel 3ではベクトル・行列を扱う。ゆえに計算機におけるBLAS実装ではSIMD命令をもちいた最適化が可能である。利用される命令とその特性は命令セットアーキテクチャにより異なり、またメモリ等の実行環境によっても最適設定は異なる。その結果、特定CPUに特化したBLAS実装や実行時に環境へのチューニングをおこなうBLASなど、異なる特性をもつ様々なBLAS実装が存在する。
リファレンス実装もBLASとLAPACKをまとめて実装しているが、多くのBLASライブラリも同様にLAPACKを含めて実装している。