ATLASとR のビルド
現在はATLASを使いたいのサマリーページのつもりです
気が付いた時点で追加、修正をしていきます
というより、このあたりよく知っている方の修正を希望(2chではありません)します
(R用?)ATLASのビルドに関する事項はこちらで情報交換しましょう
マシン毎に最適化されたBLASを構築します最適化の対象としてCPUのキャッシュサイズや 並列(スレッド)化を行います.並列化ATLASとRのプロファイリング機能は不仲なので同居 不可である点に注意してください.
deb化されています.atlas3-sseなどCPU別のATLASをインストールするだけです. Rをapt-getなりdpkgでインストールすれば何もせずともATLASをすぐに利用できます. lam-mpi,snow,rmpi等と併用すると,「野良ビルド無し(apt-getだけで)」ですぐにR の並列化が行えます.Rユーザには夢のディストリビューションと言っても過言では ありません.
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.
できあがると,
本体 | 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 ^^ ^^^^^^^^^
がリンク時に最低限必要となります.
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 は通らないでしょう.
だいたい大丈夫です.
たぶん(?)大丈夫です.# メジャーな環境では無いので
make make install arch=***** # rootである必要はありません
./configure --with-blas='-L/usr/local/lib -lf77blas -latlas'
# xconfigで識別出来なかった場合はUNKNOWNなCPUとして扱われる # このため、適切なパラメータを得るためビルドには相当時間を擁する make install arch=Linux_UNKNOWNSSE2
./configure --with-blas="-L/usr/lib -lf77blas -latlas"
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
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
./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
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である必要はありません
./configure --disable-R-profiling --with-blas='-L/usr/local/lib -lptf77blas -latlas -lpthread'
> 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
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の方が良いこともあるかもしれません。
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