「まえがき」候補(1)

現代の様々な高性能コンピューター上で高速な密行列・ベクトル計算が実行できる,そういうソフトウェアが実現できないものだろうか? できるとすれば,どうやればいいのか? その疑問に答える,つまり,実際にその理想を実現するソフトウェアを提供すること,それがLAPACKプロジェクトの目的なのである。(P.54, LAPACK User’s Guide Ver.3.0)

 本書はLAPACK(Linear Algebra PACKage)とそれを下支えするBLAS(Basic Linear Algebra Subprograms),そしてそれらから派生して登場した疎行列ライブラリであるSparseBLAS,GPU用のcuBLAS, cuSPARSE,そしてMAGMA(Matrix Algebra on Gpu and Multicore Architectures)の基本的な使い方をざっくりと解説した概説本です。各ライブラリの詳細についてはリンク先にある文書群をご覧頂きたい,という開き直った態度で執筆されており,「そういうWeb上の情報があれば事足りる」というエキスパートな方々には無用の長物であります。なんでも検索すれば見つかるというわけじゃありませんが,こと本書にのべられている事項は大体見つかるものばかりです。LAPACKやMAGMAについて,まず手っ取り早く知りたければ下記の二つの文書を読むことをお勧めします。

 読んだ上で「あ,大体わかった」という人はお呼びではありません。「よく分からないなぁ」と感じた方,それが本書が対象とする読者です。そして著者である私も,これらの文書類を読み,プログラムを片手間に弄っても「よく分からない・・・」と感じておりました。これらの文書類が悪いのではなく,原因は後述するように,それ以外のところにある訳で,それ故に本書を執筆することになったのです。本書は私のそうした知的(?)欲求不満から生まれたものなのです。

 私の抱いた欲求不満を分析してみると,次の点にあるようでした。

  • LAPACK/BLAS(とその派生ライブラリ)の歴史的背景が分からない
  • LAPACK/BLASの提供する関数の名付け方(naming scheme)が古いFortran由来で分かりづらい
  • そもそもFortranベースのライブラリをC/C++から使おうとすると細かい齟齬が生じてイライラする
  • 何でそんなにみんなLAPACK/BLASを使うのかよく分からない→自分の仕事にどう役立つのか分からない
  • 大学カリキュラムの「線型代数」の知識とLAPACK/BLASが提供する機能の関連が分からない

 歴史的背景については,端的にまとまった(私レベルが理解できる)文献がないという事情がありました。LAPACK/BLASが生まれてきた時代的・コンピューター的な歴史を俯瞰したかったという欲求がここで生まれ,簡単な年表を作り,それに基づいて私が理解できた範囲の解説を付記しました。人間,中年を超えると歴史に興味が自然と湧くといいますが,実際,年表づくりは楽しい作業でした。

 LAPACK/BLASの関数名のつけ方は,もともと古い時代のFortranにあった,関数とサブルーチン名の8文字制限というものに起因しています。現在でもLAPACK本体はFortran77ベースの記述がされており,C/C++や種々のオブジェクト指向言語に慣れ親しんだ世代には呪文のようなものに見えてきます。もちろんマニュアルにはちゃんと名付け方の解説はあるのですが,「関数名」と「(特に行列の)データ構造」をリンクして覚えておかないと,使いたい関数を索引から調べても,「えーっと行列はどういう風に格納するんだっけ?」となってしまいます。今でもFortranを愛用する方にとっては便利でも,C/C++的言語で書きたい多数派にとっては取っつきづらい「歴史的背景」を持ったLAPACK/BLAS。それを「最初からC/C++でプログラミングする!」と宣言した解説書を私は念願しておりました。

 加えて,行列のデータ構造も分かりづらさの原因の一つです。それは行列のデータ構造が,線型代数で習った「対称行列」・「エルミート行列」・「直交行列」・「ユニタリ行列」・・・といった数学的性質に基づくものに由来して決まるものもあれば,「密行列」vs. 「疎行列」(「帯行列」・「三重対角行列」等)というメモリ・計算効率的な理由によって決まるものが混在していることにあります。この両者をきちんと整理して把握する解説文書を私は強く欲しておりました。

 そして,LAPACK/BLASが持て囃される理由も,ちゃんと自分の手でプログラミングした応用ソフトウェアを実装したうえで理解したい訳です。もちろん人によって興味の対象は千差万別ですが,本書では,上記の解説を行うことで,各人の興味の対象物へのアプローチを用意できたのではないでしょうか。

 Python/PHP/Rubyといった使いやすいライブラリを備えたコンピュータ言語,Matlab/Scilab/Octaveといった統合型数値計算ソフトウェア,Mathematica/Maple/Maximaといった記号処理を得意とする数式処理ソフトウェアが誰でも手に入れられる時代に,ハードウェアに密着したコンパイラ言語からしこしこプログラムするというニーズは現代では量的には減っていると感じます。しかし,一部の高速性を追求するマニアや組み込み機器開発用,そしてマシンごとのアーキテクチャに最適化して大規模計算を行うニーズは確実に残っています。本書ではその一端をざっくりと解説しただけの荒っぽい本ですが,私が抱いた欲求不満を共有する方々の知識導入時にはこそこ役に立つものになっているハズ。そして皆様の知的好奇心を満足させた暁には,本書の様々な欠点や間違いを指摘できるようになっているハズであります。もし本書についての苦情やお問い合わせをしたければ,サポートページを通じて私にお知らせ頂くか,SNS,Web上でその勉強の成果を開陳して頂きたいと念願しております。最終的には,その成果をソフトウェアや文書等,「形」なったものを通じて世に発信して頂ければ,望外の幸せであります。

2014年9月11日(木)
遠州茶畑のど真ん中にて
静岡理工科大学 幸谷智紀