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は後に分散メモリ型のコンピュータ向けにやへと拡張された。

性能面での特徴は、線型代数の各手続きを可能な限りBLASへの呼び出しへ分解し、特にLevel 3 BLASを利用して行列積や複数の右辺を持つ三角行列方程式の求解などの粗粒度な行列演算へ計算を集約する点にある。この構成では、機種ごとに最適化されたBLAS実装を利用することで、LAPACK本体の上位ルーチンを大きく書き換えずに多様な計算機で性能を得ることを意図しており、利用者や配布者が実行環境に応じて最適化BLASを差し替えられるかどうかが、同じLAPACKインターフェースを使った場合の実行速度差につながる。そのため、この依存関係は性能比較時にも重要となり、移植性と性能の切り分けにも関係し、対象とする行列は主に密行列と帯行列で、一般的な疎行列は直接の対象外である。この設計は、LINPACKやEISPACKで問題になりやすかったメモリ階層上のデータ移動を減らすため、内側の反復でブロック行列演算を使うという考え方に基づくものであり、LINPACKおよびEISPACKを置き換える目的には性能向上、機能追加、新規・改良アルゴリズムの導入、両パッケージの統合が含まれる。

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、(1987年1月1日)。 村田健郎、J.J.ドンガラ、小国力、三好 俊郎、長谷川 秀彦:「行列計算ソフトウェア―WS、スーパーコン、並列計算機」、丸善、(1991年12月)。 小国力:「LAPACK利用の手引―行列計算パッケージ」、丸善、(1995年7月)。 幸谷智紀:「LAPACK/BLAS入門」、森北出版、(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編)