使用Rcpp的英特尔MKL多线程计算

使用Rcpp的英特尔MKL多线程计算,r,parallel-processing,rcpp,blas,intel-mkl,R,Parallel Processing,Rcpp,Blas,Intel Mkl,我将R的默认BLAS更改为intel MKL,并获得了足够的速度提升。在我的电脑上,MKL使用4个线程。现在我尝试用R中的snow来并行我的代码。为了避免两级并行计算之间的冲突,我使用setMKLthreads(1)来限制MKL只使用一个内核。但当我运行代码时,通过检查Windows任务管理器,所有CPU都参与其中 #If I run some test example, like setMKLthreads(1) set.seed (1) m <- 10000 n <- 500

我将R的默认BLAS更改为intel MKL,并获得了足够的速度提升。在我的电脑上,MKL使用4个线程。现在我尝试用R中的
snow
来并行我的代码。为了避免两级并行计算之间的冲突,我使用
setMKLthreads(1)
来限制MKL只使用一个内核。但当我运行代码时,通过检查Windows任务管理器,所有CPU都参与其中

#If I run some test example, like 
setMKLthreads(1)
set.seed (1)
m <- 10000
n <-  5000
A <- matrix (runif (m*n),m,n)
system.time (B <- crossprod(A))

setMKLthreads(4)
system.time (B <- crossprod(A))

setMKLthreads(2)
system.time (B <- crossprod(A))
在R中,我生成了一个6000行的正定矩阵,并进行了cholesky分解。而对于这个例子,时间上没有区别。但我的观点是,如果你能监控CPU,你会发现无论我为MKL设置了多少个内核,它都会提升到最大值。在我的例子中,我有4个物理核和8个逻辑核,在这两种情况下CPU的使用率都提高到了50%。我所期望的是,当我将其限制为1个内核时,最大CPU使用率将为12.5%

library(clusterGeneration)
B = genPositiveDefMat(dim = 6000)
setMKLthreads(1)
getMKLthreads()
time1 = Sys.time()
C <- cholesky_cpp(B$Sigma)
time2 = Sys.time()
time2-time1

setMKLthreads(4)
getMKLthreads()
time1 = Sys.time()
C <- cholesky_cpp(B$Sigma)
time2 = Sys.time()
time2-time1
库(集群生成)
B=GEN正反馈(dim=6000)
setMKLthreads(1)
getMKLthreads()
time1=Sys.time()

C这与Rcpp(犰狳)无关。R本身将调用相同的矩阵乘法函数。这个话题并不新鲜,已经讨论过几次了;你应该在r-sig-hpc列表档案中找到一些东西。谢谢!我想我已经找到了你提到的那个帖子。这是针对Linux上的OpenBLAS的,但是文章中的一些关键词可以帮助我进行更多的搜索。我认为在包含RcppArmadillo之前使用
#define ARMA_don_USE_WRAPPER
将使用基本BLAS进行编译。然而,我需要弄清楚如何使用MKL(仅仅因为我在windows机器上)只使用一个内核进行编译。这可能不是本文所要考虑的——一般来说,正如多次所述,在切换BLAS时,您不需要重新编译。它们提供了一个API;不同的版本是可互换的。这与Rcpp(犰狳)无关。R本身将调用相同的矩阵乘法函数。这个话题并不新鲜,已经讨论过几次了;你应该在r-sig-hpc列表档案中找到一些东西。谢谢!我想我已经找到了你提到的那个帖子。这是针对Linux上的OpenBLAS的,但是文章中的一些关键词可以帮助我进行更多的搜索。我认为在包含RcppArmadillo之前使用
#define ARMA_don_USE_WRAPPER
将使用基本BLAS进行编译。然而,我需要弄清楚如何使用MKL(仅仅因为我在windows机器上)只使用一个内核进行编译。这可能不是本文所要考虑的——一般来说,正如多次所述,在切换BLAS时,您不需要重新编译。它们提供了一个API;不同的版本可以互换。
library(clusterGeneration)
B = genPositiveDefMat(dim = 6000)
setMKLthreads(1)
getMKLthreads()
time1 = Sys.time()
C <- cholesky_cpp(B$Sigma)
time2 = Sys.time()
time2-time1

setMKLthreads(4)
getMKLthreads()
time1 = Sys.time()
C <- cholesky_cpp(B$Sigma)
time2 = Sys.time()
time2-time1