Ryzen + Ubuntu的R性能:openBLAS / MKL,Rcpp和其他改进?

如何解决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)编译标头。

以下是我要优化的主要操作:

  1. 快速多元随机正态(我使用的是犰狳版本):
#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);
}

  1. 快速SVD (我发现base::svd的性能要好于我到目前为止发现的任何Rcpp实现,包括arma::svd("dc")由于尺寸不同,U,S,V)。

  2. 快速矩阵乘法用于各种结果(找到用C编写的代码,将所有代码重写在base R中,并且由于多核与以前的1核性能相比,正在发现巨大的改进。 R矩阵运算有待进一步改进吗?)


我尝试了R4.0.2openBLAS的各种设置(通过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调用/工作的零指南。如果这很琐碎,不胜感激。

解决方法

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


  1. 纯R编译指南。似乎已经过时,但希望没有太多遗漏:

    Speed up RcppArmadillo: How to link to OpenBlas in an R package

    OpenBLAS and IntelMKL examples + Rstudio

  2. OpenBLAS在我的Ryzen + Ubuntu配置上工作很糟糕;与3.10 BLAS一起使用zen2提示编译的,使用所有CPU内核,但是非常麻烦。 top报告R实例的使用率为3200%,但总CPU使用率增长不超过20-30%。因此,性能至少要比Intel MKL慢3倍。

  3. IntelMKL。到2019年为止的版本都可以使用MKL_DEBUG_CPU_TYPE workaround。可以确认intel-mkl-64bit-2019.5-075是否有效。

    对于自2020.0-088以来的更高版本,different workaround是 需要。根据我的基准测试,性能没有任何改善 但是,随着MKL未来版本的发布,这种情况可能会有所改变。

  4. 每个实例的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使用率)要慢得多。结果可能因任务而异,因此似乎是每个较长任务都需要使用的参数。

  1. AMD BLIS。作为MKL BLAS的替代品进行测试,目前仅在试验中,但性能似乎与所有修复的Intel MKL相当。检查是否通过perf实际使用过BLIS,在我的基准测试中,调用是通过bli_dgemmsup_rd_haswell_asm_6x8mbli_daxpyv_zen_int10等进行的。尚不确定用于编译BLIS的设置是否最佳。 得出的结论可能是,鉴于我的特定基准测试,MKL和BLIS实际上都在从CPU推动最大。或者至少两个库都进行了类似的优化。

坚持使用AMD BLIS的重要缺点:在使用数月后就注意到了,但是BLIS或LAPACK似乎存在一些尚未解决的问题,我不知道。我注意到随机矩阵乘法问题是不可复制的(本质上是hitting into this problem),可以通过切换回MKL库来解决。我不能说我构建R或实际库的方式是否有问题,仅是警告。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-