RとGotoBLAS

概要

現在, GotoBLASの開発は終了しており, TACCにあるバージョンだと, 若干の不具合が知られています. 昨年の暮れにTACCよりBSDにライセンスが変更されたのでこのバージョンを元に修正を行っています. 追記:ずっとRCのままにして放置してあったのを, ちょこっと弄りました.

配布は, SurviveGotoBLAS2で行っています. ライセンスはAGPL-3です.

Rユーザ向けの為の変な変更

そのままでは一般の方には使いにくいので, いくつかの変更を加えました. ソースからビルドを行う方は, 以下のパラメータを指定しなければ, 後で苦しむ事になります. また割と多くのアプリケーションでは, BLASとLAPACKのライブラリを分けた状態でリンクしているので, これをビルド時に分割するように変更を加えました.

REFBLAS_ANTILOGY=1

これはREFBLASの実装ではLAPACKに入ってるルーチンを一部GotoBLASではBLAS側に持っています. なのでこれをLAPACKのアーカイブに移すように指示します.

NO_LAPACK=1

GotoBLASではLAPACKルーチンの一部しか最適化されていないのと, ビルド時にLAPACKをnetlibからダウンロードします. オリジナルはwgetが必要でしたが, 無ければcurlやftp等あるものでダウンロードするように変更を加えてます. オリジナルはmd5も必要でしたが, これもopenssl md5も試すようにしました. 内部の計算機からnetlib.orgに繋げない方や, netlib.orgは時々落ちているので, そんな時の為の設定です.

NO_XERBLA = 1

これはxerblaをアプリケーション側で持っている場合で, リンク時にxerblaが無くても問題が無い環境向けです. 例えば, OSXなどです.

EXTERNAL_XERBLA_LIBNAME = R.dll

これは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.3.1 )

なんとなく作ってみました. 新しく増えたルーチンを使いたい場合等によいかも.

各OS固有の情報

Apple

PowerPC

Rは倍精度ルーチンしか使わないので, 単精度ルーチンのaltivecを無効にしています. 以前は問題がありましたが, 不具合は取れてると思います.

Intel

大丈夫だと思います.

AIX

POWER4,5,6で動作を確認しています. 以前は問題がありましたが, 不具合は取れてると思います. 性能は1パッケージ(2CPU)までは出ますが, 3並列以上は全くリニアに向上しません. 正直, 電気代で巷に売られているパソコンのご購入をお勧めします.

Solaris

Sparc64VIIでしか試してません. SSLだと静的にしかビルド出来ませんし, Sunperf も含めてSPARCでは商用BLASだと2のべき乗サイズで 劇的に性能が劣化するので, GotoBLASは良い選択肢です.

Linux

PowerPC

CPUのAffinityを設定可能にしましたが, NO_AFFINITY=1との違いが結構微妙でした. Appleと同じく, altivecは無効です.

Intel

大丈夫だと思います. AFFINITY(デフォルトは設定)を設定した場合は物理CPU数を得ます, NO_AFFINITY=1だと, 論理CPU数だったのを物理CPUを得るように変更しました.

Windows

オリジナルには実装されていなかった, goto_set_num_threads, goto_get_num_procs の関数を実装してあります. CPU数は物理CPU数を得るようになっています.

x86

現在のRは4byte境界で実行されているので, KATMAIでしか動きません. パッケージも全てgccであれば調整は可能ですが, そんな訳は無いので取り組んですらいません. さっさと64bitにするべきです. 32bitでは例えNehalem(icore7)のCPUでもx86では動作するCoreはPenrynと同じものです.

x64

大丈夫だと思います. ただAVXには対応してませんが, Nehalemカーネルを選択するように変更してますので, Rユーザであれば(所詮BLASの効果は限定的)問題なく利用できると思います.

ソースからビルド方法

公開しているバイナリはBLASだけです. 一部最適化されたLAPACKルーチンを利用したい場合は 以下のようにしてください. ディレクトリのトップにquickbuild.osxRblasや, quickbuild.winRblas32_on_debian とか, ファイルが置いてありますので, それを参考にしてください.

Windows

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

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の切り替えについてたしかドキュメントに書いてあったと思うので, それを参考にして下さい.

バイナリ

BLASのみをビルドした バイナリはこちらにあります 最新のMACはもって無いので動かしたことはないですが, たぶん動くと思います. Windowsはdllwrapの32bitが壊れていたので,32bit版は手元でビルドできていませんが, そんなに変わらないので, 前のKATMAIのバイナリをおいてあります.ちゃんと並列動作するはずです. Windowsの64Bitの方は主にIntelの認識率を向上させました. AVX以降のアーキテクチャはNeharemコアを使うようにしてあります. なので, 前より早くなると思います.

RからBLASの制御

CRANにある RhpcBLASctlをインストールしてください

$ R -q
> 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(get_num_cores())
> system.time(A%*%A)
   user  system elapsed 
  4.332   0.048   1.234

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17