1

Openblas と OpenMP を使用してマルチスレッド R をセットアップしようとしています。AMD fx-8230 8 コア プロセッサで OpenSuSE 12.2 を使用しています。ATLASとしばらく戦った後、それを袋に入れて、私が持っている openblas を試すように提案されました。

初め。opensuse 12.2 gcc で openmp が壊れているという報告がいくつかあったので、テストする必要があると考えました。http://openmp.org/wp/openmp-compilers/にアクセスし、サンプル ファイル hello.c をコンパイルして実行し、すべてのスレッドが応答しました。

2番。openblas の git clone をセットアップしました。指示を読み、「make USE_OPENMP=1」を実行した後、「make PREFIX=/usr/lib64/OpenBLAS install」を実行しました。プログラムはインストールされ、問題なくすべてのチェックに合格しました。

三番。R のセットアップ R を tar ファイルとしてダウンロードし、解凍しました。最終的にはSubversion Rをチェックアウトします。このconfigureコマンドを使用しました../configure --prefix=/usr/lib64/R --enable-openmp --enable-R-shlib --with-blas="-L/opt/maths/OpenBLAS -lopenblas" --with-tcl-config=/usr/lib64/tclConfig.sh --with-tk-config=/usr/lib64/tkConfig.sh --with-x

プレフィックスと -with-blas 情報は、Makeconf ファイルには含まれません。何故ですか?Makeconf ファイルを次のように変更しました。

PACKAGE = R
VERSION = 2.15.3

abs_top_srcdir = /opt/maths/R-2.15.3/gserver/..
abs_top_builddir = /opt/maths/R-2.15.3/gserver

include $(top_srcdir)/share/make/vars.mk

AR = ar
ACLOCAL = aclocal
AUTOCONF = autoconf
AUTOMAKE = automake
AUTOHEADER = autoheader
BLAS_LIBS = -L/opt/maths/OpenBLAS/ -lopenblas
BUILDDIR_IS_SRCDIR = no
## next two for future support of cross-compiling, not actually used
BUILD_CC =
BUILD_R =
CC = gcc -std=gnu99
CFLAGS = -g -O2 -fopenmp
CPICFLAGS = -fpic
CPPFLAGS = -I/usr/include
DEFS = -DHAVE_CONFIG_H
DISTDIR_TAR_EXCLUDE = --exclude=.svn --exclude=Makefile --exclude="*.o" --exclude="*$(SHLIB_EXT)" --exclude="*~"
DYLIB_EXT = .so
DYLIB_LD = gcc -std=gnu99
DYLIB_LDFLAGS = -shared -fopenmp# $(DYLIBS_LTO)
DYLIB_LINK = $(DYLIB_LD) $(DYLIB_LDFLAGS) $(LDFLAGS)
DYLIBS_LTO = $(CFLAGS) $(CPICFLAGS)
ECHO = echo
ECHO_C =
ECHO_N = -n
ECHO_T =
FFLAGS = -g -O2 -fopenmp
FLIBS =  -lgfortran -lm -lquadmath
FLIBS_IN_SO =  -lgfortran -lm -lquadmath
FPICFLAGS = -fpic
F77 = gfortran
GETWD = /usr/bin/pwd
GZIP = --best
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_DIR = ${INSTALL} -d
LDFLAGS = -L/usr/lib64
LIBINTL=
LIBM = -lm
LIBR = -L$(R_HOME)/lib$(R_ARCH) -lR
LIBS =  -lrt -ldl -lm
LIBnn = lib64
LIBTOOL = $(SHELL) $(top_builddir)/libtool
## AFAICS unused
LN_S = ln -s
MAIN_CFLAGS =
MAIN_FFLAGS =
MAIN_LD = gcc -std=gnu99# $(CFLAGS)
MAIN_LDFLAGS = -Wl,--export-dynamic -fopenmp # # -Wl,-bE:$(top_builddir)/etc/R.exp
MAIN_LINK = $(MAIN_LD) $(MAIN_LDFLAGS) $(LDFLAGS)
## need this for bootstrapping
MKINSTALLDIRS = /bin/sh $(top_srcdir)/src/scripts/mkinstalldirs.in
NOTANGLE = false
R_ARCH =
R_FRAMEWORK_DIR = $(prefix)/R.framework
R_GZIPCMD = /usr/bin/gzip
## needed for AIX only
# R_HOME = $(top_builddir)
R_OPENMP_CFLAGS = -fopenmp
R_OPENMP_FFLAGS = -fopenmp
R_OSTYPE = unix
R_PKGS = $(R_PKGS_BASE)  $(R_PKGS_RECOMMENDED)
R_PLATFORM = x86_64-unknown-linux-gnu
R_XTRA_CFLAGS =
R_XTRA_CPPFLAGS =  -I. -I$(top_builddir)/src/include -I$(top_srcdir)/src/include
R_XTRA_FFLAGS =
R_XTRA_LIBS =
RANLIB = ranlib
READLINE_LIBS = -lreadline
SED = /usr/bin/sed
SHELL = /bin/sh
SHLIB_EXT = .so
SHLIB_CFLAGS =
SHLIB_FFLAGS =
SHLIB_LD = gcc -std=gnu99
SHLIB_LDFLAGS = -shared# $(SHLIB_LTO)
SHLIB_LINK = $(SHLIB_LD) $(SHLIB_LDFLAGS) $(LDFLAGS)
SHLIB_LTO = $(CFLAGS) $(CPICFLAGS)
STRIP_LIBS = strip --strip-unneeded
STRIP_STATIC_LIBS = strip --strip-debug
TAR = /bin/tar
USE_NLS = yes
X_CFLAGS =
X_LIBS =  -lX11 -lXt -lXmu
X_PRE_LIBS =  -lSM -lICE
X_EXTRA_LIBS =
YACC = bison -y

