COLOR(red){SIZE(25){ATLASとR のビルド}}

現在は[[ATLASを使いたい>Q&A (初級者コース)#ATLAS]]のサマリーページのつもりです~
気が付いた時点で追加、修正をしていきます~
というより、このあたりよく知っている方の修正を希望(2chではありません)します~
(R用?)ATLASのビルドに関する事項はこちらで情報交換しましょう~



#contents
~



#comment

*概観
マシン毎に最適化されたBLASを構築します最適化の対象としてCPUのキャッシュサイズや
並列(スレッド)化を行います.並列化ATLASとRのプロファイリング機能は不仲なので同居
不可である点に注意してください.

*ディストリビューション固有の情報
**debian
deb化されています.atlas3-sseなどCPU別のATLASをインストールするだけです.
Rをapt-getなりdpkgでインストールすれば何もせずともATLASをすぐに利用できます.
lam-mpi,snow,rmpi等と併用すると,「野良ビルド無し(apt-getだけで)」ですぐにR
の並列化が行えます.Rユーザには夢のディストリビューションと言っても過言では
ありません.

*xconfigのオプション指定
xconfigにオプションを指定することにより自動認識では無く指定したオプションで
ATLASを構築可能です.たとえば,16CPU搭載マシンで16並列にしても嬉しくはありま
せんから,CPU数を4や8で構築したい場合があると思います.libgotoとは異なり,構築
後に並列数の指定は出来ません.~
経験では並列度の効果はだいたい16で頭打ちになります.
小さな行列の存在なども考慮すれば2〜4,巨大なら8ぐらいがいいのかなと~
ATLAS自体を動的共有化(.so)にして,LIBPATH,LD_LIBRARY_PATHなどで並列数
を切替えて使うのもありかと思います.~
R+シングルATLASのプロファイリングで十分チューニングした後,~
並列化を行うのが吉かもしれません.~
Rで利用するには再配置可能なオブジェクトを生成する必要がありますので,初心者
の方はなんとなくxconfig後にMake.hogeのファイルに-fPICを追加するのがいいかと
思います.~
動的共有ライブラリ(.so)を作るには-fPIC(Intel系は全ての石で)必要です.
xconfigを起動すると色々聞かれますが,きっと誰かが詳しく書いてくれることを信
じます.
 $ ./xconfig --help
 USAGE: ./xconfig [flags]
 
   -A #           : Set config mach to #
   -C 'string'    : Add string to CDEFS
   -D #           : Set various levels of what config will do (additive):
      0           : Create Make.ARCH and config logfiles only
      1           : Unpack & set arch defauls
      2           : Create ARCH subdirectories
      4           : Create the ATLrun shell script
      8           : If needed, create winf77.exe
     16           : Store the known L1 value
     32           : Move the config logfiles to ARCH subdir
   -N #           : Set ncpu to #
   -t <TOPdir>    : Set TOPdir as indicated
   -a <arch>      : Set ARCH to <arch>
   -b <1/blaslib> : Use this BLAS for BLASlib (1: search for blas)
   -f <f77>       : Use <f77> for F77
   -c <CC>        : Use <CC> for CC
   -m <MM>        : Use <MM> for MCC
   -g <gcc>       : Use <gcc> for gcc
   -x <XCC>       : Use <XCC> for XCC
   -F [c,f,m,x] '<flags>': set the indicated compiler flags
 NOTE: If a compiler is specified without flags, ATLAS will try to fill in
      appropriate flags.  This is the recommended way to get config to select
      a non-default supported compiler.

*make install arch=xxxx

できあがると,
|                   | 本体    | fortran用   | C用      |
|シングルスレッド版 |         | libf77blas  |libcblas  |
|マルチスレッド版   |         | libptf77blas|libptcblas|
|本体               |libatlas |             |          |
が出来ます.
良く分からない人は 各.aファイルを /usr/local/libに入れてください.


ATLASを使う場合、(--with-blasのオプション)
 # シングルスレッド版
 -L/usr/local/lib -lf77blas -latlas
 # マルチスレッド版
 -L/usr/local/lib -lptf77blas -lpthread -latlas
                    ^^        ^^^^^^^^^
がリンク時に最低限必要となります.

*ATLASとCompiler
**IntelCompiler
IA32では,FTZ (Flush-to-Zero) モードや DAZ (Denormals-are-Zero) モード
が設定できて,Ver8.1以降ではIntelCPUならデフォルト(-O0以外)で(libirc内で)設定します.
この影響はlibimf(-lmの代わり)にも顕著に表れて,
例えば,
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 
 #ifdef __INTEL_COMPILER
 #include <xmmintrin.h>
 #include <pmmintrin.h>
 #endif
 
 #define XPRINT(x) printf(#x "=%x\n", x )
 #define GPRINT(x) printf(#x "=%g\n", x )
 
 main()
 {
 	double d_2e_308 = 2e-308;
 	printf("current\n");
 	GPRINT(log(d_2e_308));
 #ifdef __INTEL_COMPILER
 	XPRINT(_MM_GET_FLUSH_ZERO_MODE());
 	XPRINT(_MM_GET_DENORMALS_ZERO_MODE());
 
 	_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF);
 	_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF);
 
 	printf("seting\n");
 	GPRINT(log(d_2e_308));
 	XPRINT(_MM_GET_FLUSH_ZERO_MODE());
 	XPRINT(_MM_GET_DENORMALS_ZERO_MODE());
 #endif
 }
