COLOR(red){SIZE(25){RとGotoBLAS}} #contents *概要 [#m9553517] 現在, GotoBLASの開発は終了しており, TACCにあるバージョンだと, 若干の不具合が知られています. 昨年の暮れにTACCよりBSDにライセンスが変更されたのでこのバージョンを元に修正を行っています. 追記:ずっとRCのままにして放置してあったのを, ちょこっと弄りました. 配布は, [[SurviveGotoBLAS2:http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/]]で行っています. ライセンスはAGPL-3です. *Rユーザ向けの為の変な変更 [#ua69ddf0] そのままでは一般の方には使いにくいので, いくつかの変更を加えました. ソースからビルドを行う方は, 以下のパラメータを指定しなければ, 後で苦しむ事になります. また割と多くのアプリケーションでは, BLASとLAPACKのライブラリを分けた状態でリンクしているので, これをビルド時に分割するように変更を加えました. ** REFBLAS_ANTILOGY=1 [#tf16ef47] これはREFBLASの実装ではLAPACKに入ってるルーチンを一部GotoBLASではBLAS側に持っています. なのでこれをLAPACKのアーカイブに移すように指示します. ** NO_LAPACK=1 [#ec38c7d6] GotoBLASではLAPACKルーチンの一部しか最適化されていないのと, ビルド時にLAPACKをnetlibからダウンロードします. オリジナルはwgetが必要でしたが, 無ければcurlやftp等あるものでダウンロードするように変更を加えてます. オリジナルはmd5も必要でしたが, これもopenssl md5も試すようにしました. 内部の計算機からnetlib.orgに繋げない方や, netlib.orgは時々落ちているので, そんな時の為の設定です. ** NO_XERBLA = 1 [#fd9533c6] これはxerblaをアプリケーション側で持っている場合で, リンク時にxerblaが無くても問題が無い環境向けです. 例えば, OSXなどです. ** EXTERNAL_XERBLA_LIBNAME = R.dll [#cf4d6d20] これはxerblaをアプリケーション側で持っている場合で, リンク時にxerblaが無いと困る環境向けです. 例えば, Windiwsなどです. 内部的には NO_XERBLA=1に設定して, xerbla.cをR.dllに生成して リンクします. ** LAPACK_VERSION = 3.1.1 ,3.2.1, 3.2.2, 3.3.0 or 3.3.1 ( default is 3.1.1 ) [#y8a977df] ** LAPACK_VERSION = 3.1.1 ,3.2.1, 3.2.2, 3.3.0 or 3.3.1 ( default is 3.3.1 ) [#y8a977df] なんとなく作ってみました. 新しく増えたルーチンを使いたい場合等によいかも. *各OS固有の情報 [#i906d6ed] **Apple [#e9d88821] ***PowerPC [#yf88071a] Rは倍精度ルーチンしか使わないので, 単精度ルーチンのaltivecを無効にしています. 以前は問題がありましたが, 不具合は取れてると思います. ***Intel [#g02b2293] 大丈夫だと思います. **AIX [#vcbc6281] POWER4,5,6で動作を確認しています. 以前は問題がありましたが, 不具合は取れてると思います. 性能は1パッケージ(2CPU)までは出ますが, 3並列以上は全くリニアに向上しません. 正直, 電気代で巷に売られているパソコンのご購入をお勧めします. **Solaris [#kef0f1fa] Sparc64VIIでしか試してません. SSLだと静的にしかビルド出来ませんし, Sunperf も含めてSPARCでは商用BLASだと2のべき乗サイズで 劇的に性能が劣化するので, GotoBLASは良い選択肢です. **Linux [#n5ec4a86] ***PowerPC [#gff1db9f] CPUのAffinityを設定可能にしましたが, NO_AFFINITY=1との違いが結構微妙でした. Appleと同じく, altivecは無効です. ***Intel [#tbf5e43a] 大丈夫だと思います. AFFINITY(デフォルトは設定)を設定した場合は物理CPU数を得ますが, NO_AFFINITY=1だと, 論理CPU数が スレッド数になります. AFFINITY(デフォルトは設定)を設定した場合は物理CPU数を得ます, NO_AFFINITY=1だと, 論理CPU数だったのを物理CPUを得るように変更しました. **Windows [#q0ecf427] オリジナルには実装されていなかった, goto_set_num_threads, goto_get_num_procs の関数を実装してあります. CPU数は物理CPU数を得るようになっています. *** x86 [#id3ca2d1] 現在のRは4byte境界で実行されているので, KATMAIでしか動きません. パッケージも全てgccであれば調整は可能ですが, そんな訳は無いので取り組んですらいません. さっさと64bitにするべきです. 32bitでは例えNehalem(icore7)のCPUでもx86では動作するCoreはPenrynと同じものです. *** x64 [#rf5191b6] 大丈夫だと思います. ただAVXには対応してませんが, Nehalemカーネルを選択するように変更してますので, Rユーザであれば(所詮BLASの効果は限定的)問題なく利用できると思います. *ソースからビルド方法 [#d75f07ea] 公開しているバイナリはBLASだけです. 一部最適化されたLAPACKルーチンを利用したい場合は 以下のようにしてください. ディレクトリのトップにquickbuild.osxRblasや, quickbuild.winRblas32_on_debian とか, ファイルが置いてありますので, それを参考にしてください. ** Windows [#edfd4d7f] libgfortranは静的にビルドされる筈です. Rtoolsでも大丈夫です. 現在手元の32bitのDLLWRAPが壊れているようなので32bitではビルドできていません make BINARY=64 \ CC=x86_64-w64-mingw32-gcc \ FC=x86_64-w64-mingw32-gfortran \ NUM_THREADS=24 NO_CBLAS=1 \ REFBLAS_ANTILOGY=1 \ DYNAMIC_ARCH=1 \ EXTERNAL_XERBLA_LIBNAME=R.dll \ GOTOBLASLIBDLLNAME=Rblas.dll \ GOTOLAPACKLIBDLLNAME=Rlapack.dll ** OSX [#j14cd91a] quickbuild.osxRblasを参考にしてください. LIBDYNNAMEはBLAS+LAPACK一体のファイル名なので, 分割する場合は, GOTOBLASLIBDYNNAME=libRblas.0.dylib GOTOLAPACKLIBDYNNAME=libRlapack.0.dylib 等としてビルドすると良いでしょう. PPCTARGET=PPCG4 # or PPC970 mkdir ppc mkdir i386 mkdir x86_64 make BINARY=32 CC="gcc -arch ppc" FC="gfortran -arch ppc" \ TARGET=${PPCTARGET} \ NUM_THREADS=24 NO_CBLAS=1 REFBLAS_ANTILOGY=1 NO_XERBLA=1 \ GOTOBLASLIBDYNNAME=libRblas.0.dylib \ GOTOLAPACKLIBDYNNAME=libRlapack.0.dylib cp exports/libRblas.0.dylib ppc cp exports/libRlapack.0.dylib ppc make clean make BINARY=32 CC="gcc -arch i386" FC="gfortran -arch i386" \ DYNAMIC_ARCH=1 \ NUM_THREADS=24 NO_CBLAS=1 REFBLAS_ANTILOGY=1 NO_XERBLA=1 \ GOTOBLASLIBDYNNAME=libRblas.0.dylib \ GOTOLAPACKLIBDYNNAME=libRlapack.0.dylib cp exports/libRblas.0.dylib i386 cp exports/libRlapack.0.dylib i386 make clean make BINARY=64 CC="gcc -arch x86_64" FC="gfortran -arch x86_64" \ DYNAMIC_ARCH=1 \ NUM_THREADS=24 NO_CBLAS=1 REFBLAS_ANTILOGY=1 NO_XERBLA=1 \ GOTOBLASLIBDYNNAME=libRblas.0.dylib \ GOTOLAPACKLIBDYNNAME=libRlapack.0.dylib cp exports/libRblas.0.dylib x86_64 cp exports/libRlapack.0.dylib x86_64 make clean lipo -create -output libRblas.0.dylib \ -arch ppc ppc/libRblas.0.dylib \ -arch i386 i386/libRblas.0.dylib \ -arch x86_64 x86_64/libRblas.0.dylib lipo -create -output libRlapack.0.dylib \ -arch ppc ppc/libRlapack.0.dylib \ -arch i386 i386/libRlapack.0.dylib \ -arch x86_64 x86_64/libRlapack.0.dylib rm -rf ppc i386 x86_64 lipo -info libRblas.0.dylib lipo -info libRlapack.0.dylib あとはBLASの切り替えについてたしかドキュメントに書いてあったと思うので, それを参考にして下さい. *バイナリ [#o7dc4ce2] BLASのみをビルドした [[バイナリはこちらにあります:http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/]] 最新のMACはもって無いので動かしたことはないですが, たぶん動くと思います. Windowsはdllwrapの32bitが壊れていたので,32bit版は手元でビルドできていませんが, そんなに変わらないので, 前のKATMAIのバイナリをおいてあります.ちゃんと並列動作するはずです. Windowsの64Bitの方は主にIntelの認識率を向上させました. AVX以降のアーキテクチャはNeharemコアを使うようにしてあります. なので, 前より早くなると思います. *RからBLASの制御 [#b468bb5b] ソースパッケージからビルドしてください. [[blasctl:http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/blas_control_on_R/]] LinuxではAFFINITYとWARMUPがデフォルトでは有効なので並列数を制御したい場合は 初期のスレッド数を1にする必要があります. OpenMP等のルーチンを使う場合も, BLASのスレッド数は1にする必要があります. Linux以外はAffinityを設定しないので, 論理CPU数がデフォルトになります. $ export GOTO_NUM_THREADS=1 # The default is the number of the cores. CRANにある [[RhpcBLASctl:http://cran.r-project.org]]をインストールしてください $ R -q > library(blasctl) > library(RhpcBLASctl) > A<-matrix(runif(3e3^2),3e3,3e3) > blas_get_num_procs() [1] 1 > system.time(A%*%A) user system elapsed 3.992 0.012 4.003 > blas_set_num_threads(4) > blas_set_num_threads(get_num_cores()) > system.time(A%*%A) user system elapsed 4.332 0.048 1.234