LAPACK

LAPACK (Linear Algebra PACKage)は数値線形代数のための数値解析ソフトウェアライブラリで、線型方程式や線型最小二乗問題、固有値問題、特異値問題等を数値的に解くために利用される。本ライブラリは複素数または実数を成分とする行列を扱うことが可能であり、LU分解やコレスキー分解、QR分解、シュア分解等の行列の分解を行うためのサブルーチンを含む。サブルーチンは単精度版と倍精度版が提供される。のLAPACKの初版はFORTRAN 77 で実装されていたが、現在はFortran 90が用いられている。LAPACK 3.4.0からはC言語インターフェースであるLAPACKEが統合され、C言語やC++からの利用が容易になった。

LAPACKはLINPACKおよびEISPACKの後継と見做されている。ただし、LINPACKの設計が開発当時近代的であった共有メモリ型ベクトルコンピュータを意識したものであるのに対して、本ライブラリの設計はキャッシュを用いたアーキテクチャを有する、より近代的なコンピュータを意識したものである。LAPACKはLINPACK同様にBLAS（Basic Linear Algebra Subprograms、基本線型代数サブプログラム群）ライブラリ上に構築されている。LAPACKは後に分散メモリ型のコンピュータ向けにやへと拡張された。

Reference LAPACKは三条項BSDライセンスで提供されるオープンソースソフトウェアである。

 サブルーチン 
 構成 
LAPACKのサブルーチンは以下の三種類に大別される。
 ドライバルーチン（driver routines）LAPACKが扱うことが可能な問題を解くためのルーチン。 問題の例として線型方程式系を解く問題や対称行列の固有値問題などが挙げられる。利用者の要請に合致する機能のドライバルーチンが存在する場合にはそのルーチンの利用が推奨される。
 計算ルーチン（computational routines） 問題を解くために必要な計算タスクを実行するためのルーチン。LAPACKのドライバルーチンは計算ルーチンを連続的に呼び出すことで問題を解く。計算タスクの例として行列をLU分解することや対称行列を三重対角行列に変換することなどが挙げられる。前者は線型方程式系を解くために、そして後者は対称行列の固有値問題を解くために必要である。利用者の要請に合致するドライバルーチンが存在しない場合は計算ルーチンを組み合わせて問題を解くことになる。
 補助ルーチン（auxiliary routines） 補助的に利用されるルーチン。ブロックアルゴリズム内部で利用される計算タスクの一部を実行するものや、BLASの機能をわずかに拡張したものが含まれる。

 命名規則 
LAPACKとBLASのサブルーチンの名称は機能の判別が平易である範囲で短くなるような規則で命名されている。
これは初期のFORTRANにおける関数の名称に関する仕様上の制限を受けたものである。

サブルーチンはpmmaaaの規則で命名される。
以下、LAPACKのDGESV（倍精度一般行列の方程式系の求解）とBLASのDGEMM（倍精度行列の積の計算）を例に挙げる。
 pは通常は一文字の英字で数値データの型を表現するために利用されるただし、LAPACK95のサブルーチンはデータの型を自動判別するためLA_GESVといった名称を持つ。詳細はを参照。。SとDはそれぞれ単精度と倍精度の実数を意味し、CとZはそれぞれ単精度と倍精度の複素数を意味する。なお、一文字目を別の文字に置き換えてサブルーチンの名称を記述することがある例えば、インテルのMath Kernel LibraryのリファレンスマニュアルではDGESVを?GESVと表記している。。ただし、サブルーチンが採用するアルゴリズムによっては例外が存在することに注意が必要であるLAPACK 3.1.1のDSGESVは行列の分解を単精度で実行して得た解を反復改良することで倍精度の解を得るためにDSで始まる名称を持つ。詳細はを参照。。
 mmは二文字の英字でサブルーチンが採用するアルゴリズムが想定する行列の型を意味する。行列の型を現す略号は以下に表で示す。サブルーチンが想定する行列データの格納方法は型ごとに異なる。例えば、対角行列を意味するDIが与えられた場合は対角要素が格納された長さの配列を、一般行列を意味するGEが与えられた場合は行列の要素が格納されたの配列という具合いである。
 aaaは一文字から三文字の英数字でサブルーチンの処理内容を表現する。例えばSVは線型方程式系の求解を意味し、MMは行列の積を意味する。
+LAPACKの命名規則における行列の型略号説明BDDI対角行列GBGE一般行列GG一般行列、一般化された問題（一般行列の対）GT一般三重対角行列HBエルミートHEエルミート行列HG上、一般化された問題（ヘッセンベルグ行列と三角行列）HPエルミート行列、HS上OP直交行列、OR直交行列PB正値対称 または 正値エルミートPO正値対称行列 または 正値エルミート行列PP正値対称行列 または 正値エルミート行列、PT正値対称三重対角行列 または 正値エルミート三重対角行列SB対称SP対称行列、ST対称三重対角行列SY対称行列TB三重対角行列TG三角行列、一般化された問題（三角行列の対）TP三角行列、TR三角行列（または準三角行列）TZUNユニタリ行列UPユニタリ行列、
命名規則の詳細はLAPACK Users' Guideの当該項目LAPACK Users' Guide, Naming schemeを参照。

 実装 
LAPACKにはサブルーチンの機能とインターフェースに互換性のある実装が多く存在する。それぞれの動作環境についてはリンク先を参照。

 特定のデバイスに限定していない汎用の実装 
 Reference LAPACK