ALL_CFLAGS = $(R_XTRA_CFLAGS) $(R_OPENMP_CFLAGS) $(MAIN_CFLAGS) $(CFLAGS)
ALL_CPPFLAGS = $(R_XTRA_CPPFLAGS) $(CPPFLAGS) $(DEFS)
ALL_FFLAGS = $(R_XTRA_FFLAGS) $(R_OPENMP_FFLAGS) $(MAIN_FFLAGS) $(FFLAGS)
ALL_CFLAGS_LO = $(R_XTRA_CFLAGS) $(R_OPENMP_CFLAGS) $(CPICFLAGS) $(SHLIB_CFLAGS) $(CFLAGS)
ALL_FFLAGS_LO = $(R_XTRA_FFLAGS) $(R_OPENMP_FFLAGS) $(FPICFLAGS) $(SHLIB_FFLAGS) $(FFLAGS)

.SUFFIXES:
.SUFFIXES: .c .f .m .d .o

.c.o:
        $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@
.c.d:
        @echo "making $@ from $<"
        @gcc -std=gnu99 -MM $(ALL_CPPFLAGS) $< > $@
.m.d:
        @echo > $@
.f.o:
        $(F77) $(ALL_FFLAGS) -c $< -o $@

prefix = /usr/lib64/R
exec_prefix = ${prefix}
datarootdir = ${prefix}/share
## only used for installing 'R'.
bindir = ${exec_prefix}/bin
## not used
datadir = ${datarootdir}
## used for 'rhome' and installation of standalone Rmath
libdir = ${exec_prefix}/${LIBnn}
## used for man page
mandir = ${datarootdir}/man
## used for installation of standalone Rmath headers
includedir = ${prefix}/include

rhome = ${libdir}/R
rsharedir = ${rhome}/share
rincludedir = ${rhome}/include
rdocdir = ${rhome}/doc

## Overrides for installing R as a framework (MacOS X).
#FW_VERSION =
#rhome = $(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources
#bindir = $(rhome)
#mandir = $(rhome)

Rexecbindir = $(rhome)/bin
Rexecbindir2 = $(rhome)/bin/exec$(R_ARCH)
Rexeclibdir = $(rhome)/lib$(R_ARCH)
## FIXME:
## Alternatively, we could try to set pkglibdir = $(rhome)/lib when
## switching to automake.
## </FIXME>
Rexecmodulesdir = $(rhome)/modules$(R_ARCH)

