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

Linux

X86

Xeon3.2GHz×2(1)

Xeon3.2GHz×2(2)

Opteron×2


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
Last-modified: 2015-03-01 (日) 01:15:59