比在 Windows 上针对英特尔 MKL 库重新编译 R 更简单的解决方案就是
- 从https://mran.microsoft.com/download安装 Microsoft R Open ,它带有过时的 R 版本 3.5.3,但也带有英特尔 MKL 多线程 BLAS 库
- 从https://cran.r-project.org/bin/windows/base/安装最新版本的 R ,即当前为 R 3.6.2
- 将文件 libiomp5md.dll、Rblas.dll 和 Rlapack.dll 从 C:\Program Files\Microsoft\R Open\R-3.5.3\bin\x64 复制到 C:\Program Files\R\R-3.6.2\bin \x64(如果您愿意,可以先备份现有的默认非超线程 Rblas.dll 和 Rlapack.dll 文件)
- 将 Microsoft R Open 库/包 MicrosoftR、RevoIOQ、RevoMods、RevoUtils、RevoUtilsMath 和 doParallel 从 C:\Program Files\Microsoft\R Open\R-3.5.5\library 复制到您的默认包目录,例如 C:\Documents\R \win库\3.6
- 将文件 Rprofile.site 和 Renviron.site 从目录 C:\Program Files\Microsoft\R Open\R-3.5.5\etc 复制到 C:\Progral Files\R\R-3.6.2\etc
- 将文件 Rprofile.site 中的第 24 行替换
options(repos=r)
为 options(repos="https://cran.rstudio.com")
(或您最喜欢的 CRAN 存储库 - 您也可以使用“ https://cran.revolutionanalytics.com ”,具有所有包的最新每日构建的 MRO 存储库)以确保它将安装最新的 CRAN 包,而不是过时的 mran.microsoft.com 镜像,该镜像具有过时的包版本,在 2019 年 4 月 15 日冻结。还用 # 注释掉第 153、154 和 155 行
然后重新启动 RStudio 以检查它是否工作,在我的 Intel Core i7-4700HQ 2.4GHz 4 核/8 线程笔记本电脑上使用小型 SVD 基准测试:
getMKLthreads()
4
# Singular Value Decomposition
m <- 10000
n <- 2000
A <- matrix (runif (m*n),m,n)
system.time (S <- svd (A,nu=0,nv=0))
user system elapsed
15.20 0.64 4.17
没有安装英特尔 MKL 的相同基准测试运行在
user system elapsed
35.11 0.10 35.21
所以我们在这里获得了 >8 倍的速度提升!
启动并运行英特尔 MKL 的 Microsoft R Open 6.2 屏幕截图:
或者,如果您不喜欢将文件从 MRO 复制到最新的 R 安装,您也可以将文件从免费的英特尔 MKL 安装复制到您的 R 安装,以获得多线程操作(如下面的另一个答案中所述):
- 从https://software.intel.com/en-us/mkl/choose-download安装英特尔 MKL (免费)
复制这些文件夹中的所有内容
C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64\mkl
C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64\compiler
至
C:\Program Files\R\R-3.6.1\bin\x64
- 在目标文件夹中,创建 mkl_rt.dll 的 2 个副本并将其中一个重命名为 Rblas.dll,另一个 Rlapack.dll 替换原始文件并保留 mkl_rt.dll。
- 这不会为您提供函数 setMKLthreads() 和 getMKLthreads() 函数,但可以设置英特尔 MKL 线程的 nr,因为这些是 MRO 包 RevoUtilsMath 附带的。但是对于大多数人来说,默认线程数设置等于物理内核数就可以了……
不知道微软怎么了,为什么他们不再更新 MRO ......以及为什么他们也放弃了对 Mac OS X 的支持......
我希望,鉴于英特尔 MKL 现在是免费的,R 内核的人迟早会提供一个预编译的 R 版本,该版本被编译为使用英特尔 MKL 库,或者可能在运行时检测是否安装了英特尔 MKL,如果它是,使用它。我认为这很重要,特别是因为一个好的多线程 BLAS 的易用性也决定了一个人将如何开发包 - 例如,如果一个好的多线程 BLAS 可用于所有操作系统,那么一个人会转向使用 RcppArmadillo,它依赖于任何一个 BLAS已安装(但在 Windows 上,如果未安装 Intel MKL,时间会大大降低),如果没有,RcppEigen 将是最好的选择,因为它有自己的多线程矩阵代数,与编译 R 的 BLAS 无关...... ...
在 Ubuntu 上,很容易让 R 使用 Intel MKL,而无需重新编译 R,如下所述:https ://github.com/eddelbuettel/mkl4deb
PS 轻微的问题是运行 setMKLthreads(4) 会导致 RStudio 崩溃(虽然这在官方 MRO 3.5.3 中已经是一个问题)但它在 R 控制台中确实可以正常工作......