精度保証数値計算演習5-2

学籍番号： 600p037-6 長友泰崇

演習 5-2. Scilab の ATLAS(or 最適化)BLAS による高速化を行え。

1 環境

実行環境は以下の通りである。

OS : Vine Linux 2.0 CPU : Mobile Intel Celeron 500MHz 数値計算ソフト : scilab-2.5 ・ octave-2.0.16 ・ atlas3.1.6D

2 Scilab の ATLAS による高速化

2.1 Scilab への最適化されたライブラリの組み込み

まず、

http://www.cs.utk.edu/~rwhaley/ATLAS

より、 ATLAS の最新バージョンである atlas3.1.6D のソース (atlas3.1.6D.tgz) をダウンロードした。

そして、次のように、 ATLAS をインストール、実行し、マシンに最適化されたライブラリを作成する。

 tar -xvzf atlas3.1.6D.tgz
 cd ATLAS
 make
 make install arch=Linux_PIII

これにより、最適化された LAPACK や BLAS などのライブラリが

~/ATLAS/lib/Linux_PIII/

に作成される。作成されたライブラリは

libatlas.a
libcblas.a
libf77blas.a

liblapack.a
libtsatlas.a

である。これらを

~/Scilab/libs/

にコピーする。

次に、この課題を提出していた河原君のやり方と同じように、 Makefile.OBJ の LIBRSCI = の下に、

 (SCIDIR)/libs/libatlas.a  \
 (SCIDIR)/libs/libcblas.a  \
 (SCIDIR)/libs/libf77blas.a  \
 (SCIDIR)/libs/liblapack.a  \
 (SCIDIR)/libs/libtsatlas.a  \

を書き加えて、 Scilab を再構築して、河原君と同じように、行列の乗算や、 LU 分解、 QR 分解、連立一次方程式などを実行してみると、河原君が述べていたように全く高速化されていなかった。

しかし、いろいろと調べているうちに、その高速化されていない原因がわかった。

それは、 Scilab を再構築する場合、 Makefile は Makefile.OBJ.in の中身を元に、再構成されるということである。

つまり、河原君のやり方のように、 Makefaile.OBJ を書き換えても、 Scilab を再構築すると、その際に何も書き換えられていない Makefile.OBJ.in をもとに新たに Makefaile.OBJ が生成される。

こいうわけで、河原君のやり方では、 Makefaile.OBJ の内容が何も変わっていないのである。 Scilab を再構築した後の Makefaile.OBJ を見てみると、確かに何も書き換えられていない。だから、高速化していないのは当然の結果である。

よって、 Makefile.OBJ を書き換えるのではなく、 Makefaile.OBJ.in の LIBRSCI = の下に

 (SCIDIR)/libs/libatlas.a  \
 (SCIDIR)/libs/libcblas.a  \
 (SCIDIR)/libs/libf77blas.a  \
 (SCIDIR)/libs/liblapack.a  \
 (SCIDIR)/libs/libtsatlas.a  \

を書き加える必要がある。

このように書き加えた後に、次のように Scilab を次のように再構築する。

 ./configure --with-tk
 make all
 make install

こうすれば、書き加えられた Makefile.OBJ が生成され、最適化されたライブラリを組み込んだ Scilab のインストールの完了である。

2.2 最適化ライブラリ適用による実行結果の検証

ここで、 ATLAS による最適化ライブラリを適用する前と、適用した後での実行時間の比較を、行列の乗算、 LU 分解、 QR 分解、連立一次方程式、固有値 の 5 つに分けて、それぞれ適用前、後について 5 回ずつ、実行時間を計測し、その平均時間を計算した。次の表は、その結果である。単位は (秒) である。

表 1: Scilab の ATLAS 適用前、後の実行時間の比較

ATLAS の適用前 ATLAS の適用後
行列の乗算  57.544  40.786
LU 分解  16.742  17.028
QR 分解  37.648  37.467
連立一次方程式  16.246  16.224
固有値  384.17  380.33

これより、行列の乗算だけは、少し高速化されていることが分かる。ほかの 4 つの項目については全く高速化されていないことが分かる。

高速化されていない原因を探るためにいろいろと考えていたら、 Web 上で、「Octave の ATLAS の高速化」についての HP を見つけた (参考 URL)。そこには、 ATLAS による Octave の高速化の仕方について事細かに記述してあった。また、実行結果の比較も記載されており、その結果によると、行列の乗算と LU 分解は、 10 倍以上も速くなっており、また、連立一次方程式は自分の Scilab のときと同様に、高速化されていなかったが、 QR 分解は約 2 倍速くなっている結果が出ていた。

そこで、実際にその HP に記述されいるやり方に従って、 Octave の高速化を確認して見ることにした。

3 Octave の ATLAS による高速化

3.1 Octave への最適化されたライブラリの組み込み

