Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R在Ryzen+上的性能;Ubuntu:openBLAS/MKL、Rcpp和其他改进?_R_Linux_Rcpp_Lapack_Intel Mkl - Fatal编程技术网

R在Ryzen+上的性能;Ubuntu:openBLAS/MKL、Rcpp和其他改进?

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

我正试图从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,arma::向量mu,arma::mat西格玛){
    int ncols=西格玛n科尔;
    arma::maty=arma::randn(n,ncols);
    返回arma::repmat(mu,1,n).t()+Y*arma::chol(sigma);
    }
    
  • 快速SVD(我发现
    base::SVD
    的性能比我目前发现的任何
    Rcpp
    实现都要好,包括
    arma::SVD(“dc”)
    ,可能是因为U、S、V的维度不同)

  • 各种结果的快速矩阵乘法(发现用C编写的代码,在base R中重写所有代码,我发现由于多核与以前的单核性能相比有了巨大的改进。base R矩阵运算可以进一步改进吗?)


  • 我用
    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打电话/合作的零指南。如果这是一个琐碎的问题,我将非常感谢您提供任何关于研究内容的提示/帮助。

    在弹出任何其他(希望更好)答案之前,我将通过猜测在这里发布我的最新发现。希望拥有类似机器的人会发现这很有用。如果出现任何其他改进,将尝试扩展答案


  • 清洁R编译指南。似乎过时了,但希望没有什么遗漏:

  • OpenBLAS在我的Ryzen+Ubuntu配置上工作得很糟糕;使用zen2提示编译的with使用了所有CPU内核,但非常糟糕
    top
    报告了R实例3200%的使用率,但总CPU利用率的增长不会超过20-30%。因此,性能至少比Intel MKL慢3倍

  • IntelMKL。2019年之前的版本适用于。可以确认
    intel-mkl-64bit-2019.5-075
    工作正常

    对于自
    2020.0-088以来的更高版本
    需要。在我的基准测试中,性能没有任何变化
    然而,这种改进可能会随着将来的MKL版本而改变

  • 每个实例的10-12硬编码cap似乎由几个环境变量控制。我找到了下面的列表。这些可能会随着更高版本而改变,但似乎适用于
    2019.5-075

  • 通过使用各种配置,我发现对于我测试过的特定基准测试,减少线程数量和产生更多工作人员可以显著提高性能(大约3-4倍)。尽管声称的CPU使用率与配置的多核变体相似,但每个使用16个线程的2个工作线程(CPU使用率总计约为70%)要比每个使用2个线程的16个工作线程慢得多(同样,CPU使用率相似)。结果可能因不同的任务而异,因此这些参数似乎是每一个较长任务都要用到的参数

  • 。测试此作为MKL BLAS的替代品,目前仅进行实验,但性能似乎与英特尔MKL的所有修复相媲美。检查是否通过
    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"