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

dz6r00yl  于 2023-02-25  发布在  Windows
关注(0)|答案(4)|浏览(865)

对R使用替代BLAS具有几个优点,例如参见https://cran.r-project.org/web/packages/gcbd/vignettes/gcbd.pdf
Microsoft R Openhttps://mran.revolutionanalytics.com/documents/rro/installation/#sysreq使用英特尔的MKL而不是默认的参考BLAS来加快计算速度。
我的问题是:
将英特尔的MKL库手动链接到Windows上R的最新版本(https://cran.r-project.org/bin/windows/base/)的确切步骤是什么?

**更新2016年7月20日:**以下是关于如何为Windows 64位R构建基于OpenBLAS的Rblas.dll(R ≥ 3.3.0)的详细说明:http://www.avrahamadler.com/r-tips/build-openblas-for-windows-r64/

pw9qyyiw

pw9qyyiw1#

比在Windows上针对英特尔MKL库重新编译R更简单的解决方案是
1.从https://mran.microsoft.com/download安装Microsoft R Open,它随过时的R 3.5.3版一起提供,但也随“英特尔MKL”多线程BLAS库一起提供
1.从https://cran.r-project.org/bin/windows/base/安装最新版本的R,即当前的R 3.6.2
1.将文件libimop5md.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文件)
1.从C:\Program Files\Microsoft\R Open\R-3.5.5\库中复制Microsoft R开放库/包MicrosoftR、RevoIOQ、RevoMods、RevoUtils、RevoUtilsMath和doParallel到默认包目录,例如C:\Documents\R\win-library\3.6
1.将文件 Rprofile.site和Renviron.site从目录C:\程序文件\Microsoft\R打开\R-3.5.5\etc复制到C:\程序文件\R\R-3.6.2\etc
1.将文件www.example.com options(repos=r)中的第24行替换Rprofile.site为options(repos="https://cran.rstudio.com")(或您最喜欢的CRAN存储库-您也可以使用“https://cran.revolutionanalytics.com“,MRO存储库包含所有软件包的最新每日构建版本),以确保它将安装最新的CRAN软件包,而不是安装mran.microsoft.com具有过时软件包版本的过时www.example.com镜像,于2019年4月15日冻结。同时使用#注解掉第153、154和155行
然后重新启动RStudio检查它是否工作,在我的英特尔酷睿i7- 4700 HQ 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安装,以获得多线程操作(如下面的另一个答案所述):
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

C:\Program Files\R\R-3.6.1\bin\x64

1.在目标文件夹中,创建mkl_rt. dll的2个副本,并将其中一个重命名为Rblas.dll,另一个重命名为Rlapack.dll,替换原始文件并保留mkl_rt. dll。
1.这不会为您提供setMKLthreads()和getMKLthreads()函数来设置英特尔MKL线程数,因为这些函数随MRO软件包RevoUtilsMath提供。但对于大多数人来说,默认线程数设置为物理内核数是可以的...
不知道微软怎么了,为什么他们不再更新MRO...为什么他们也放弃了MacOSX的支持...
鉴于“英特尔MKL”现在是免费的,我希望R内核人员迟早会提供一个预编译的R版本,该版本经过编译后可以使用“英特尔MKL”库,或者可能在运行时检测是否安装了“英特尔MKL”,如果安装了,就使用它。我认为这一点很重要,特别是因为一个好的多线程BLAS的容易获得也决定了一个人将如何开发软件包-例如,如果一个好的多线程BLAS可以用于所有操作系统,那么人们就会转向使用RcppArmadillo,这福尔斯于已经安装的任何BLAS(但在Windows上,如果未安装“英特尔MKL”,则会给予计时性能大幅下降),如果未安装,则RcppEigen将是最佳选择,因为它有自己的多线程矩阵代数,与编译R所依据的BLAS无关......
顺便说一句,在Ubuntu上,让R使用英特尔MKL非常容易,无需重新编译R,如下所述:https://github.com/eddelbuettel/mkl4deb
PS小问题是运行setMKLthreads(4)会使RStudio崩溃(虽然这在官方MRO 3. 5. 3中已经是一个问题了),但它在R控制台中确实工作正常...

dbf7pr2w

dbf7pr2w2#

我可以将R3.6.0与您使用builder创建的自定义dll链接起来。基本上,您必须导出相同的符号Rblas.dllRlapack.dll do。启动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目录复制到PC中的某个位置,然后在其中运行:

# 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文件夹中找到libiomp5md.dll

方法二

此方法使用更多磁盘空间,但更简单。复制这些文件夹中的所有内容

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

hec6srdp

hec6srdp3#

我刚刚尝试了R3.5.1的安装,我安装了MicrosoftROpen和CRANR,并复制了libimop5md.dll,覆盖了Rblas.dll,从MROMKL对应的Rlapack.dll链接到Windows上的CRANR(类似于上面的另一个答案,但也需要复制文件libimop5md.dll),结果很好,根据Github上的www.example.com包,CRANR运行速度和MRO一样快version.compare package on Github ( https://github.com/andrie/version.compare )

lsmepo6l

lsmepo6l4#

Tom Weenseleers提出的解决方案在最新的R版本中对我起作用。谢谢。
我想在这个讨论中加入一些东西,因为它是相关的,我不确定如何将此添加到更大的社区中。请原谅我的描述,我是一个业余爱好者。
此解决方案似乎至少破坏了另外两个R包igraph和clusterProfiler。clusterProfiler依赖于igraph,因此根本原因是igraph。其他依赖于igraph的包也很可能如此。
我发布这个是因为我找到了一个简单的变通办法,经过广泛的搜索,我从来没有发现这个明确解决任何论坛,这可能会帮助别人。
供参考,clusterProfiler_4.4.4和igraph_1.3.4 R版本4.2.1,平台:Windows 10 x64(内部版本号22000)(64位)
实现上述解决方法后调用库(igraph)时,弹出窗口中出现以下错误:
找不到rsession-utf8.exe入口点无法在动态链接库C:Program Files\R\R-〉4.2.1\library\graph\libs\x64\igraph.dll中找到过程入口点quadmath_snprintf。
按下"确定"会产生R格式的错误消息
错误:在inDL(x,〉as. logical(local),as. logical(now),...)中为'igraph'加载包或命名空间失败:无法加载共享对象"C:/Program Files/R/R-〉4.2.1/库/igraph/库文件/x64/igraph. dll":加载库失败:找不到指定的过程。
解决方法-当在R中实现使用MKL的解决方法时,保留原始的Rlapack.dll和Rlablas.dll(我只是简单地重命名了它们,即Rblas_orig.dll)要使用igraph或相关的包,交换. dll文件名,这样两个原始的R blas文件就有了原始的名称,MKL文件也被重命名了(即Rblas_mkl. dll)。
不幸的是,这将禁用MKL,直到您再次恢复. dll文件名并重新启动R,但只要您不需要同时使用igraph和MKL,它就可以工作,尽管令人沮丧。
如果有人找到更好的解决办法,请告诉我。

相关问题