c++ - 加速 RcppArmadillo : How to link to OpenBlas in an R package

标签 c++ r rcpp

我正在开发一个使用 RcppArmadillo 的 R 包。我正在尝试利用 OpenBLAS 中更快的矩阵乘法。在documentation在 C++ armadillo 库中,它说如果我们的机器上有 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 编译,但这是最好的方法吗?

最佳答案

这是你的 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

关于c++ - 加速 RcppArmadillo : How to link to OpenBlas in an R package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009964/

相关文章:

c++ - Boost.Asio: socket::close 不取消 aysnc_read_some

c++ - AIX 5.3 上的 mlockall

c++ - 使用 auto 关键字填充双索引 vector

r - 如何打印\n 作为文本而不在 R cat 中的引号内创建换行符

r - 你如何在 rmarkdown pdf 输出中为单元格着色

r - 如何链接到 boost date_time

r - 计算Hawk过程梯度的有效方法

C++ boost range adapter 多个 vector

r - 在R中排列日期字符

c++ - 使用 Rcpp 运行已编译的 C++ 代码