安装Microsoft R Open(来自
https://mran.microsoft.com/download),它附带了过时的R版本3.5.3,但也带有Intel MKL多线程BLAS库。
安装最新版本的R(来自
https://cran.r-project.org/bin/windows/base/,当前是R 3.6.2)。
从C:\Program Files\Microsoft\R Open\R-3.5.3\bin\x64复制libiomp5md.dll、Rblas.dll和Rlapack.dll文件到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-library\3.6。
从目录C:\Program Files\Microsoft\R Open\R-3.5.5\etc复制文件Rprofile.site和Renviron.site到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
没有安装Intel MKL的同样基准测试在运行时得到了
user system elapsed
35.11 0.10 35.21
因此我们在这里获得了>8倍的速度提升!
运行带有Intel MKL的Microsoft R Open 6.2的截图:
![输入图像描述](https://istack.dev59.com/XAKjV.webp)
或者,如果您不想将文件从MRO复制到最新的R安装程序中,则可以将免费的Intel MKL安装文件复制到R安装程序中以获得多线程操作(如下面的其他答案所述):
- 从https://software.intel.com/en-us/mkl/choose-download(免费)安装Intel 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
- 在目标文件夹中,创建 2 个 mkl_rt.dll 的副本,并将其中一个重命名为 Rblas.dll,另一个重命名为 Rlapack.dll,替换原始文件并保留 mkl_rt.dll。
- 这样做将不会提供 setMKLthreads() 和 getMKLthreads() 函数,以设置 Intel MKL 线程的数量,因为这些函数随 MRO 包 RevoUtilsMath 一起提供。但对于大多数人来说,默认线程数量设置为物理核心数量将足够......
不确定微软怎么回事,为什么他们不再更新 MRO...而且为什么他们也放弃了 Mac OS X 支持...
我希望鉴于现在 Intel MKL 是免费的,R 核心人员迟早会提供预编译的 R 版本,编译为使用 Intel MKL 库,或者在运行时检测是否安装了 Intel 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 控制台中可以正常工作...