Basic Linear Algebra Subprograms

ウィキペディアから

Basic Linear Algebra SubprogramsBLAS)は数値線形代数の基礎的演算に必要な関数を定義するAPIである[3]ベクトル行列演算を含む38の関数からなるLevel 1 BLASが1979年に発表されたのち[4]、Level 2 および Level 3 まで拡張された。多数の実装が作成・整備され続けており、この分野におけるデファクトスタンダードとなっている。BLASの基礎演算を利用してLAPACKなどの上位パッケージが構築されており、科学技術計算高性能計算で多用される。

概要 開発元, 最新版 ...
Reference BLAS
開発元 The University of Tennessee and The University of Tennessee Research Foundation, The University of California Berkeley, The University of Colorado Denver[1]
最新版
3.12.0 / 2023年11月25日 (11か月前) (2023-11-25)[2]
リポジトリ github.com/Reference-LAPACK/lapack
BLASとLAPACKをまとめて実装している
プログラミング
言語
FortranC言語
種別 数値線形代数
ライセンス 三条項BSDライセンス
公式サイト www.netlib.org/blas/
テンプレートを表示
閉じる

BLASの関数を多用するソフトウェアにおいてBLAS実装(ライブラリ)の質は速度に直結する。高度な最適化は実装が動くハードウェアに依存するため、多くのハードウェアベンダーが自社デバイスに特化したライブラリを提供している(インテルIntel oneAPI Math Kernel Library)。オープンソースの最適化 BLAS 実装として OpenBLAS などがある。

LINPACK ベンチマークの性能は、BLAS のサブルーチンである DGEMM(倍精度汎用行列乗算)の性能に大きく影響される。

対応しているデータ型は単精度浮動小数点数倍精度浮動小数点数。近年 CPU および GPU で広く実装されている bfloat16 は、各 BLAS 実装が独自拡張[5]として実装していていて、今のところ、公式の BLAS 実装では実装されていない。

機能

要約
視点

BLASの機能は以下の3レベルに分類される。

Level 1

このレベルには、以下のような形式のベクトル演算が含まれる。

他にもドット積ノルムなどが含まれる。

Level 2

Level 2 BLAS の行列を含み オーダーを持つ演算のセットである[6]。元々の BLAS(Level 1 BLAS)を拡張し1段階抽象度の高い演算セットとして提案された[7]

行列の種類を示す記号には GE (GEneral matrix)、HE (HErmitian matrix)、SY (SYmmetric matrix)、TR (TRiangular matrix) などがある[8]。演算を示す記号には MV (matrix-vector product)、 R (Rank-one update)、 R2 (Rank-two update)、 SV (solving a system of linear equations) がある[9]

GEMV

一般行列ベクトル積: general matrix vector products; GEMV)は一般行列(GE)を用いた行列ベクトル積(MV)である[10]。すなわち次の演算である( はGeneral Matrix)。

Level 3

このレベルには、以下のような形式の行列同士の演算が含まれる。

また、 を三角行列 について解く演算なども含まれる。このレベルにはよく使われる汎用行列乗算(GEMM)操作が含まれる。

API

BLASはAPIであり、各演算関数を次のように定義する。

GEMM

各行列の変換フラグ・次元・係数・アクセスオフセットを引数に取り、行列積和演算を実行、演算結果が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

Sparse BLAS

Sparse BLASは、疎行列を対象としたBLASである[11]。疎行列は格納形式と演算実装を工夫することで高効率の計算が可能である。Sparse BLAS はこの用途に特化した実装をもつBLASである。疎行列を示す記号には Sp (Sparse) が用いられる。

SpMV

疎行列ベクトル積: sparse matrix vector products; SpMV)は疎行列Sp)を用いた行列ベクトル積(MV)である[12]。すなわち次の演算である( は Sparse Matrix)。

PBLAS

PBLASは、コンピュータ・クラスター並列計算)向けの並列BLAS(Parallel Basic Linear Algebra Subprograms)[13]MPI などの上で動作する BLACS を通信プロトコルとして利用する。

実装

要約
視点

