LAPACK

LAPACK  数値線形代数のための数値解析ソフトウェアライブラリで、線型方程式や線型最小二乗問題、固有値問題、特異値問題等を数値的に解くために利用される。本ライブラリは複素数または実数を成分とする行列を扱うことが可能であり、LU分解やコレスキー分解、QR分解、シュア分解等の行列の分解を行うためのサブルーチンを含む。サブルーチンは単精度版と倍精度版が提供される。1992}

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

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

1. サブルーチン
---------

1.1. 構成
-------

LAPACKのサブルーチンは以下の三種類に大別される。

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

1.2. 命名規則
---------

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

サブルーチンはpmmaaaの規則で命名される。 以下、LAPACKのDGESVとBLASのDGEMMを例に挙げる。

pは通常は一文字の英字で数値データの型を表現するために利用される。SとDはそれぞれ単精度と倍精度の実数を意味し、CとZはそれぞれ単精度と倍精度の複素数を意味する。なお、一文字目を別の文字に置き換えてサブルーチンの名称を記述することがある。ただし、サブルーチンが採用するアルゴリズムによっては例外が存在することに注意が必要である。
mmは二文字の英字でサブルーチンが採用するアルゴリズムが想定する行列の型を意味する。行列の型を現す略号は以下に表で示す。サブルーチンが想定する行列データの格納方法は型ごとに異なる。例えば、対角行列を意味するDIが与えられた場合は対角要素が格納された長さ//n//}}の配列を、一般行列を意味するGEが与えられた場合は行列の要素が格納された//n//×//n//}}の配列という具合いである。
aaaは一文字から三文字の英数字でサブルーチンの処理内容を表現する。例えばSVは線型方程式系の求解を意味し、MMは行列の積を意味する。命名規則の詳細はLAPACK Users' Guideの当該項目を参照。

2. 実装
-----

LAPACKにはサブルーチンの機能とインターフェースに互換性のある実装が多く存在する。

以下に例を示す。それぞれの動作環境についてはリンク先を参照。

[1]: AMDによる実装。
[2]: Appleによる実装。
[3]: ヒューレット・パッカードによる実装。
[4]: IBMによる実装。
Intel Math Kernel Library: インテルによる実装。
[5]: 日本電気による実装。
[6]: SGIによる実装。
[7]: サン・マイクロシステムズによる実装。

3. LAPACKと言語バインディング
-------------------

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

以下に例を示す。

[8]: Fortran 95用。インターフェースが簡略化される。
[9]: C言語用。Fortran版をf2cによって変換したもの。
[10]: C言語用。インテルのMath Kernel Library互換のC言語インターフェース。
[11]: C++用。
[12]: C++用。
[13]: C++用。
[14]: C++用。
[15]: Python用。
[16]: Java用。
[17]: C#用。
[18]: Ruby用。
[19]: OCaml用。
[20]: Haskell用。
Accelerateフレームワーク: Objective-C用インターフェースが提供される。
Gonum: LAPACK and BLAS in Native Go

3.1. C言語
--------

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

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

4. 脚注
-----

4.1. 注釈
-------

4.2. 出典
-------

5. 関連文献
-------

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 ”、SIAM、ISBN 978-0898714470。
村田健郎、J.J.ドンガラ、小国力、三好 俊郎、長谷川 秀彦：「行列計算ソフトウェア―WS、スーパーコン、並列計算機」、丸善、ISBN　978-4621036549。
小国力：「LAPACK利用の手引―行列計算パッケージ」、丸善、ISBN 978-4621040768。
幸谷智紀：「LAPACK/BLAS入門」、森北出版、ISBN 978-4627848818。

6. 関連項目
-------

BLAS
数値解析ソフトウェア

7. 外部リンク
--------

[21] 公式サイトのマニュアル
[22] LAPACKの実装に関する文献集
[23] NAGによるサンプルプログラム集
[24] Parallel Linear Algebra for Scalable Multi-core Architectures、BLAS上に構築されたホモジニアスマルチコア向けの線型計算ライブラリ
[25] NVIDIAのCUDA対応GPU上で動作する線型計算ライブラリ
[26] Matrix Algebra on GPU and Multicore Architectures、LAPACKのサブセットでマルチコアCPUとGPUのハイブリッドアーキテクチャ向け
[27] 多倍長精度版のBLAS/LAPACK
「BLAS，LAPACK チュートリアル」 MPACKの開発者によるチュートリアル
[28]
[29]