Slab

Slabを公開します

SlabはMATLABに似た数値計算ツールですが、精度保証ができるように改良されたものです。MATLABと同様LAPACACKをもとにして、これを使いやすくするインタプリタとなっています。ライスセンスはGNU-ライセンスとしました。Slabが作られた経緯についてはすでに報告(数値計算インタプリタをつくろう)してありますので、参照してください。改めて、Slabの元になったcalc(電卓を作ってみよう)の作者である前橋和弥氏に感謝いたします。前橋さんのcalcとSlab1.20がどのくらい違っているかが、大石が行った作業です。比べてみてください。大石はcalcの大変な拡張可能性に敬意を表したいと思います。また、早稲田大学理工学部情報学科の3,4年生の学生諸君のアイディアも取り入れています。これについては、先の報告の部分にある、学生の作品と比べてみて下さい。学生諸君にも感謝します。以上のような経緯で、ソースを公開されている方々の蓄積の上にこのSlabがあります。これが、GNU-ライセンスでSlabのソースを公開することの大きな動機となっています。また、それと同時に著者の研究テーマが精度保証付き数値計算であるので、ソースを公開する必然性もあります(プログラムが証明の一部になるのです)。さて、Slabは基本的にLinuxの上でインストールすることを前提としています。しかし、丸めのモードの変更の命令以外はcygwinでもSunの上でも共通と思いますので、簡単な変更でwindowsの上やSunの上でも動かすことができると思います(8/31 X on Windows(Cygwin)上で丸めのモードの変更の命令も含めて動くように変更したバージョンを作りました。ソースとバイナリを共に含むバージョンはここからダウンロードできます)。

準備--clapackをインストールしよう--

Slabをインストールするためにはclapackをインストールする必要があります。clapackはここからダウンロードすることができます。clapackのインストール法については大西さんのページが参考になります。clapackをインストールしてできあがったライブラリlapack.a, blas.a, libF77,aとlibI77.aをそれぞれliblapack.a, libblas.a, libF77,aとlibI77.aと名前を変更して保存しておいて下さい。尚、blasをATLASなどで生成すれば、高速化が達成されて、MATLABと同等か若干ですが高速となるときもあります。

ダウンロード

  1. (ソースバージョン) Slabの現在のバージョンはSlab1.20です(2002年8月15日現在)。Slab1.20のソースファイルをtarで圧縮したファイルをここ(Slab120.tgz)に置きますのでダウンロードしてください。Slab120.tgzのパッチファイル(福原 誠 (電気通信大学 情報工学科 計算科学講座)先生からのパッチ)
  2. (コンパイル済みバージョン) Windows XP Cygwin+Centrinoのもとで、コンパイルしたSlab123_cyg.tgz (ATLAS対応,2003/5/11)
  3. (コンパイル済みバージョン) Linux(Redhat 7.2+Centrino)のもとで、コンパイルしたSlab123.tgz (ATLAS対応,2003/5/11)
  4. (コンパイル済みバージョン) Mac OSX.2.6+PowerBook G4のもとで、コンパイルしたSlab123_g4.tgz (ATLAS対応.2003/5/11)

Slabのインストール

Vine Linux 2.5やTurbolinux8 WorkstationなどRedhat 7.2系では動作を確認しています(Redhat 7.3には未対応)。そこで、これらのLinuxを想定して以下インストール法を説明します。

ステップ1

まず、Linuxの適当なディレクトリにダウンロードしたSlab120.tgzを置き、解凍します。それには

tar xvzf Slab120.tgz

と打ちます。

ステップ2

解凍してできるSlab1.20というディレクトリに移ります。

cd Slab1.20

(2002/9/21追加:

ここで、つぎのパッチファイル(福原 誠 (電気通信大学 情報工学科 計算科学講座)先生からのパッチ)をダウンロードして、Slab1.20のディレクトリにおき、

patch -p1 < fuku.patch

とパッチを当てます。Makefileをみればわかるように、ATLASによって生成された最適化BLASを使いたい場合も、このパッチで対応されています。

追加終わり)

ステップ3

さらに、多倍長演算のソフトをインストールします。尚、ここのソースはMPAと呼ばれるもので、tomyさんの作になるものです。

cd ./mpa

make

とします。そして、元のSlab1.20のトップディレクトリに戻ります。

cd ..

ステップ4

次に、ガーベージコレクタgcをインストールします。

cd ./gc

./configure

make

とします。そして、元のSlab1.20のトップディレクトリに戻ります。

cd ..

ステップ5

そして、準備しておいた、liblapack.a, libblas.a, libF77,aとlibI77.aを(Slab1.20のトップディレクトリ)/tools/に入れます。ただし、ダウンロードしたSlab120.tgzにはRedhat7.2用のものが既に入っていますので、それに必要に応じて上書きしてください。

ステップ6

