在Windows上将英特尔的数学核心库(MKL)链接到R.

maj*_*jom 20 windows r blas intel-mkl revolution-r

使用替代BLAS for R有几个优点,例如https://cran.r-project.org/web/packages/gcbd/vignettes/gcbd.pdf.

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/)的确切步骤是什么?


更新20-07-2016: 这里有关于如何为R≥3.3.0的Windows 64位R构建基于OpenBLAS的Rblas.dll的详细说明:http://www.avrahamadler.com/r-tips /集结openblas换窗户-R64 /

Tom*_*ers 12

比在 Windows 上针对英特尔 MKL 库重新编译 R 更简单的解决方案是

  1. https://mran.microsoft.com/download安装 Microsoft R Open ,它随过时的 R 版本 3.5.3 以及英特尔 MKL 多线程 BLAS 库一起提供
  2. https://cran.r-project.org/bin/windows/base/安装最新版本的 R ,即当前 R 3.6.2
  3. 将文件 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 文件)
  4. 将 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
  5. 将文件 Rprofile.site 和 Renviron.site 从目录 C:\Program Files\Microsoft\R Open\R-3.5.5\etc 复制到 C:\Progral Files\R\R-3.6.2\etc
  6. 将文件 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 以检查它是否有效,在我的英特尔酷睿 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
Run Code Online (Sandbox Code Playgroud)

未安装英特尔 MKL 的相同基准测试运行于

   user  system elapsed 
  35.11    0.10   35.21 
Run Code Online (Sandbox Code Playgroud)

所以我们在这里获得了 8 倍以上的速度提升!

启动并运行英特尔 MKL 的 Microsoft R Open 6.2 的屏幕截图:

在此处输入图片说明

或者,如果您不喜欢将文件从 MRO 复制到最新的 R 安装,您还可以将文件从免费的英特尔 MKL 安装复制到您的 R 安装以获得多线程操作(如下面的其他答案所述):

  1. 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
Run Code Online (Sandbox Code Playgroud)

C:\Program Files\R\R-3.6.1\bin\x64
Run Code Online (Sandbox Code Playgroud)
  1. 在目标文件夹内,创建 mkl_rt.dll 的 2 个副本,并将其中一个重命名为 Rblas.dll,另一个重命名为 Rlapack.dll,替换原始文件并保留 mkl_rt.dll。
  2. 这不会为您提供 setMKLthreads() 和 getMKLthreads() 函数来设置英特尔 MKL 线程的 nr,因为它们随 MRO 包 RevoUtilsMath 一起提供。但是对于大多数人来说,线程的默认 nr 设置等于物理内核的 nr 将是可以的...

不知道微软怎么了,为什么他们不再更新 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 控制台中运行正常......

  • 将 MKL 库从 MRO 移动到普通 R 违反了许可证:https://mran.microsoft.com/assets/text/mkl-eula.txt (2认同)

Gui*_*shi 12

我能够将 R 3.6.0 与您使用builder创建的自定义 dll 链接起来。基本上你必须导出相同的符号Rblas.dllRlapack.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
Run Code Online (Sandbox Code Playgroud)

编辑删除“页眉”和“页脚”的两个文件,并使所有带有符号名称(例如:)的行都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
Run Code Online (Sandbox Code Playgroud)

编辑undefined_symbols_list只保留每行中的名称并创建一个不同的新列表

findstr /v /g:undefined_symbols_list Rlapack_list_R > Rlapack_list
nmake libintel64 export=..path..\Rlapack_list name=Rlapack
Run Code Online (Sandbox Code Playgroud)

使用dumpbin /dependents Rlapack.dll,您可以看到它们依赖于libiomp5md.dll,您可以redist在 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
Run Code Online (Sandbox Code Playgroud)

C:\Program Files\R\R-3.6.1\bin\x64
Run Code Online (Sandbox Code Playgroud)

在目标文件夹内,创建 2 个副本mkl_rt.dll并重命名其中一个,Rblas.dll另一个Rlapack.dll替换原件并保留mkl_rt.dll.


小智 5

刚刚尝试安装 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 一样快