azusa の利用状況を見ると,分子軌道計算プログラム Gaussian98 や FORTRAN プ ログラムが実行されていることがあるが,通常の稼働率は非常に低い. 大学等の研究機関において計算サーバが担うべき役割の一つとして,FORTRAN や C 言語などのプログラムを巨大なデータに対して高速に実行することが挙げられる だろう. しかし,近年ではパーソナルコンピュータ(PC)用のプロセッサが高速になり,搭 載されるメモリも大容量となったため,余程大規模な計算対象でない限り使い勝手 の悪い計算サーバが使用される機会は少なくなっている. さらに,総合情報処理センター web ページには azusa のアプリケーションとして MATLAB,Mathematica とあるが,実際にはこれらは導入されていない. 稼働率の低さの原因としてこのような数値計算用ツール不足が挙げられるだろう.
本稿では,計算サーバ azusa に数値計算ツール Octave を導入する方法と,作成 したプログラムをスクリプトとして実行させる方法を示す.
研究活動における数値実験でどんなによい結果が得られたとしても,使用したアル ゴリズムやプログラムコードが明らかでなければその価値は下ってしまう. また,新しい計算方法を提案する場合にはそのプログラムコードも添えて公表する ことが増えており,それは MATLAB のプログラムコードであることが多い.
GNU Octave(以下 Octave)は MATLAB 互換の数値計算ツールである. MATLAB とほぼ同じ文法と関数群,gnuplot によるグラフィック表現力を持つ. 詳しくは Octave の web ページを参照されたい.
Octave を azusa で利用するためには,そのソースファイルをコンパイルする必要 がある. Octave のソースファイルには複数のブランチが存在する.
Octave の ftp ミラーサイトや ring サーバには stable 版しか登録されていない ので,Octave のホームページのダウンロードエリアからソースファイルを取得し, これを以下のように適当なディレクトリで展開する.
% bzcat octave-2.1.50.tar.bz2 | tar xvf - |
octave-2.1.50
ディレクトリにソースファイルが展開される.
この中の configure スクリプトを実行することによってインストールに必要なシ
ステム(azusa)の情報が自動的に取得される.
今回,configure スクリプトの vervose 出力に "
が入り,コンパイラの
リンクオプションにおかしな文字列が混入するという不具合があったため,事前に
configure スクリプトを以下のように編集した.
7252 行と 7333 (7332) 行に
ac_f77_v_output=`echo $ac_f77_v_output | sed "s/\"//g"` |
azusa には GNU C および GNU C++ コンパイラがあるが,Intel Itanium プロセッ
サ用の NEC 製コンパイラ(C コンパイラ ecc,C++ コンパイラ ecpc,FORTRAN コ
ンパイラ efc)を使用する.
以下のように使用するコンパイラ,コンパイラオプションを指定して configure
スクリプトを実行する.
ここで,インストール先はホームディレクトリに指定している.
% CC=ecc CFLAGS=-O CXX=ecpc CXXFLAGS=-O F77=efc FFLAGS=-O ./configure |
--disable-readline
という指定は,GNU readline ライブラリを使
用しないことを意味する(標準では使用する).
azusa には GNU readline ライブラリが存在するが,これをリンクして作成した
Octave では画面出力が正常に行われず,その直後に異常終了してしまった.
しかし readline ライブラリを使用すれば,実行履歴の編集が可能となり操
作の利便性が向上する.
その方法の説明は省略するが,readline ライブラリをソースファイルからコンパ
イル,インスールして Octave のインストールに使用することを薦める.
make コマンドでソースファイルのコンパイルを実行し,終了後インストールする.
% make |
~
で表す)
としたので,Octave 本体は ~/bin
にインストールされる.
その他に ~/lib
,~/include
などのディレクトリが作成される.以下のように ~/bin
をコマンド検索パスに加えておくことを薦める.
シェルが bash の場合
% echo 'PATH = $PATH:~/bin' >> .bashrc |
シェルが bash の場合
% echo 'path=( $path $home/bin )' >> .cshrc |
この変更で次回のログインから ~/bin
が検索パスに追加される.
Octave を実行する以下のように著作権に関するメッセー
ジが表示された後に,プロンプトが表示され,入力待ちの状態になる.
% octave |
~/.octave_hist
ファイルに記録す
る.
history
コマンドによってこの履歴を参照することができる.
例えば history
コマンドによって以下のような履歴が表示され,この中の
履歴番号 1 の命令をもう一度実行したい場合には,run_history 1
とする.
octave:1> history |
exit
または quit
コマンドを実行する.
Octave の(英語)マニュアルはソースファイルを展開したディレクトリ下の
doc/interpreter
に dvi ファイル (octave.dvi
) と
PostScript
ファイル (octave.ps
) で用意されている.
300 ページを超えるものだが,Octave を研究用に使用するならば印刷したものを
座右に備えることを薦める.
Octave は MATLAB 互換であるので,数多く出版されている MATLAB の解説書が参
考になる.
ただし,一部互換性のない部分があるので,あらかじめそのような部分を確認して
おく必要がある(例えばこ
のページ).
octave:1> a=rand(1000,1000);b=rand(1000,1000); |
a
,b
を生成している.
命令の最後に ;
を付けると結果の画面への出力が抑制される.
2 行目は行列積 a*b の実行時間を計測し,その結果は約50秒であったことを示し
ている.
同様に,行列 a
の LU 分解に約 3 秒,QR 分解に約 25 秒という結果である.
5 行目の実行結果は,要素数 1000 の縦ベクトルとして b
を乱数で生成し
たことを示す.
次の 6 行目で線形方程式 ax=b を解き,その実行時間を表示している.比較のために,Pentium III プロセッッサ 800MHz の計算機において GNU C 2.95.3 (-O オプション) で作成した Octave-2.1.50 で同じ実験を行った.
x=a*b : 51.5 [sec]同じクロックのCPU同士の比較であったが,Pentium III の方が遅いという結果と なった. これはコンパイラの最適化能力の違いによるものと予想できる.
lu(a) : 14.1 [sec]
qr(a) : 53.3 [sec]
x=a\b : 13.9 [sec]
Octave 内部では BLAS (Basic Linear Algebra Subprogram) や LAPACK (Linear Algebra PACKage) などの線形計算用ライブラリが使用されている. これらのライブラリの性能は上記実験のような計算に対して支配的な影響を持って いる. 使用するプロセッサや OS に合せて自動的に最適化した線形計算ライブラリを作成 するソフトウェアに ATLAS (Automatically Tuned Linear Algebra Software) が ある. これには BLAS と LAPACK の一部が含まれている. Octave で使用している線形計算プロブラムの一部を Pentium III 用 ATLAS で生成したものと置き 換え,Pentium III プロセッサで同様な実験を行ったところ,以下のように大幅な 速度向上が見られた.
x=a*b : 3.5 [sec]
lu(a) : 1.7 [sec]
qr(a) : 24.8 [sec]
x=a\b : 1.8 [sec]
残念ながら,今回 asusa では ATLAS による最適化ライブラリを作成できなかった. 最適化したライブラリを生成するためには,コンパイラがプロセッサの様々な付加 機能を引き出す必要がある. しかし,ATLAS のコンパイルに必要な azusa の GNU C コンパイラは古く, Itanium プロセッサの持つ付加機能の多くを使用できない. azusa で Octave の線形計算を高速化するためには NEC 製 Itanium 用数学ライブ ラリ MathKeisan を利用することがほぼ唯一の選択肢となるが,現在 azusa にこれは実装されていない.
Octave プログラムをスクリプトとして実行させるには,以下のような Octave ス クリプトを書く.
#! /home/lab/faculty/tomohiro/bin/octave -qf |
test.sh
として保存し,以下の操作で実行可能モードにす
ることで実行可能な Octave スクリプトとなる.
% chmod u+w test.sh |
次に Octave スクリプトへの引数の渡し方を説明する.
Octave スクリプトに渡された引数は argv
という名前の文字列のリストに
保存される.
リスト list の n 番目の要素を取り出す関数 nth
(list,n)
と,文字列から数値への変換関数 str2num
を使ってコマ
ンド行引数を数値として得るスクリプトファイルは以下のようになる.
#! /home/lab/faculty/tomohiro/bin/octave -qf |
これを test.sh
とし,先ほどと同様に実行した結果は以下のようになる.
% ./test.sh 2.3 -4.1 |
コマンド行引き数からファイル名などの文字列を得る場合は,空白(スペース)を
取り除く関数 deblank
を使用する必要がある.
#! /home/lab/faculty/tomohiro/bin/octave -qf |
% ./test.sh 2.3 -4.1 sample.dat |
しかし,今回説明した方法では Octave によって azusa の能力を十分に引き出す ことはできなかった. そのためには Itanium プロセッサ用に最適化された BLAS,LAPACK ライブラリが 必要となる. azusa に実装されている MathKeisan ライブラリはこれらを含んでいるはずである が,どの程度最適化されているかは不明である. 実際 MathKeisan ライブラリから Octave に必要な BLAS,LAPACK ルーチンを抜き 出しリンクさせてみたが思うような結果は得られなかった.
今後は,並列計算機として azusa の機能を引き出す方法を検討する必要がある.
これに関して Octave の開発者達は MPI との連携を模索しているようである.