RとGotoBLAS
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
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.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数だったのを物理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]
CRANにある [[RhpcBLASctl:http://cran.r-project.org]]をインストールしてください
$ 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
終了行:
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.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数だったのを物理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]
CRANにある [[RhpcBLASctl:http://cran.r-project.org]]をインストールしてください
$ 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
ページ名: