[研究報告の目次へ戻る]

計算サーバ azusa における GNU Octave の利用


医学工学総合研究部 工学学域
鈴木 智博
stomo@yamanashi.ac.jp

1. 計算サーバ azusa

総合情報処理センターの研究用計算サーバ azusa (NEC Express5800-1160Xa) は CPU に Intel Itanium 800MHz プロセッサ 8 台を搭載した並列計算機である. 64 bit 版 Linux を OS としているので標準的な UNIX の操作方法で利用することが可能であ る. azusa に関する詳細は総合情報処理センター web ページシステム の概要の計 算サーバの部分を参照されたい.

azusa の利用状況を見ると,分子軌道計算プログラム Gaussian98 や FORTRAN プ ログラムが実行されていることがあるが,通常の稼働率は非常に低い. 大学等の研究機関において計算サーバが担うべき役割の一つとして,FORTRAN や C 言語などのプログラムを巨大なデータに対して高速に実行することが挙げられる だろう. しかし,近年ではパーソナルコンピュータ(PC)用のプロセッサが高速になり,搭 載されるメモリも大容量となったため,余程大規模な計算対象でない限り使い勝手 の悪い計算サーバが使用される機会は少なくなっている. さらに,総合情報処理センター web ページには azusa のアプリケーションとして MATLAB,Mathematica とあるが,実際にはこれらは導入されていない. 稼働率の低さの原因としてこのような数値計算用ツール不足が挙げられるだろう.

本稿では,計算サーバ azusa に数値計算ツール Octave を導入する方法と,作成 したプログラムをスクリプトとして実行させる方法を示す.

2. GNU octave のインストール

科学技術計算分野における MATLAB,Mathematica の重要性,有用性は言うまでもない.特に MATLAB は科学技術計算に携わる多くの研究者に利用されている.この理由として挙げられるのは,Matlab ではその内部で利用される多くのアルゴリズムがコードの状態で提供されいるからである.MATLAB インタープリタは実際にこれらのコードを使用してプログラムを実行する. しかも,それらのアルゴリズムは各専門分野の中で最良とされているものがほとん どである.

研究活動における数値実験でどんなによい結果が得られたとしても,使用したアル ゴリズムやプログラムコードが明らかでなければその価値は下ってしまう. また,新しい計算方法を提案する場合にはそのプログラムコードも添えて公表する ことが増えており,それは MATLAB のプログラムコードであることが多い.

GNU Octave(以下 Octave)は MATLAB 互換の数値計算ツールである. MATLAB とほぼ同じ文法と関数群,gnuplot によるグラフィック表現力を持つ. 詳しくは Octave の web ページを参照されたい.

Octave を azusa で利用するためには,そのソースファイルをコンパイルする必要 がある. Octave のソースファイルには複数のブランチが存在する.

ここで,括弧内の数字は原稿執筆時のそれぞれのヴァージョンである. stable はよくテストされ信頼性があるが,古く,現在ではメンテナンスされていない. development は開発ブランチであり,常に最新のものが提供される. testing は開発ブランチの中から実際の利用に耐えるものとして選ばれたものであ り,新たに導入する場合にはこれを使うことが推奨されている. したがって,今回は 2.1.50 版 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 
--prefix=$HOME --disable-readline
(シェルは bash を使用.実際には一行で書く)
 最後の --disable-readline という指定は,GNU readline ライブラリを使 用しないことを意味する(標準では使用する). azusa には GNU readline ライブラリが存在するが,これをリンクして作成した Octave では画面出力が正常に行われず,その直後に異常終了してしまった. しかし readline ライブラリを使用すれば,実行履歴の編集が可能となり操 作の利便性が向上する. その方法の説明は省略するが,readline ライブラリをソースファイルからコンパ イル,インスールして Octave のインストールに使用することを薦める.

make コマンドでソースファイルのコンパイルを実行し,終了後インストールする.

% make
% make install

3. Octave の基本的な操作

今回 Octave のインストール先をホームディレクトリ(以下,~ で表す) としたので,Octave 本体は ~/bin にインストールされる. その他に ~/lib~/include などのディレクトリが作成される.以下のように ~/bin をコマンド検索パスに加えておくことを薦める.

シェルが bash の場合

% echo 'PATH = $PATH:~/bin' >> .bashrc

シェルが bash の場合

% echo 'path=( $path $home/bin )' >> .cshrc

この変更で次回のログインから ~/bin が検索パスに追加される.

Octave を実行する以下のように著作権に関するメッセー ジが表示された後に,プロンプトが表示され,入力待ちの状態になる.