netlib による公式リファレンス実装。
 OpenBLAS
オープンソース実装。x86, x86-64, MIPS32, MIPS64, ARM, ARM64, POWER, IBM zEnterprise, RISC-V 上の Linux, Microsoft Windows, macOS, FreeBSD, OpenBSD, NetBSD, DragonFly BSD, Android, iOS, AIX, Haiku, Solaris で動作。

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

 Accelerateフレームワーク
 Apple のデバイス用
 AOCL-LAPACK (AMD Optimizing CPU Libraries)
 AMD CPU 用
 Arm Performance Libraries
 ARM64用
 cuSOLVER
 NVIDIA GPU 用のサブセット実装。
 Engineering and Scientific Subroutine Library (ESSL)
 IBMによる実装。POWER上のAIXおよびLinuxで動作。
 Intel oneAPI Math Kernel Library
 インテルの CPU, GPU 用
 NEC Numeric Library Collection
 日本電気による実装。NEC SX用。旧称MathKeisan。
 Oracle Developer Studio Performance Library
 オラクルによる実装。SPARC と x86-64 上の Oracle Solaris と Linux で動作する BLAS および LAPACK 実装。旧称Sun Performance Library。
 rocSOLVER
 AMD GPU 用のサブセット実装。

 かつて開発されていたライブラリ 
 HP MLIB
 ヒューレット・パッカードによる実装。
 SCSL (Scientific Computing Software Library)
 SGIによる実装。

 LAPACKと言語バインディング 
LAPACKはFortran 90以外のプログラミング言語から利用することが可能であり、これを目的とした言語バインディングのためのライブラリも開発されている。LAPACK 3.4.0よりC言語インターフェースであるLAPACKEが統合された。

以下に例を示す。
 LAPACK95: Fortran 95用。インターフェースが簡略化される。
 CLAPACK: C言語用。Fortran版をによって変換したもの。
 LAPACKE: C言語用。インテルのMath Kernel Library互換のC言語インターフェース。
 LAPACK++: C++用。
 Armadillo: C++用。
 CPPLAPACK: C++用。
 Boost Numeric Bindings: C++用。
 SciPy: Python用。
 jlapack: Java用。
 CSLapack: C#用。
 Linalg: Ruby用。
 LACAML: OCaml用。
 hmatrix: Haskell用。
 Accelerateフレームワーク: Objective-C用インターフェースが提供される。
Gonum: LAPACK and BLAS in Native Go

 C言語 
多くの処理系ではライブラリのC言語バインディングが可能であるため、いくらかの制約があるにせよLAPACKのサブルーチンをC言語の関数のように利用できる。ただし、Fortranコンパイラが存在しない処理系ではCLAPACKも有効な選択肢となる。なお、が提供するC言語インターフェースATLAS ANSI/ISO C LAPACK API REFERENCEを参照。も存在するが、これはf2cのCLAPACKとは互換性が無い。

C言語では慣用のrow-major orderingな行列を計算させる場合、LAPACKEでは指定オプションが用意されている。その場合、内部で行列転置が行われオーバヘッドが発生する。例えば行列積は、内部の計算は下記のように行われる。ここで「」はBLAS/LAPACK本来のcolumn-major orderingな行列積を意味している。


 脚注 

 注釈 

 出典 

 関連文献 

 E. Anderson, Z. Bai, C. Bischof, S. Blackford, J. Demmel, J. Dongarra, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenney, D. Sorensen：”LAPACK Users' Guide (Software, Environments and Tools)”、SIAM、ISBN 978-0898714470（1987年1月1日）。
 村田健郎、J.J.ドンガラ、小国力、三好 俊郎、長谷川 秀彦：「行列計算ソフトウェア―WS、スーパーコン、並列計算機」、丸善、ISBN　978-4621036549（1991年12月）。
 小国力：「LAPACK利用の手引―行列計算パッケージ」、丸善、ISBN 978-4621040768（1995年7月）。
 幸谷智紀：「LAPACK/BLAS入門」、森北出版、ISBN 978-4627848818（2016年12月16日）。

 関連項目 

 BLAS
 数値解析ソフトウェア

 外部リンク 
 LAPACK Users' Guide 公式サイトのマニュアル
 LAWNs (LAPACK Working Notes) LAPACKの実装に関する文献集
 LAPACKサンプルプログラム集 NAGによるサンプルプログラム集
 PLASMA Parallel Linear Algebra for Scalable Multi-core Architectures、BLAS上に構築されたホモジニアスマルチコア向けの線型計算ライブラリ
 CULA NVIDIAのCUDA対応GPU上で動作する線型計算ライブラリ
 MAGMA Matrix Algebra on GPU and Multicore Architectures、LAPACKのサブセットでマルチコアCPUとGPUのハイブリッドアーキテクチャ向け
 The MPACK; Multiple precision arithmetic BLAS and LAPACK 多倍長精度版のBLAS/LAPACK
 「BLAS，LAPACK チュートリアル」 MPACKの開発者によるチュートリアル
 パート1 （簡単な使い方とプログラミング）
 パート2 （GPU編）

Category:数値解析ソフトウェア
Category:数値線形代数
Category:スーパーコンピュータ
LAPACK
Category:1992年のソフトウェア
Category:FORTRAN