ATLASとR のビルド

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



概観

マシン毎に最適化された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用
シングルスレッド版libf77blaslibcblas
マルチスレッド版libptf77blaslibptcblas
本体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 は通らないでしょう.

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'

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


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

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1727d)