加速RcppArmadillo:如何链接到R包中的OpenBlas

时间:2017-07-10 10:42:49

标签: c++ r rcpp

我正在使用RcppArmadillo的R包。我试图利用OpenBLAS中发现的更快的矩阵乘法。在C ++ armadillo库的documentation中,它表示如果我们的机器上有OpenBLAS,那么Armadillo将使用OpenBLAS而不是BLAS。但是,当我编译我的R包时,我会得到这样的结果:

g++ -m64 -std=c++11 -shared -L/usr/lib64/R/lib -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o PackageTest.so class1.o class2.o class3.o class4.o class5.o class6.o class7.o RcppExports.o class8.o class9.o class10.o -L/usr/lib64/R/lib -lRlapack -L/usr/lib64/R/lib -lRblas -lgfortran -lm -lquadmath -L/usr/lib64/R/lib -lR

所以它使用-lRlapack-lRblas选项进行编译。如何正确修改MakevarsMakevars.win文件以使RcppArmadillo使用选项-lopenblas编译包?我尝试解决此问题的方法是以下列方式修改Makevars文件:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
PKG_CXXFLAGS =-fopenmp -std=c++11 -lopenblas
PKG_CXX1XFLAGS = $(PKG_CXXFLAGS)

软件包确实用-lopenblas编译,但这是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

这是你的RedHat安装的一个问题,它在安装R时选择依赖R的内部LAPACK源以及RcppArmadillo使用R使用的任何事实。

在我的基于Debian / Ubuntu的机器上,它的发生方式不同。即

R> library(Rcpp)
R> cppFunction("arma::mat foo(arma::mat x) { return x + x;} ", depends="RcppArmadillo", verbose=TRUE)

我得到(除其他外)

g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions \
    -Wl,-z,relro -o sourceCpp_4.so file677111d81351.o \
    -fopenmp -llapack -lblas -lgfortran -lm -lquadmath \
    -L/usr/lib/R/lib -lR

我们按预期看到-llapack -lblas -lgfortran

答案 1 :(得分:0)

用于编译R,OpenBLAS以及将R与OpenBLAS(GNU / Linux)链接的指令

我相信您最大的问题是将R链接到OpenBLAS库。因此,我在下面编写的步骤可以帮助您成功完成此链接。

编译OpenBLAS

最初在 OpenBLAS中下载 R OpenBLAS 打开优化的 BLAS 库)源代码。 。在文件目录中,执行以下步骤。

tar -zxvf OpenBLAS*
cd OpenBLAs*
make -j $nproc
sudo make install
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib/

git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS*
make -j $nproc
sudo make install
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib/

注意:这将使您使用CPU的所有功能来加快编译速度。要了解内核数,请执行:nproc

使用OpenBLAS编译Armadillo C ++

对于使用 Rcpp 库在 R 中使用 C ++ 代码的用户,请设置 Armadillo OpenBLAS 库可能会有所帮助。

tar -xvf armadillo*
cd armadillo*
./configure -DCMAKE_PREFIX_PATH=/opt/OpenBLAS/lib/
cmake . -DCMAKE_PREFIX_PATH=/opt/OpenBLAS/lib/
make -j $nproc
sudo make install

注意:有关 Armadillo 库的编译的更多详细信息,请访问https://gitlab.com/conradsnicta/armadillo-code

使用OpenBLAS编译R

编译 OpenBLAS 后,下载 R 代码。不必为了使用 OpenBLAS 而编译 R ,但是根据 R中的操作,编译语言可能会带来一些微不足道的好处。 。这样,下载语言 R 的源代码。

注意:在我的操作系统中,Arch Linux OpenBLAS )安装在/opt目录中。在您的GNU / Linux发行版中搜索 OpenBLAS 安装目录。

在下载 R 的目录中,执行以下操作:

tar -zxvf R*
cd R-* && ./configure --enable-R-shlib --enable-threads=posix --with-blas="-lopenblas -L/opt/OpenBLAS/lib -I/opt/OpenBLAS/include -m64 -lpthread -lm"
make -j $nproc
sudo make install

OpenBLAS库很可能会绑定到R。要进行检查,请运行R sessionInfo()代码。类似于以下输出的内容:

Matrix products: default
BLAS/LAPACK: /opt/OpenBLAS/lib/libopenblas_haswellp-r0.3.6.dev.so

如果未发生链接,请遵循以下代码中概述的步骤。

我们需要将 R 与文件libopenblas_*链接,该文件是在编译库 OpenBLAS 的过程中创建的。就我而言,该文件为 ibopenblas_haswellp-r0.2.20.so 。在/opt/OpenBLAS/lib或GNU / Linux系统上安装 OpenBLAS 的目录中查找。还要查找在R语言安装目录中找到的 libRblas.so 文件目录。在Arch中,该目录为/usr/local/lib64/R/lib

cd /usr/local/lib64/R/lib
mv libRblas.so libRblas.so.keep
ln -s /opt/OpenBLAS/lib/libopenblas_haswellp-r0.2.20.so libRblas.so

开始使用语言 R 的一部分,然后执行sessionInfo()。您应该注意以下内容:

Matrix products: default
BLAS/LAPACK: /opt/OpenBLAS/lib/libopenblas_haswellp-r0.3.6.dev.so

要利用多线程处理,请在开始R节之前执行export OPENBLAS_NUM_THREADS=1

注意:对于英特尔处理器sudo cpupower frequency-set -g performance,可以提高性能。在https://wiki.archlinux.org/index.php/CPU_frequency_scaling上了解更多信息。