【发布时间】:2020-08-27 15:45:41
【问题描述】:
我正在尝试在 Ubuntu 20.04、Microsoft R 3.5.2 和 Intel MKL 上从 Ryzen 3 3950x 16 核机器上实现最大值,并且 RCpp 代码使用 Sys.setenv(MKL_DEBUG_CPU_TYPE=5) 标头编译。
以下是我想要优化的主要操作:
- 快速多元随机正态法(我使用 Armadillo 版本):
#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);
}
-
Fast SVD(我发现
base::svd的性能优于我目前发现的任何Rcpp实现,包括arma::svd("dc"),可能是由于U,S,V尺寸不同)。 -
快速矩阵乘法用于各种结果(找到用 C 编写的代码,用基础 R 重写了所有代码,并且由于多核与以前的 1 核性能相比,我发现了巨大的改进。可以基础 R 矩阵运算进一步改进?)
我尝试了R4.0.2 和openBLAS 的各种设置(通过Ropenblas 包),玩过各种Intel MKL 版本,研究了AMD 的BLIS 和libflame(我不知道如何使用 R 进行测试)。
总体而言,此设置能够比配备 i7-8750h 和 Microsoft R 3.5.1(使用工作 MKL)的笔记本电脑高出约 2 倍,而基于 6 核与 16 核(以及更快的 RAM),我预计至少3-3.5 倍的改进(基于,例如,cinebench 和类似的性能基准)。
如何进一步改进此设置?
我的主要问题/疑问:
首先,我注意到当前设置在使用 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 是否被正确调用/使用,我还应该用机器尝试什么?
最后,我看到了调用/使用 AMD BLIS/libflame for R 的零指南。如果这是微不足道的,将不胜感激任何提示/帮助。
【问题讨论】:
标签: r linux rcpp lapack intel-mkl