LAPACK

出典: フリー百科事典『ウィキペディア(Wikipedia)』
LAPACK
初版 1992年 (1992)
最新版
3.10.0 / 2021年6月28日 (2021-06-28)
リポジトリ https://github.com/Reference-LAPACK/lapack
プログラミング
言語
Fortran 90
種別 数値解析ソフトウェア
ライセンス BSDライセンス
公式サイト Linear Algebra PACKage
テンプレートを表示

LAPACK (Linear Algebra PACKage) 数値線形代数のための数値解析ソフトウェアライブラリで、線型方程式線型最小二乗問題固有値問題特異値問題等を数値的に解くために利用される。本ライブラリは複素数または実数を成分とする行列を扱うことが可能であり、LU分解コレスキー分解QR分解シュア分解等の行列の分解を行うためのサブルーチンを含む。サブルーチンは単精度版と倍精度版が提供される。1992年 (1992)の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は後に分散メモリ型のコンピュータ向けにScaLAPACK英語版PLAPACK英語版へと拡張された。

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

サブルーチン[編集]

構成[編集]

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

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

命名規則[編集]

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

サブルーチンはpmmaaaの規則で命名される。 以下、LAPACKのDGESV(倍精度一般行列の方程式系の求解)とBLASのDGEMM(倍精度行列の積の計算)を例に挙げる。

  • pは通常は一文字の英字で数値データの型を表現するために利用される[注釈 1]SDはそれぞれ単精度と倍精度の実数を意味し、CZはそれぞれ単精度と倍精度の複素数を意味する。なお、一文字目を別の文字に置き換えてサブルーチンの名称を記述することがある[注釈 2]。ただし、サブルーチンが採用するアルゴリズムによっては例外が存在することに注意が必要である[注釈 3]
  • mmは二文字の英字でサブルーチンが採用するアルゴリズムが想定する行列の型を意味する。行列の型を現す略号は以下に表で示す。サブルーチンが想定する行列データの格納方法は型ごとに異なる。例えば、対角行列を意味するDIが与えられた場合は対角要素が格納された長さnの配列を、一般行列を意味するGEが与えられた場合は行列の要素が格納されたn×nの配列という具合いである。
  • aaaは一文字から三文字の英数字でサブルーチンの処理内容を表現する。例えばSVは線型方程式系の求解を意味し、MMは行列の積を意味する。
LAPACKの命名規則における行列の型
略号 説明
BD 二重対角行列英語版
DI 対角行列
GB 帯行列英語版
GE 一般行列
GG 一般行列、一般化された問題(一般行列の対)
GT 一般三重対角行列
HB エルミート帯行列英語版
HE エルミート行列
HG ヘッセンベルグ行列英語版、一般化された問題(ヘッセンベルグ行列と三角行列
HP エルミート行列圧縮格納形式行列英語版
HS ヘッセンベルグ行列英語版
OP 直交行列圧縮格納形式行列英語版
OR 直交行列
PB 正値対称帯行列英語版 または 正値エルミート帯行列英語版
PO 正値対称行列 または 正値エルミート行列
PP 正値対称行列 または 正値エルミート行列圧縮格納形式行列英語版
PT 正値対称三重対角行列 または 正値エルミート三重対角行列
SB 対称帯行列英語版
SP 対称行列圧縮格納形式行列英語版
ST 対称三重対角行列
SY 対称行列
TB 三重対角行列帯行列英語版
TG 三角行列、一般化された問題(三角行列の対)
TP 三角行列圧縮格納形式行列英語版
TR 三角行列(または準三角行列)
TZ 台形行列英語版
UN ユニタリ行列
UP ユニタリ行列圧縮格納形式行列英語版

命名規則の詳細はLAPACK Users' Guideの当該項目[1]を参照。

実装[編集]

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

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

LAPACKと言語バインディング[編集]

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

以下に例を示す。

C言語[編集]

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

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

脚注[編集]

注釈[編集]

  1. ^ ただし、LAPACK95のサブルーチンはデータの型を自動判別するためLA_GESVといった名称を持つ。詳細は[1]を参照。
  2. ^ 例えば、インテルのMath Kernel LibraryのリファレンスマニュアルではDGESV?GESVと表記している。
  3. ^ LAPACK 3.1.1のDSGESVは行列の分解を単精度で実行して得た解を反復改良することで倍精度の解を得るためにDSで始まる名称を持つ。詳細は[2]を参照。

出典[編集]

  1. ^ LAPACK Users' Guide, Naming scheme
  2. ^ ATLAS ANSI/ISO C LAPACK API REFERENCEを参照。

関連文献[編集]

  • 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日)。

関連項目[編集]

外部リンク[編集]