r - 为什么并行 MKL 不比 R 3.6 中的串行快?

标签 r intel-mkl

我正在尝试将英特尔的 MKL 与 R 一起使用,并使用 MKL_NUM_THREADS 变量调整线程数。

它加载正确,我可以看到它在 htop 中使用了 3200% 的 CPU。但是,它实际上并不比仅使用一个线程快。

我一直在改编Dirk Eddelbuettel's guide对于 centos,但我可能在某处遗漏了一些标志或配置。

这是我如何测试线程数与工作时间的关系的简化版本。使用 OpenBlas 时我确实得到了预期的结果。

require(callr)
#> Loading required package: callr
f <- function(i)  r(function() crossprod(matrix(1:1e9, ncol=1000))[1], 
      env=c(rcmd_safe_env(),
            R_LD_LIBRARY_PATH=MKL_R_LD_LIBRARY_PATH, 
            MKL_NUM_THREADS=as.character(i), 
            OMP_NUM_THREADS="1")
)

system.time(f(1))
#>    user  system elapsed 
#>  14.675   2.945  17.789
system.time(f(4))
#>    user  system elapsed 
#>  54.528   2.920  19.598
system.time(f(8))
#>    user  system elapsed 
#> 115.628   3.181  20.364
system.time(f(32)) 
#>    user  system elapsed 
#> 787.188   7.249  36.388 

reprex package 创建于 2020-05-13 (v0.3.0)


编辑 5/18

根据尝试 MKL_VERBOSE=1 的建议,我现在在 stdout 上看到以下显示正确调用 lapack 的内容:

MKL_VERBOSE Intel(R) MKL 2020.0 Product build 20191122 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.50GHz lp64 intel_thread
MKL_VERBOSE DSYRK(U,T,1000,1000000,0x7fff436222c0,0x7f71024ef040,1000000,0x7fff436222d0,0x7f7101d4d040,1000) 10.64s CNR:OFF Dyn:1 FastMM:1 TID:0  NThr:1

对于 f(8),它显示 NThr:8

MKL_VERBOSE Intel(R) MKL 2020.0 Product build 20191122 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.50GHz lp64 intel_thread
MKL_VERBOSE DSYRK(U,T,1000,1000000,0x7ffe6b39ab40,0x7f4bb52eb040,1000000,0x7ffe6b39ab50,0x7f4bb4b49040,1000) 11.98s CNR:OFF Dyn:1 FastMM:1 TID:0  NThr:8

我仍然没有从额外的内核中获得任何预期的性能提升。


编辑 2

我能够使用 Microsoft 的 MKL 分发版获得预期结果,但无法像演练中那样使用 Intel 的官方分发版。看来 MS 使用的是 GNU 线程库;问题可能出在线程库中而不是 blas/lapack 本身吗?

最佳答案

现在才看到这个:您是否检查了明显的一个,即 CentOS 上的 R 是否真的选择了 MKL?

我记得,CentOS 上的 R 是在一个更,咳咳,“受限”的模式下构建的,带有 R 引用 BLAS。如果是这种情况,您根本无法切换并选择另一个,就像我们在 Debian 和 Ubuntu 中已经做了 20 多年,因为在编译 R 时需要不同的初始选择。

编辑:根据后续讨论(请参阅下面的评论),我们都重新意识到让线程库/模型保持一致很重要。 MKL 是 Intel 产品,默认使用他们的线程库,在 Linux 上,GNU 编译器更接近系统并且有自己的。需要选择后一个。在我的 writeup / script for the MKL on .deb systems我用

echo "MKL_THREADING_LAYER=GNU" >> /etc/environment 

所以在机器上设置这个“系统范围”,也可以只将它添加到 R 环境文件中。

关于r - 为什么并行 MKL 不比 R 3.6 中的串行快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61784238/

相关文章:

r - 如何将值列表分配给 R 中的 HashMap ?

r - 如何根据多个值排除 R 中的行?

r - 使用 data.table 快速读取并组合多个文件(使用 fread)

c++ - 将 Matlab eig(A,B)(广义特征值/特征向量)重写为 C/C++

c - 从文件中读取 MKL_INT 时的特殊行为

r - 从 SQL Server 获取数据时使用 arules 的关联规则

r - K-均值算法:Lloyd、Forgy、MacQueen、Hartigan-Wong

c++ - 英特尔 MKL 内存管理和异常

c++ - MKL ScaLapack 问题

python - 将 MKL 链接到 Anaconda 中已安装的 Numpy?