まず、 Scilab のときと同じように、以下のように、 ATLAS をインストールする。

tar -xvzf atlas3.1.6D.tgz
cd ATLAS
make
make install arch=Linux_PIII

次に、 ftp://ftp.u-aizu.ac.jp/pub/SciEng/numanal/Octave/ より、ダウンロードしてきた Octave のソース octave-2.0.16.tar.gz から、 Octave のインストールを次のように行う。

tar -xvzf octave-2.0.16.tar.gz
cd octave-2.0.16
sh ./configure
gmake FFLAGS=-O2 CXXFLAGS=-O2 CFLAGS=-O2

そして、次のようなやり方で ATLAS を Octave に組み込む。

cd ~/ATLAS/lib/Linux_PIII
mkdir tmp
cd tmp
ar x ~/ATLAS/lib/Linux_PII/libatlas.a
ar x ~/ATLAS/lib/Linux_PII/libcblas.a
ar x ~/ATLAS/lib/Linux_PII/libf77blas.a
ar x ~/ATLAS/lib/Linux_PII/liblapack.a
ar x ~/ATLAS/lib/Linux_PII/libtsatlas.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 ../../
gmake
gmake install

これで、 ATLAS によって最適化された Octave のインストールが完了する。 3.2 Octave の最適化ライブラリ適用による実行結果の検証

ここで Scilab のときと同じように、 ATLAS による最適化ライブラリを適用する前と、適用した後での実行時間の比較を、行列の乗算、 LU 分解、 QR 分解、連立一次方程式、固有値 の 5 つに分けて、それぞれ適用前、後について 5 回ずつ、実行時間を計測し、その平均時間を計算した。次の表は、その結果である。単位は (秒) である。

表 2: Octave の ATLAS 適用前、後の実行時間の比較

ATLAS の適用前 ATLAS の適用後
行列の乗算  56.635  5.6210
LU 分解  25.276  7.3488
QR 分解  74.375  32.540
連立一次方程式  18.718  15.685
固有値  310.76  242.42

この結果より、 HP 上に記載されていた結果とほぼ同様に、連立一次方程式以外は、きちんと高速化された結果を得られていることが分かる。

この結果をふまえて、 Scilab をきちんと高速化するには、 HP に記述されていた Octave への ATLAS による最適化と同じやり方を Scilab に対しても行えば、同じように高速化できるのではないかと考えた。

4 Octave の方法を用いての Scilab の高速化

そこで、上に述べた Octave のやり方で、改めて Scilab に ATLAS による最適化ライブラリを組み込ませようとした。 ATLAS を Scilab に組み込む際の手順で、 Octave のときに行っている命令で、 Scilab の場合に対応できているのか少し不明瞭な点があり、たぶん同じようにできているとは思うが、そのため絶対の自信を持っていえないが、一応、 Octave のやり方と同様にして ATLAS により最適化されたライブラリを組み込んだ Scilab をインストールすることができた。

しかし、その適用前と適用後の実行時間を比べてみると、その結果は、前の結果と同じで、 Octave のようには高速化していなかった。

それで、その原因を探るべく、いろいろと奮闘してみたが解決することはできなかった。しかし、調べていくうちに少しだけそのヒントは出てきたような気がするので、次章にその考察を述べる。

5 考察

いろいろと調べていくうちに考えついた結論として、まず ATLAS によって作成される*.a のライブラリはきちんと最適化されていて、そこまではうまくいっていると思われる。問題は、その生成されたライブラリをどうやって組み込むかということである。最初のやり方では、 scilab-2.5/lib/にある、ほかのライブラリの後ろに新たなライブラリを追加しただけであったが、その記載されている順序にも問題がありそうだと思い、いろいろと順序を変えてみたが、そうすると既存のライブラリが作成される過程で、その作成される元のファイルが他のフォルダ上にあったりして、ライブラリの生成ができなくなってエラーが起こってしまい、うまくいかなかった。

よって、推測ではあるが、うまく最適化ライブラリを Scilab に組み込ませるためには、他のライブラリの内容をよく読んで、その生成のされ方までに注目してうまく新しい最適化されたライブラリを組み込ませなかればいけないと思う。そうすれば、うまく組み込まれて、 Scilab の高速化が実現できるような気がする。最初のやり方において、行列の乗算について若干の高速化が認められたのは、後ろに追加するだけでも、一部だけうまく組み込ませることができたための結果ではないかと考えられる。

Octave にだけうまく組み込ませることができて、 Scilab にはできないということはありえないと思うので、どうにかすればうまくいくとは思うが、ただ、 Octave に比べて Scilab はその組み込ませ方が容易ではないということではないかと思う。

参考 URL:

http://mackako.im.uec.ac.jp/chiba-f/octave/octave_speed_up_by_atlas_j.html