如何解决Ryzen + Ubuntu的R性能:openBLAS / MKL,Rcpp和其他改进?
我正在尝试在具有Intel MKL的Ubuntu 20.04,Microsoft R 3.5.2上的Ryzen 3 3950x 16核计算机上实现最大性能,并且RCpp
代码是用Sys.setenv(MKL_DEBUG_CPU_TYPE=5)
编译标头。
以下是我要优化的主要操作:
- 快速多元随机正态(我使用的是犰狳版本):
#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);
}
-
快速SVD (我发现
base::svd
的性能要好于我到目前为止发现的任何Rcpp
实现,包括arma::svd("dc")
由于尺寸不同,U,S,V
)。 -
快速矩阵乘法用于各种结果(找到用C编写的代码,将所有代码重写在base R中,并且由于多核与以前的1核性能相比,正在发现巨大的改进。 R矩阵运算有待进一步改进吗?)
我尝试了R4.0.2
和openBLAS
的各种设置(通过Ropenblas包),并与各种英特尔MKL版本一起使用,研究了AMD的BLIS和{{ 3}}(我什至不知道如何使用R进行测试)。
总体而言,此设置能够比使用i7-8750h和Microsoft R 3.5.1(可运行MKL)的笔记本电脑高出约2倍,而基于6核与16核(以及更快的RAM),我期望至少改善了3-3.5倍(例如,基于libflame和类似的性能基准)。
如何进一步改进此设置?
我的主要问题/问题:
首先,我注意到当与1个工作人员一起运行时,当前设置在查看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以及应该尝试什么?用机器吗?
最后,我看到了用于R的AMD BLIS / libflame调用/工作的零指南。如果这很琐碎,不胜感激。
解决方法
直到出现其他任何答案(希望更好)之前,都将通过猜测将我的最新发现发布在此处。希望拥有类似机器的人会发现它很有用。如果有任何其他改进,将尝试扩展答案。
-
纯R编译指南。似乎已经过时,但希望没有太多遗漏:
Speed up RcppArmadillo: How to link to OpenBlas in an R package
-
OpenBLAS在我的Ryzen + Ubuntu配置上工作很糟糕;与3.10 BLAS一起使用zen2提示编译的,使用所有CPU内核,但是非常麻烦。
top
报告R实例的使用率为3200%,但总CPU使用率增长不超过20-30%。因此,性能至少要比Intel MKL慢3倍。 -
IntelMKL。到2019年为止的版本都可以使用MKL_DEBUG_CPU_TYPE workaround。可以确认
intel-mkl-64bit-2019.5-075
是否有效。对于自
2020.0-088
以来的更高版本,different workaround是 需要。根据我的基准测试,性能没有任何改善 但是,随着MKL未来版本的发布,这种情况可能会有所改变。 -
每个实例的10-12个硬编码上限似乎受几个环境变量控制。我发现以下列表as per this old guide。这些可能会在更高版本中更改,但似乎可以与
2019.5-075
一起使用:
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"
在各种配置下玩转,我发现减少线程数并产生更多工作线程,对于我测试过的特定基准测试 ,可以显着提高性能(大约3- 4折)。即使所声称的CPU使用率与配置的多核变体相似,但是2个使用16个线程的工作人员(总计约70%cpu利用率)比16个使用2个线程的工作人员(也类似,cpu使用率)要慢得多。结果可能因任务而异,因此似乎是每个较长任务都需要使用的参数。
- AMD BLIS。作为MKL BLAS的替代品进行测试,目前仅在试验中,但性能似乎与所有修复的Intel MKL相当。检查是否通过
perf
实际使用过BLIS,在我的基准测试中,调用是通过bli_dgemmsup_rd_haswell_asm_6x8m
,bli_daxpyv_zen_int10
等进行的。尚不确定用于编译BLIS的设置是否最佳。 得出的结论可能是,鉴于我的特定基准测试,MKL和BLIS实际上都在从CPU推动最大。或者至少两个库都进行了类似的优化。
坚持使用AMD BLIS的重要缺点:在使用数月后就注意到了,但是BLIS或LAPACK似乎存在一些尚未解决的问题,我不知道。我注意到随机矩阵乘法问题是不可复制的(本质上是hitting into this problem),可以通过切换回MKL库来解决。我不能说我构建R或实际库的方式是否有问题,仅是警告。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。