なども、素敵な値を返してくれます.ただし,AMDのCPUではFTZ,DAZは設定して
くれないので安全な値が帰ります.:-)

Rで利用するなら,
http://www.nakama.ne.jp/memo/ia32_linux/R-2.1.1.iccftzdaz.patch.txt
などを当てないと,make check は通らないでしょう.

IA64ではicpc(C++)は例外をIEEE風に処理できません.
**gcc
だいたい大丈夫です.
**xlc
たぶん(?)大丈夫です.# メジャーな環境では無いので

*Tips
-作成された「.a」をパスの通っているディレクトリへ、コピー
--パスの通ったディレクトリとありますが(ライブラリの検索はパスとは無関係です),野良ビルドモノなので/usr/local/libあたりが適切かと思います(このとき必要なのはlibatlas.a,libf77blas.aおまけでlibclbas.aです)
-./configure --with-blas='-L/usr/local/lib -lf77blas -latlas' (-L:ここのライブラリ見てね, f77blas:ATLASのFortranシンボル窓口, atlas:そう、本体が無い!)としてください
-動的共有ライブラリを作るなら,Makefile内にatlas.soの作り方が書いてあります. 動的共有ライブラリを作る場合はビルド時に-fPICが必要(デフォルトはそうなってたかも)かもしれません
-動的共有ライブラリを使う場合は,/etc/ld.so.confに格納場所を追加して/sbin/ldconfig するか, Rビルド時に -rpath を加えるかするといいかと思います
-R の configure スクリプトは単に sgemm_ をリンクできるかどうかをチェックしているだけなので、libf77blas.a に sgemm_ が含まれているかを調べた方がいいです。商用コンパイラで生成した ATLAS の場合、sgemm ("_" がないのがミソ) となる場合があります。チェック方法は nm libf77blas.a | grep sgemm_ で T のシンボルが出れば大丈夫です
-ついでに config.log の該当部分を書き写してくれると一発で幸せになれます

* Linux
**X86
-ATLAS
 make
 make install arch=***** # rootである必要はありません
-R
 ./configure --with-blas='-L/usr/local/lib -lf77blas -latlas'
#comment
**Xeon3.2GHz×2(1)
-atlas3.6.0(stable)
-なのに、なぜかCPU一個しか使わない設定でコンパイルしてます。2個は現在トライ中
-(なぜかCPUに負荷をかけないとコンパイルが正常に終了しません、stable版だからか?Developer (unstable)だと、CPU2個使う設定でわざわざ負荷をかけたりしなくても正常にコンパイルできました)
-メモリ2Gbyte
-Red Hat Enterprise Linux WS release 3 (Taroon) Kernel 2.4.21-4.ELsmp on an i686
-ATLAS
 # xconfigで識別出来なかった場合はUNKNOWNなCPUとして扱われる
 # このため、適切なパラメータを得るためビルドには相当時間を擁する
 make install arch=Linux_UNKNOWNSSE2
-R
 ./configure --with-blas="-L/usr/lib -lf77blas -latlas"
-結果
--test2関数
 test2 <- function ( n=500 )
 {
 	A<-array(rnorm(n^2), dim=c(n,n))
 	B<-array(rnorm(n^2), dim=c(n,n))
 	C<-array(rnorm(n^2), dim=c(n,n))
 	D<-array(rnorm(n^2), dim=c(n,n))
 	BA <- B%*%A 
 	return (system.time(A%*%solve(t(BA)%*%BA+C)%*%BA%*%D ))
 }
--導入前
 > test2()
 [1] 2.24 0.08 2.33 0.00 0.00
 > test2()
 [1] 2.26 0.06 2.33 0.00 0.00
 > test2()
 [1] 2.27 0.05 2.32 0.00 0.00
--導入後
 > test2()
 [1] 0.46 0.07 0.54 0.00 0.00
 > test2()
 [1] 0.45 0.06 0.51 0.00 0.00
 > test2()
 [1] 0.43 0.05 0.48 0.00 0.00
~
#comment
**Xeon3.2GHz×2(2)
-atlas3.7.10 Developer (unstable)
-stableだと、CPU2個使う設定で、コンパイルができませんでした。なので、Developerを使用
-メモリ2Gbyte
-Red Hat Enterprise Linux WS release 3 (Taroon) Kernel 2.4.21-4.ELsmp on an i686
-ATLAS
 make xconfig
 ./xconfig -F f '-fomit-frame-pointer -O3 -funroll-all-loops -fPIC' ?
           -F c '-fomit-frame-pointer -O3 -funroll-all-loops -fPIC' ?
           -F m '-fomit-frame-pointer -O -fPIC'
 
 make install arch=Linux_P4ESSE3_2
 
 cp lib/Linux_P4ESSE3_2/libatlas.a /usr/lib
 cp lib/Linux_P4ESSE3_2/libptf77blas.a /usr/lib