まだオープンブラが見つかりませんでした。libopenblas.so.0 の /usr/lib64 にシンボリックリンクを張ると、openblas が見つかりました。インクルードを設定する -I よりも良い方法はありますか? インクルードを適切に設定しておらず、適切なファイルが見つからない可能性がありますか?

ここの情報を使用して、/bin/exec/R で R によって検出されたライブラリを確認しました

gserver/bin/exec # ldd R
    linux-vdso.so.1 (0x00007fff4b278000)
    libR.so => not found
    libRblas.so => not found
    libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007f2cb3e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2cb3be0000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f2cb3830000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f2cb3628000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2cb4010000)

libRblas を使用していない場合、libRblas が見つからないことを期待していました。だから私はlibR.soを見つけ、

gserver/lib # ldd libR.so
    linux-vdso.so.1 (0x00007fffaf360000)
    libopenblas.so.0 => /usr/lib64/libopenblas.so.0 (0x00007fe131158000)
    libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007fe130e40000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fe130b40000)
    libquadmath.so.0 => /usr/lib64/libquadmath.so.0 (0x00007fe130908000)
    libreadline.so.6 => /lib64/libreadline.so.6 (0x00007fe1306c0000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fe1304b8000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fe1302b0000)
    libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007fe1300a0000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe12fe80000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe12fad0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe132610000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe12f8b8000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fe12f680000)

R のインストール手順の残りの部分に従って、make check (pass) make check-all を実行したところ、成功しました。

では、キッカーです。Rが実際に複数のコアを使用していることを確認するにはどうすればよいですか。Rでテストするためのスキームを見つけることができました:

a = matrix(rnorm(5000*5000), 5000, 5000)
b = matrix(rnorm(5000*5000), 5000, 5000)
c = a%*%b

次に、'top' で CPU をチェックします。私はこれを行いましたが、CPU の 100.1% 以上を使用したことはありません! これは私をかなり悲しくさせました。make-all を実行しているときに、例をテストしているときに、CPU 使用率が 250% を超えることがあり、それが機能していて、何かを忘れていると思いました。私のプロファイルでは、'export OMP_NUM_THREADS=8' と 'export OPEN_BLAS_NUM_THREADS=8' を設定しています。これは、openblas が openmp で動作していないということですか?

このサーバーには実際には何も設定されていません。 $LD_LIBRARY_PATH をエコーし​​ても何も表示されないので、全員が共同で作業できるように設定する必要があるのではないでしょうか? 私の最終的な目標は、boost ライブラリ、snow、および spp をインストールすることです。Rパッケージで雪を使ってopenmpをセットアップした経験のある人はいますか?

4

2 に答える 2

1

最初に調べることは、

  • 最適化された BLAS がすべて使用されている
    OpenBLAS はNUM_TREADS=1、デフォルトの BLAS よりもはるかに高速です。m %*% m乗算の回数を確認してください。

  • OpenBLAS が使用されていることがわかったら、生成されたスレッドの数を確認します (topまたはhtop)

  • 最適化された BLAS が使用されている場合、NUM_TREADSスレッドは生成されますが、すべて同じコアで実行されます。こちらを参照してください: R 制限付きの並列処理

于 2013-04-08T18:49:51.717 に答える
0

OpenBLAS への切り替えによって期待されるパフォーマンスの向上が見られないという問題は、プロセッサ アフィニティに関連している可能性があります。OpenBLAS Github から:

「Linux では、OpenBLAS はデフォルトでプロセッサ アフィニティを設定します。これにより、R 並列との競合が発生する可能性があります。NO_AFFINITY=1 でライブラリをビルドできます。」

NO_AFFINITY=1 フラグを指定してコンパイルすると、プロセッサ アフィニティが無効になります。

https://stat.ethz.ch/pipermail/r-sig-hpc/2012-April/001348.html

于 2013-06-04T06:43:59.447 に答える