% octave
GNU Octave, version 2.1.50 (ia64-unknown-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 John W. Eaton.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Report bugs to <bug-octave@bevo.che.wisc.edu>.

octave:1>

プロンプトの数字は Octave を起動してから実行した命令の履歴番号であり,命令 を実行するたびに 1 づつ増加する. これとは別に Octave は命令の履歴を ~/.octave_hist ファイルに記録す る. history コマンドによってこの履歴を参照することができる. 例えば history コマンドによって以下のような履歴が表示され,この中の 履歴番号 1 の命令をもう一度実行したい場合には,run_history 1 とする.
octave:1> history
1 a=rand(10,10)
2 tic(); a*b; toc()
3 quit
octave:2> run_history 1

Octave を終了させるには exit または quit コマンドを実行する.

Octave の(英語)マニュアルはソースファイルを展開したディレクトリ下の doc/interpreter に dvi ファイル (octave.dvi) と PostScript ファイル (octave.ps) で用意されている. 300 ページを超えるものだが,Octave を研究用に使用するならば印刷したものを 座右に備えることを薦める. Octave は MATLAB 互換であるので,数多く出版されている MATLAB の解説書が参 考になる. ただし,一部互換性のない部分があるので,あらかじめそのような部分を確認して おく必要がある(例えばこ のページ).

4. 性能評価

Octave の性能を評価するために 比較的大きなサイズの行列演算を実行し,その時 間を計測した結果を示す.

 octave:1> a=rand(1000,1000);b=rand(1000,1000);
octave:2> tic();x=a*b;toc()
ans = 50.067
octave:3> tic(); [L,U,P]=lu(a); toc()
ans = 2.8804
octave:4> tic(); [Q,R,P]=qr(a); toc()
ans = 25.351
octave:5> b=rand(1000,1);
octave:6> tic(); x=a\b; toc()
ans = 3.2282

1 行目で1000行1000列の大きさの[0,1]の範囲の乱数を要素に持つ二つの行列 ab を生成している. 命令の最後に ; を付けると結果の画面への出力が抑制される. 2 行目は行列積 a*b の実行時間を計測し,その結果は約50秒であったことを示し ている. 同様に,行列 a の LU 分解に約 3 秒,QR 分解に約 25 秒という結果である. 5 行目の実行結果は,要素数 1000 の縦ベクトルとして b を乱数で生成し たことを示す. 次の 6 行目で線形方程式 ax=b を解き,その実行時間を表示している.

このプログラム例を見ると,行列積がスカラー積と同じ演算子で実行できること,線形方程式が演算子一つで表現されていること,lu 分解,qr 分解のルーチンが用意されていることなどに Octave (MATLAB) の特徴が現れている.

比較のために,Pentium III プロセッッサ 800MHz の計算機において GNU C 2.95.3 (-O オプション) で作成した Octave-2.1.50 で同じ実験を行った.

x=a*b : 51.5 [sec]
lu(a) : 14.1 [sec]
qr(a) : 53.3 [sec]
x=a\b : 13.9 [sec]
同じクロックのCPU同士の比較であったが,Pentium III の方が遅いという結果と なった. これはコンパイラの最適化能力の違いによるものと予想できる.

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 にこれは実装されていない.

5. Octave スクリプト

コンパイラと比較して,小さなプログラムの実行や,簡単な数式の検証を行う際に は Octave の対話的な環境は非常に便利である. しかし,このような実行モードでは,実行する計算対象が大きくなると長時間にわ たって結果待ちの状態で端末を占領されてしまう. Octave のプログラムをコンパイラが生成した実行形式ファイルのように使用する ためには,これをスクリプトとして実行すればよい.

Octave プログラムをスクリプトとして実行させるには,以下のような Octave ス クリプトを書く.

#! /home/lab/faculty/tomohiro/bin/octave -qf
printf ("Hello, world\n");

上のファイルを test.sh として保存し,以下の操作で実行可能モードにす ることで実行可能な Octave スクリプトとなる.

% chmod u+w test.sh 
% ./test.sh
Hello, world

次に Octave スクリプトへの引数の渡し方を説明する. Octave スクリプトに渡された引数は argv という名前の文字列のリストに 保存される. リスト listn 番目の要素を取り出す関数 nth (list,n) と,文字列から数値への変換関数 str2num を使ってコマ ンド行引数を数値として得るスクリプトファイルは以下のようになる.

#! /home/lab/faculty/tomohiro/bin/octave -qf
Xmin = str2num ( nth ( argv, 1 ) );
Xmax = str2num ( nth ( argv, 2 ) );
printf("Xmin = % e\nXmax = % e\n,Xmin,Xmax);

これを test.sh とし,先ほどと同様に実行した結果は以下のようになる.

% ./test.sh 2.3 -4.1 
Xmin = 2.300000e+00
Xmax = -4.100000e+00

コマンド行引き数からファイル名などの文字列を得る場合は,空白(スペース)を 取り除く関数 deblank を使用する必要がある.

#! /home/lab/faculty/tomohiro/bin/octave -qf
Xmin = str2num ( nth ( argv, 1 ) );
Xmax = str2num ( nth ( argv, 2 ) );
fname = deblank ( nth ( argv, 3 ) );
printf("Xmin = % e\nXmax = % e\nfile name = %s,Xmin,Xmax,fname);

実行例
% ./test.sh 2.3 -4.1 sample.dat
Xmin = 2.300000e+00
Xmax = -4.100000e+00
file name = sample.dat

6. まとめ

MATLAB 互換数値計算ツール Octave を azusa にインストールする方法を説明した. また,Octave プログラムをスクリプトとして実行する方法を説明した. これによって ssh を利用してバッチ処理的に azusa を使用することが可能である.

しかし,今回説明した方法では Octave によって azusa の能力を十分に引き出す ことはできなかった. そのためには Itanium プロセッサ用に最適化された BLAS,LAPACK ライブラリが 必要となる. azusa に実装されている MathKeisan ライブラリはこれらを含んでいるはずである が,どの程度最適化されているかは不明である. 実際 MathKeisan ライブラリから Octave に必要な BLAS,LAPACK ルーチンを抜き 出しリンクさせてみたが思うような結果は得られなかった.

今後は,並列計算機として azusa の機能を引き出す方法を検討する必要がある. これに関して Octave の開発者達は MPI との連携を模索しているようである.

[研究報告の目次へ戻る]