--P4として、認識されています
-R
 ./configure --disable-R-profiling --with-blas='-L/usr/local/lib -lptf77blas -latlas -lpthread'
 make
 make check
 make install   #rootで
-結果
 > test2()
 [1] 0.13 0.04 0.43 0.33 0.02
 > test2()
 [1] 0.11 0.06 0.43 0.34 0.02
 > test2()
 [1] 0.16 0.02 0.42 0.30 0.05
--先の結果より気持ち早くなっています。2個使う設定のためなのか、Developerのためなのか、余力があったら、試してみます、、、
**Opteron×2
-ATLAS
 make xconfig
 ./xconfig -F f '-fomit-frame-pointer -O -m64 -fPIC' ?
           -F c '-fomit-frame-pointer -O -mfpmath=387 -m64 -fPIC' ?
           -F m '-fomit-frame-pointer -O -mfpmath=387 -m64 -fPIC'
 make install arch=Linux_HAMMER64SSE2_2 # rootである必要はありません
-R (ATLASのスレッドとR-profilingは不仲!)
 ./configure --disable-R-profiling --with-blas='-L/usr/local/lib -lptf77blas -latlas -lpthread'
-導入前は、大体4−5秒かかっていたのが
 > test2()
 [1] 0.76 0.05 0.57 0.00 0.00
 > test2()
 [1] 0.75 0.07 0.58 0.00 0.00
 > test2()
 [1] 0.75 0.06 0.56 0.00 0.00

#comment
* Solaris

* FreeBSD

**x86

ATLAS、R共にportsから導入可能。ただし、ATLASは2次キャッシュ容量がデフォルト設定のままでコンパイルされる(最適化時にちゃんと設定されていくのかもしれませんが)ので、x86の場合はMakefileの
 ANSWER_i386?=	${PRINTF} "\n\n\n\n\n\n\n\n\n\n"
を
 ANSWER_i386?=	${PRINTF} "\n\n\n\n512\n\n\n\n\n\n"
などとする(2次キャッシュ512KBの場合)。portsからインストールするとマルチスレッド版も自動的に作成されます。

Rは標準では通常のBLASを利用するようになっています。portsから以下のようにしてインストールするとATLASを利用するようにして導入できます。
 make WITH_ATLAS=yes all install clean

ちなみに、FreeBSD portsから導入できるATLASにはmath/atlas(Stable)とmath/atlas-devel(Unstable)の2種類あります。通常はStable版を使う方が良いでしょうが、最新のCPUではUnstableの方が良いこともあるかもしれません。

* Windows

* Mac

PowerBook G4 (1.25GHz) 、OSX10.4.1上でATLAS、LAPACK( http://www.netlib.org/lapack )、R-2.1.1をビルド。ATLASはデフォルト設定でコンパイルし、Linux用makefileを転用してコンパイルしたLAPACKにATLASからのliblapack.aをマージしています。

コンパイラは、Apple製gcc 4.0.0(20041026)、g77 3.4.3(fink)で、CFLAGS、FFLAGSともに、
 -O3 -I/sw/include -I/usr/local/include -mcpu=7450 -faltivec -mtune=7450 -mpowerpc-gfxopt -fno-common
としています。
コンパイルは以下のように行いました:
  LDFLAGS="-lcc_dynamic" ./configure --with-blas --with-lapack="-L/usr/local/lib -llapack -lcblas"  --with-aqua

"--with-lapack"オプションに-lcblasを付加したのは、途中でcblasのシンボルが無いと叱られたため。--with-blasには何のオプションもつけていませんが、ATLASが存在する場合はそれを優先するようです。LDFLAGSは
Mac OSXでg77を使う場合に頻発するrestFP/saveFP問題
( http://www.astro.gla.ac.uk/users/norman/note/2004/restFP/ )
を考慮しています。この辺の事情は疎いので、ご存知の方がいらっしゃいましたらご指摘下さい。(errataに書いてありますよ)

あとは、make; sudo make installすれば問題なくATLASを使ったRがインストールされます。
以下は、vecLib版RとATLAS版Rの簡単素朴な性能比較です:
 ## mは1000x1000行列
 ## vecLib版R
 > system.time(m%*%m)
 [1] 1.58 0.05 1.92 0.00 0.00
 > system.time(svd(m))
 [1] 24.96  0.95 34.18  0.00  0.00

 ## ATLAS版R
 > system.time(m%*%m)
 [1] 1.69 0.07 1.81 0.00 0.00
 > system.time(svd(m))
 [1] 19.73  0.93 22.74  0.00  0.0

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS