R在Ryzen+上的性能;Ubuntu:openBLAS/MKL、Rcpp和其他改进?
我正试图从Ubuntu 20.04、Microsoft R 3.5.2和Intel MKL上的Ryzen 3 3950x 16核机器上推送最大值,R在Ryzen+上的性能;Ubuntu:openBLAS/MKL、Rcpp和其他改进?,r,linux,rcpp,lapack,intel-mkl,R,Linux,Rcpp,Lapack,Intel Mkl,我正试图从Ubuntu 20.04、Microsoft R 3.5.2和Intel MKL上的Ryzen 3 3950x 16核机器上推送最大值,RCpp代码是用Sys.setenv(MKL\u DEBUG\u CPU\u TYPE=5)头编译的 以下是我要优化的主要操作: 快速多元随机正态分布(我使用犰狳版本): #包括 //[[Rcpp::depends(RcppArmadillo)]] 使用名称空间Rcpp; //[[Rcpp::导出]] arma::mat MVRNorma(整数n,ar
RCpp
代码是用Sys.setenv(MKL\u DEBUG\u CPU\u TYPE=5)
头编译的
以下是我要优化的主要操作:
#包括
//[[Rcpp::depends(RcppArmadillo)]]
使用名称空间Rcpp;
//[[Rcpp::导出]]
arma::mat MVRNorma(整数n,arma::向量mu,arma::mat西格玛){
int ncols=西格玛n科尔;
arma::maty=arma::randn(n,ncols);
返回arma::repmat(mu,1,n).t()+Y*arma::chol(sigma);
}
base::SVD
的性能比我目前发现的任何Rcpp
实现都要好,包括arma::SVD(“dc”)
,可能是因为U、S、V的维度不同)
我用
R4.0.2
和openBLAS
(通过软件包)尝试了各种设置,玩过各种英特尔MKL版本,研究过AMD和(我甚至不知道如何用R测试)
总的来说,这种设置能够比使用i7-8750h和Microsoft R 3.5.1(使用MKL)的笔记本电脑的性能提高2倍左右,而基于6核和16核(以及更快的RAM),我预计至少会提高3-3.5倍(基于和类似的性能基准)
如何进一步改进此设置
我的主要议题/问题:
首先,我注意到当前的设置,当使用一个worker运行时,在查看top
调用时,使用了大约1000-1200%的cpu。通过实验,我发现生成两个并行工作线程使用了大部分cpu,大约85-95%,并提供了最佳性能。例如,3名工人使用了全部100%,但在某个地方出现了瓶颈,由于某种原因大大降低了性能
我猜这是一个限制,或者来自R/MKL,或者编译Rcpp
代码时的一些限制,因为10-12个内核似乎非常特定在编译Rcpp代码时,可以通过一些提示来改进这一点吗
其次,我确信我没有使用最佳的BLAS/LAPACK/etc驱动程序来完成这项工作。我的猜测是,正确编译的R4.0.2
应该比Microsoft R3.5.2
快很多,但我完全不知道我缺少什么,AVX/AVX2是否正确调用/使用,我还应该在机器上尝试什么
最后,我已经看到了与AMD BLIS/libflame for R打电话/合作的零指南。如果这是一个琐碎的问题,我将非常感谢您提供任何关于研究内容的提示/帮助。在弹出任何其他(希望更好)答案之前,我将通过猜测在这里发布我的最新发现。希望拥有类似机器的人会发现这很有用。如果出现任何其他改进,将尝试扩展答案
top
报告了R实例3200%的使用率,但总CPU利用率的增长不会超过20-30%。因此,性能至少比Intel MKL慢3倍
intel-mkl-64bit-2019.5-075
工作正常
对于自2020.0-088以来的更高版本
需要。在我的基准测试中,性能没有任何变化
然而,这种改进可能会随着将来的MKL版本而改变
2019.5-075
:
perf
实际使用了BLIS,对于我的基准测试,调用了bli_dgemmsup_rd_haswell_asm_6x8m
,bli_daxpyv_zen_int10
等。还不确定编译BLI的设置是否最佳考虑到我的特定基准,这里的外卖可能是MKL和BLI实际上都在从CPU推动max。。。或者至少这两个库都进行了类似的优化坚持使用AMD BLIS的重要缺点:在使用数月后注意到了,但在AMD库中打包的BLIS或LAPACK中似乎存在一些未解决的问题,我对此一无所知。我注意到随机矩阵乘法问题是不可复制的(本质上是),可以通过切换回MKL libs来解决。我不能说我构建R的方式或实际的LIB是否有问题,所以只是一个警告。我有最新的2020版本的MKL与Ub中的R链接
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
arma::mat mvrnormArma(int n, arma::vec mu, arma::mat sigma) {
int ncols = sigma.n_cols;
arma::mat Y = arma::randn(n, ncols);
return arma::repmat(mu, 1, n).t() + Y * arma::chol(sigma);
}
export MKL_NUM_THREADS=2
export OMP_NESTED="TRUE"
export MKL_DOMAIN_NUM_THREADS="MKL_BLAS=1"
export OMP_NUM_THREADS=1
export MKL_DYNAMIC="TRUE"
export OMP_DYNAMIC="FALSE"