$ tar zxf atlas3.16D.tgz $ cd ATLAS $ make $ make install arch=Linux_P5MMX
これにより, 各々のパソコンに最適化された LAPACK や BLAS などのライブラリが
/ATLAS/lib/Linux_P5MMX/
に作成される. 作成されたライブラリは
liblapack.a libcblas.a libf77blas.a libatlas.a libtstatlas.a
である.
cd ~/ATLAS/lib/Linux_PIII/ mkdir tmp cd tmp ar x ~/ATLAS/lib/Linux_PIII/liblapack.a ar x ~/ATLAS/lib/Linux_PIII/libatlas.a ar x ~/ATLAS/lib/Linux_PIII/libf77blas.a ar x ~/ATLAS/lib/Linux_PIII/libcblas.a ar x ~/ATLAS/lib/Linux_PIII/libtstatlas.a ar r ~/scilab-2.5/libs/*.a *.o cd .. rm -r tmp/とする.
ar コマンドは x を添えることにより, アーカイブファイルからオブジェクトファ イルを取り出すことができる. また r を添えることにより, アーカイブファ イルにまとめられたオブジェクトファイルを新しいオブジェクトファイルと取り換えることができる.
この後 Scilab を再構築する.
make all make install
CPU:Intel Celeron 500MHz MEM:192MB OS:Vine Linux2.1
であり Scilab, ATLAS のバージョンはそれぞれ
Scilab-2.5 atlas3.16
である.
1.行列の乗算 -->a=rand(1000,1000);b=rand(1000,1000); -->timer();x=a*b;timer() 2.LU 分解 -->a=rand(1000,1000); -->timer();[L,U,P]=lu(a);timer() 3.QR 分解 -->a=rand(1000,1000); -->timer();[Q,R,P]=qr(a);timer() 4.連立一次方程式 -->a=rand(1000,1000);b=rand1000,1); -->timer();x=a\b;timer()という計算を行ってみる.
ATLAS を適用しない場合 | ATLAS を適用した場合 | |
a*b | 40.02 | 40.58 |
lu(a) | 16.17 | 16.19 |
qr(a) | 34.71 | 35.29 |
a\b | 15.99 | 15.76 |
liblapack.a libcblas.a libf77blas.a libatlas.a libtstatlas.a
を
/Scilab-2.5/libs/
にコピーする. 次に, Makefile を読んでいくと libs の組み込みは Makefile.OBJ で行われている. その Makefile.OBJ は Makefile.OBJ.in から 作成されているので Makefile.OBJ.in を書き換えて Scilab に最適化されたライブラリを組み込む. 実際には
LIBRSCI = $(SCIDIR)/libs/liblapack.a \ $(SCIDIR)/libs/libcblas.a \ $(SCIDIR)/libs/libf77blas.a \ $(SCIDIR)/libs/libatlas.a \ $(SCIDIR)/libs/libtstatlas.a
というコメントを Makefile.OBJ.in に付け加える.
Makefile.OBJ.in を変更した後, Scilab を再構築する.
./configure --with-tk make all make install
これで最適化されたライブラリを組み込んだ Scilab のインストールの完了である.
ATLAS を適用しない場合 | ATLAS を適用した場合 | |
a*b | 40.02 | 41.70 |
lu(a) | 16.17 | 16.58 |
qr(a) | 34.71 | 35.28 |
a\b | 15.99 | 15.97 |
そこで一度, Scilab から離れて ATLAS による高速化が比較的簡単な Octave の高速化を試してみる.
cd ~/ATLAS/lib/Linux_PIII/ mkdir tmp cd tmp ar x ~/ATLAS/lib/Linux_PIII/liblapack.a ar x ~/ATLAS/lib/Linux_PIII/libatlas.a ar x ~/ATLAS/lib/Linux_PIII/libf77blas.a ar x ~/ATLAS/lib/Linux_PIII/libcblas.a ar x ~/ATLAS/lib/Linux_PIII/libtstatlas.a ar r ~/octave-2.0.16/libcruft/libcruft.a *.o cd .. rm -r tmp/とする. 次に Octave を再構築する.
cd ~/octave-2.0.16/libcruft/lapack/ g77 -O2 -c ilaenv.f cd ../../ make make installこれによって Octave に ATLAS を組み込むことができた.結果は次のとおりで ある.
ATLAS を適用しない場合 | ATLAS を適用した場合 | |
a*b | 52.030 | 5.523 |
lu(a) | 17.431 | 2.602 |
qr(a) | 66.939 | 27.024 |
a\b | 16.064 | 16.236 |
Scilab にもうまく組み込むことができたならば, 行列の乗算・ LU 分解などが 高速化されると思われるのでその命令の仕組みを調べて高速化することを試み る.
Scilab の命令の仕組みを考える前にまず, ATLAS による高速化に成功してい る Octave の命令系統を調べる.
octave-2.0.16/liboctave/dMatrix.ccにおいて LEVEL3 BLAS の dgemm を呼び出すことによって行列の乗算を行って いる.
また, LU 分解については
octave-2.0.16/liboctave/dbleLU.ccにおいて LAPACK のドライバルーチン dgesv を呼び出しており, LAPACK の dgesv を見るとその中で LAPACK の計算ルーチン dgetrf を呼び出して LU 分 解を行っている.
以上のような命令系統になっているので, Octave においては ATLAS によって 最適化された LAPACK および BLAS を利用することによって高速化を行うこと ができた.
行列の乗算は,
scilab-2.5/routines/interf/matops.fの subroutine の matmult で行われている. しかし, ここでは BLAS や LAPACK のルー チンは呼び出されておらず, 別の計算方法によって行われている.
また, LU 分解は
scilab-2.5/routines/interf/matlu.fの subroutine の intlu で行われているが, ここでも BLAS や LAPACK のルーチンを 呼び出すことなく計算が行われている.
よって, ATLAS により最適化された BLAS や LAPACK をいくら組み込んでも高 速化することができない.
そこで今度は特定のコマンドについて高速化することを試みる.
scilab-2.5/routines/interf/matops.fの subroutine の matmult で行われているのだが, 読んで行くと実際には matrix * matrix の項目で dmmul を呼び出して行われている.
そこで dmmul を探していくと
scilab-2.5/routines/calelm/に dmmul.o がある. このオブジェクトは,
dmmul.f dmmul.f.n dmmul.f.sという 3 つの FORTRAN で書かれたプログラムからなっている. しかし, 実際 には dmmul.f.s が dmmul.f にコピーされているだけである. dmmul.f を読んでいくと Scilab 独自の方法で計算が行われている. そこでプログラム を書き換えることによって, BLAS のルーチンを使用し高速化することを考え る.
ここで, dmmul.f.n も見てみると, BLAS の dgemm を呼び出して行列の乗算を するプログラムが書かれている. そこで, このプログラムを dmmul.f に上書 きすれば良い.
上書きした状態で, さらに ar コマンドにて ATLAS によって最適化された BLAS や LAPACK などを組み込んだ状態にしてから再構築をする. これで行列 の乗算については最適化されたと思われる.
ATLAS を適用しない場合 | ATLAS を適用した場合 | |
a*b | 40.02 | 5.67 |
lu(a) | 16.17 | 16.52 |
qr(a) | 34.71 | 31.89 |
a\b | 15.99 | 15.92 |
File translated from TEX by
TTH, version 2.80. Modified by Shin'ichi
Oishi
On 31 Jan 2001, 13:44.
©Shin'ichi OISHI@Waseda University
URI: http://www.oishi.info.waseda.ac.jp/~oishi/FAQ/tani2.html