BLAS演算は多数の積和演算からなる。またLevel 2およびLevel 3ではベクトル・行列を扱う。ゆえに計算機におけるBLAS実装ではSIMD命令をもちいた最適化が可能である。利用される命令とその特性は命令セットアーキテクチャにより異なり、またメモリ等の実行環境によっても最適設定は異なる。その結果、特定CPUに特化したBLAS実装や実行時に環境へのチューニングをおこなうBLASなど、異なる特性をもつ様々なBLAS実装が存在する。

リファレンス実装もBLASとLAPACKをまとめて実装しているが、多くのBLASライブラリも同様にLAPACKを含めて実装している。

特定のデバイスに限定していない汎用の実装

Reference BLAS
netlib による公式リファレンス実装C言語版とFORTRAN版がある。BLASとLAPACKがまとめて実装されている。DebianUbuntuなどでは、OpenBLASなどをインストールしない限りこれが使われる。
BLAS++
BLASのC++ API。C言語版のAPIと1対1で対応する。Intel, AMD, NVIDIA, IBM などのハードウェアベンダーの出しているBLAS実装を利用して動作する。
BLIS英語版
BLASのスーパーセット。
OpenBLAS
オープンソース実装。x86, x86-64, MIPS32, MIPS64, ARM32, ARM64, POWER, IBM zEnterprise, RISC-V 上の Linux, Microsoft Windows, macOS, FreeBSD, OpenBSD, NetBSD, DragonFly BSD, Android, iOS, AIX, Haiku, Solaris で動作。

ハードウェアベンダーによる、特定のデバイス向けの実装

Accelerate
Apple による自社デバイス用の自社OS(macOSiOSなど)向けフレームワーク。BLAS と LAPACK を含む。
AMD Optimizing CPU Libraries (AOCL)
AMD の CPU (EPYC, Ryzen, Ryzen Threadripper) 上のLinuxWindowsをサポート。
Arm Performance Libraries
ARM64上で動作。
cuBLAS
NVIDIA CUDA SDK には、NVIDIA の GPU 上で動作するBLAS機能(C言語インタフェース)が含まれる。
Engineering and Scientific Subroutine Library (ESSL)
IBMによる実装。POWER上のAIXおよびLinuxで動作。
Intel oneAPI Math Kernel Library
インテルによる実装。インテルの CPU および GPU をサポート。Linux/Windows で動作。
MathKeisan
日本電気による実装。NEC SX上のSUPER-UXをサポート。
Oracle Developer Studio Performance Library
SPARCx86-64 上の Oracle Solaris と Linux で動作する BLAS および LAPACK 実装。旧称Sun Performance Library。
rocBLAS
AMD の GPU 向けのオープンソース実装。

かつて開発されていたライブラリ

Automatically Tuned Linear Algebra Software (ATLAS)
オープンソース実装(C言語Fortran 77
clBLAS
AMD が提供する、主に GPU 向けの OpenCL 上で動くオープンソース実装。2017年が最後のバージョン。後継はrocBLAS。
GotoBLAS
後藤和茂が GotoBLAS を開発し、OpenBLAS へと引き継がれている。GotoBLAS は2010年2月が最後のバージョン。
Hewlett-Packard Mathematical Software Library (HP MLIB)
ヒューレット・パッカードの数学ライブラリ。IA-64/PA-RISC/x86/Opteron上のHP-UXおよびLinuxで動作。
PDLIB/SX
1994年に発表された日本電気SX-4向け数学ライブラリ(パブリックドメイン)。現在は配布されていない。
Scientific Computing Software Library (SCSL)
SGIの実装。LAPACK も含む。IRIX上で動作。

BLASではないが類似ライブラリ

Elemental
分散メモリコンピュータ・クラスター)用の密行列・疎行列の線形代数および最適化ライブラリ。
GNU Scientific Library
C言語での実装。
uBLAS
BLAS機能を提供する汎用C++テンプレートクラスライブラリ。Boostライブラリの一部。高性能を追求するというよりも、C++の最新機能を使ってアルゴリズムを正しく実装することに注力している。

関連項目

脚注

参考文献

外部リンク

Wikiwand - on

Seamless Wikipedia browsing. On steroids.