Slab1.20のトップディレクトリで

make

としてインストール完了です。

Slabを動かそう

SlabはSlab1.20のトップディレクトリで動かすことを想定しています。そこで、そのディレクトリで

./Slab

とするとSlabが起動します。A>がプロンプトです。使い方は

A> help

としてみると説明がでてきます。

また、Slabの使い方の解説を書きましたので、参照してください。

コメント

富士通総研の田澤陽一さまから次のようなご指摘を頂いておりました(Monday, November 18, 2002 3:30 AM)。大変重要なご指摘なので、ここに田澤様の許可を得て掲載いたします。

最近先生の本やHPを読み返し、またSlabを試しているときに、少々気がついたことがあります。やや長くなりますが、お許し下さい。

<< 1. Cygwin版Slabが異常終了するケース >>
Windows2000+Cygwinで次のスクリプトを実行します。(Aは正則行列です)

A=[1,2,3;3,4,0;5,6,7]
b=[1;1;1]
x=A\b
!
5/0
x=A\b

精度保証モードに入り、5/0までは正常に実行されますが、x=A\bのところで
Slabが異常終了してしまいます。

また、精度保証モードに入ってからの演算を、x=A\b、5/0の順番に入れ換え
ると、x=A\bは正常に実行され、最後の5/0のところで異常終了します。

以上の現象は、Cygwin版Slabのソースのround.cのx87 FPU control word
の設定を次のように変更すれば回避できます。

*** ./round.c Fri Aug 30 21:37:34 2002
--- ./round-rev.c Sun Nov 17 04:25:38 2002
***************
*** 2,8 ****
#include <float.h>

! static int _RoundUp = 0x1b3a;  /* 1101100111010b */
! static int _RoundDown = 0x173a; /* 1011100111010b */
! static int _RoundNear = 0x133a; /* 1001100111010b */

void up(void) {
--- 2,8 ----
#include <float.h>

! static int _RoundUp = 0x0b7f; /* 0101101111111b */
! static int _RoundDown = 0x077f; /* 0011101111111b */
! static int _RoundNear = 0x037f; /* 0001101111111b */

void up(void) {

!!右側のビット列は、比較のため後から書き加えたものです。!!
修正後の各control wordは、Linuxにてfpu_control.hをincludeして
定義した場合と等価になっています。(Vine 2.5/glibc-2.2.4)

<< 2. Slab以外の数値計算システム >>
x87 FPUのcontrol wordを上の元々のCygwin版Slabと同じ値に定義
すると、他の数値計算システムでも丸めモード切替えに関連して、予期
しない異常終了が起きるケースがあるようです。

例えば先生のHPにmkoctfileを利用したOctaveの丸めの制御例
(岩村誠さん)がありますが、そのsetround.ccの中のcontrol wordを、
ヘッダファイルを使わずに直に16進ワードで定義してみると、Cygwin
(Windows2000/98)だけではなく、Linuxでも異常終了します。
(注:Octave 2.1.37以降、Cygwinでもmkoctfileが出来るようになりました)

この現象も、上記の修正済みSlabと同じ値をcontrol wordに与えることで
回避できます。特にレジスタ0(invalid operation)とレジスタ2(zero divide)
が有効(ビット=0)か無効(ビット=1)かが重要な違いと思われます。

<< 3. CygwinおよびLinuxにおける丸めモード切替一般について >>
コントロールレジスタについては、ご存じの点も多いと思いますので詳細
を省略しますが、仕様書を見るかぎり、レジスタ0から5のexception
control registerが有効になっていると、exceptionが発生してからその
フラグをクリアする前に新しいcontrol wordをロードすると(例えば丸め
モードを切替えると)、floating point errorになるようです。

fpu_control.h準拠の丸めモード切替えではexception control register
は全てマスクされているので(ビットが1)、errorにならなかったようです。
(申し訳ないのですがアセンブラレベルでの実験まではしておりません)

丸めモード切替時にzero divideなどのexceptionも「有効」モードに切替え
るのであれば、exception発生の有無をテスト -> exception有りの場合は
fclex/fnclexでexception flagをクリア -> fldcwで新しいcontrol wordを
ロード、という手順が無難ということかも知れません。

謝辞

Slabの作成に当たり、文科省の科研費並びに早稲田大学の特定課題研究費、アンリツの委託研究費などを補助として頂いています。ここに謝意を表します。また、Slabは精度保証付き科学技術計算という早稲田大学理工学研究所のプロジェクト研究の一貫としても開発されています。


このページのURIはhttp://www.oishi.info.waseda.ac.jp/~oishi/slab/slab.htm

ページ開設 2002/8/16、追加 2002/8/31(Windows版を加える)、追加 2002/9/21 福原 誠 (電気通信大学 情報工学科 計算科学講座)先生からのパッチを追加、追加 2003/5/11 ATLAS対応版