R / Rcpp使用的OpenBLAS例程仅在linux中的单个核心上运行

时间:2014-02-12 14:20:02

标签: r blas

我正在尝试使用与Rcpp连接的C ++程序在Linux机器(CentOS)上运行R分解(LAPACKE_dgeqrf)。不幸的是,我看到只有100%使用top。这也发生在Red Hat Enterprise Linux服务器上。但是,从终端(独立于R外部)启动时,C ++程序(带有LAPACKE_dgeqrf)以nthreads * 100%运行。我用

编译了OpenBLAS
NO_AFFINITY=1 

并尝试了

export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4
export OPENBLAS_MAIN_FREE=1

没有任何作用。虽然在Mac上一切正常。并行R包中的'mcaffinity()'返回NULL。我使用

配置了R
configure  'CFLAGS=-g -O3 -Wall -pedantic' 'CXXFLAGS=-g -O3 -Wall -pedantic' 'FCFLAGS=-g -O3' 'F77FLAGS=-g -O3' '--with-system-zlib' '--enable-memory-profiling'

我的C ++代码:

#include <Rcpp.h>
#include <lapacke.h>
#include <cblas.h>

//[[Rcpp::export]]
Rcpp::NumericMatrix QRopenblas(Rcpp::NumericMatrix X)
{
    // Declare variables 
    int n_rows = X.nrow(), n_cols = X.ncol(), min_mn = std::min(n_rows, n_cols);
    Rcpp::NumericVector tau(min_mn);

    // Perform QR decomposition
    LAPACKE_dgeqrf(CblasColMajor, n_rows, n_cols, X.begin(), n_rows, tau.begin());

    return X;
}

我的R代码:

PKG_LIBS <- '/pathto/openblas/lib/libopenblas.a' 
PKG_CPPFLAGS <- '-I/pathto/openblas/include'
Sys.setenv(PKG_LIBS = PKG_LIBS , PKG_CPPFLAGS = PKG_CPPFLAGS) 
Rcpp::sourceCpp('/pathto/QRopenblas.cpp', rebuild = TRUE)

n_row <- 4000
n_col <- 4000
A <- matrix(rnorm(n_row * n_col), n_row, n_col)
res <- QRopenblas(A)

1 个答案:

答案 0 :(得分:2)

我通过重建R并使用

进行配置找到了解决方案
../configure --enable-BLAS-shlib --enable-R-shlib --enable-memory-profiling --with-tcltk=no

之后,我不得不用相应的OpenBLAS文件libRblas.so替换libopenblas.so。顺便说一句,我使用标准设置(即具有亲和力)构建OpenBLAS。 R函数qr()现在也使用所有内核和C ++程序。这样做的原因是,启动时R现在启动了多个线程(通过cat /proc/pid/status验证)。在不替换libRblas.so的情况下,R使用一个线程启动,然后在调用OpenBLAS时启动多个线程,这些线程被正确地固定到第一个核心。