[英]Linking Intel's Math Kernel Library (MKL) to R on Windows
为 R 使用替代 BLAS 有几个优点,请参见例如https://cran.r-project.org/web/packages/gcbd/vignettes/gcbd.Z437175BA41937410EE004E1 。
Microsoft R Open https://mran.revolutionanalytics.com/documents/rro/installation/#sysreq正在使用 Intel 的 MKL 而不是默认的 Reference BLAS 来加速计算。
我的问题是:
将英特尔的 MKL 库**手动链接到 R** 在 Windows 上的最新版本( https://cran.r-project.org/bin/windows/base/ )的确切步骤是什么?
UPDATE 20-07-2016: Here is very detailed description on how to build a OpenBLAS-based Rblas.dll for 64-bit R for Windows for R ≥ 3.3.0: http://www.avrahamadler.com/r-tips /build-openblas-for-windows-r64/
比在 Windows 上针对英特尔 MKL 库重新编译 R 更简单的解决方案是
options(repos=r)
第 24 行替换为options(repos="https://cran.rstudio.com")
(或您最喜欢的 CRAN 存储库 - 您也可以使用“ https://cran.revolutionanalytics .com ”,MRO 存储库,具有所有包的最新每日版本),以确保它将安装最新的 CRAN 包,而不是过时的 mran.microsoft.com 镜像,该镜像具有过时的包版本,在 15 日冻结2019 年 4 月。同时用 # 注释掉第 153、154 和 155 行然后重新启动 RStudio 以检查它是否有效,在我的英特尔酷睿 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 安装以获得多线程操作(如以下其他答案所述):
从这些文件夹中复制所有内容
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
不知道微软怎么了,为什么他们不再更新 MRO ......为什么他们也放弃了对 Mac OS X 的支持......
我希望,鉴于现在英特尔 MKL 是免费的,R 核心人员迟早会提供一个预编译的 R 版本,该版本被编译为使用英特尔 MKL 库,或者可能在运行时检测是否安装了英特尔 MKL,如果它是,使用它。 我认为这很重要,特别是因为一个好的多线程 BLAS 的易用性也决定了一个人将如何开发包 - 例如,如果一个好的多线程 BLAS 可用于所有操作系统,那么人们将转向使用 RcppArmadillo,它依赖于任何 BLAS已安装(但在 Windows 上,如果未安装英特尔 MKL,时间会大大缩短),如果没有,RcppEigen 将是最佳选择,因为它具有自己的多线程矩阵代数,无论编译 R 所针对的 BLAS 是什么... ...
在 Ubuntu 上,很容易让 R 使用 Intel MKL,而无需重新编译 R,如下所述: https : //github.com/eddelbuettel/mkl4deb
PS 一个小问题是运行 setMKLthreads(4) 会使 RStudio 崩溃(虽然这在官方 MRO 3.5.3 中已经是一个问题)但它在 R 控制台中运行正常......
我能够将 R 3.6.0 与您使用builder创建的自定义 dll 链接起来。 基本上,您必须导出与Rblas.dll
和Rlapack.dll
相同的符号。 启动Compiler 19.0 Update 4 for Intel 64 Visual Studio 2017 environment
命令提示符:
获取符号:
dumpbin /exports Rblas.dll > Rblas_list
dumpbin /exports Rlapack.dll > Rlapack_list_R
编辑删除“页眉”和“页脚”的两个文件,并使所有带有符号名称的行(例如: 248 F7 00138CE0 dgeevx_
)像dgeevx_
(仅带有名称)。 将builder
目录复制到你电脑的某个地方,然后在里面运行:
# blas links fine
nmake libintel64 export=..path..\Rblas_list name=Rblas
# save lapack errors in another list
nmake libintel64 export=..path..\Rlapack_list_R name=Rlapack 1> undefined_symbols_list
编辑undefined_symbols_list
仅保留每行中的名称并创建一个具有差异的新列表
findstr /v /g:undefined_symbols_list Rlapack_list_R > Rlapack_list
nmake libintel64 export=..path..\Rlapack_list name=Rlapack
使用dumpbin /dependents Rlapack.dll
,您可以看到它们依赖于libiomp5md.dll
,您可以在 mkl 安装的redist
文件夹中找到它。
这种方法使用更多的磁盘空间,但更简单。 从这些文件夹中复制所有内容
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
。
刚刚尝试安装 R 3.5.1。 我将 Microsoft R Open 与 CRAN R 一起安装并复制 libiomp5md.dll 并覆盖 MRO MKL 对应的 Rblas.dll、Rlapack.dll 以链接到 Windows 上的 CRAN R(类似于上面的另一个答案,但需要复制文件 libiomp5md.dll同样)。 根据 Github ( https://github.com/andrie/version.compare ) 上的 version.compare 包,结果很好,CRAN R 的运行速度与 MRO 一样快
Tom Weenseleers 提出的解决方案适用于我最新的 R 版本。 谢谢你。
我想在这个讨论中添加一些东西,因为它是相关的,我不确定如何将它添加到更大的社区。 请原谅我的描述,我是业余爱好者。
此解决方法似乎破坏了至少两个其他 R 包 igraph 和 clusterProfiler。 Clusterprofiler 依赖于 igraph,所以根本原因是 igraph。 可能还有其他 igraph 依赖包。
我发布这个是因为我找到了一个简单的解决方法,经过广泛搜索后,我从未在任何论坛上发现这个问题,这可能对其他人有所帮助。
供参考,clusterProfiler_4.4.4 和 igraph_1.3.4 R 版本 4.2.1,平台:x86_64-w64-mingw32/x64(64 位)ZAEA23489CE3AA9B6406EBB28E0CDA4200Z 10 x64(构建)
在实现上述解决方法后调用 library(igraph) 在弹出窗口中产生以下错误:
rsession-utf8.exe Entry Point Not Found 程序入口点 quadmath_snprintf 无法在动态链接库 C:Program Files\R\R->4.2.1\library\graph\libs\x64\igraph.Z06416233FE5EC4C5933122E4AB248AF1 中找到。
按 OK 在 R 中产生错误消息
错误:package 或 inDL(x, >as.logical(local), as.logical(now), ...) 中的“igraph”的命名空间加载失败:无法加载共享 object 'C:/Program Files/R/ R->4.2.1/library/igraph/libs/x64/igraph.dll': LoadLibrary failure: 找不到指定的程序。
The workaround - When implementing the workaround to use MKL in R, keep the original Rlapack.dll and Rlablas.dll (i simply renamed these ie Rblas_orig.dll) To use igraph or dependent packages, swap the.dll filenames, such that the two原R blas文件有原名,MKL文件改名(即Rblas_mkl.dll)。 重新启动 R,igraph/clusterprofiler 加载正常。
不幸的是,这将禁用 MKL,直到您再次恢复 .dll 文件名并重新启动 R,但只要您不需要同时使用 igraph 和 MKL,它就可以工作,尽管令人沮丧。
如果有人找到更好的解决方案,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.