我该如何确定我的R安装使用了哪些矩阵库?

12

我在使用大学的计算机集群时遇到了矩阵错误,但在我的本地机器上无法复现。我认为这可能是由于矩阵库(BLAS、LAPACK、ATLAS等)的区别导致的。我对这些库不太了解,除了在这里读到的一些内容外。不过我想应该有一种方法可以让R告诉我它安装了哪些矩阵库(即它正在使用哪些库),类似于sessionInfo()告诉我它正在使用哪个版本的R包。

3个回答

8

虽然可能没有专门的R函数来实现这个功能,但也许你可以利用shell命令(例如fileldd)来获取一些线索,而不需要重新构建R或在集群上获取root权限:

(rpath <- Sys.which("R"))
#            R
# "/usr/bin/R"

为了确保ldd能够正常工作,请查看文件的类型:

system2("file", rpath)
# /usr/bin/R: Bourne-Again shell script, ASCII text executable

如果你的文件显示为实际可执行文件(例如ELF 64位LSB可执行文件,x86-64,...),则跳过此步骤。

script <- readLines(rpath)
script[grepl("/bin/", script)]
# [1] "#!/bin/bash"
# [2] "     if [ -x \"/usr/${libnn}/R/bin/exec/R\" ]; then"
# [3] "     elif [ -x \"/usr/${libnn_fallback}/R/bin/exec/R\" ]; then"
# [4] "## some systems have a more portable sed, e.g. /usr/xpg4/bin/sed on Solaris,"
# [5] "SED=/bin/sed"
# [6] "      exec sh \"${R_HOME}/bin/Rcmd\" \"${@}\" ;;"
# [7] "R_binary=\"${R_HOME}/bin/exec${R_ARCH}/R\""

这告诉我实际可执行文件是/usr/lib/R/bin/exec/R(或/usr/lib64/...)。这有点推断,但这是一个步骤。这在我的ubuntu上的R-3.3.2上运行良好,因此我只能假设它在不同的操作系统上也会类似。如果这没有提供信息,您还可以grep "/lib""/exec"(或仅检查整个脚本文件以获取其他线索)。
一旦您知道脚本调用的路径(或者如果它一开始就不是脚本),请找到共享库依赖项:
system2("ldd", "/usr/lib/R/bin/exec/R")
#         linux-vdso.so.1 =>  (0x00007ffcfadcd000)
#         libR.so => /usr/lib/R/lib/libR.so (0x00007f746f615000)
#         libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f746f3eb000)
#         libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f746f025000)
#         libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f746eda8000)
#         libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f746eaa2000)
#         libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f746e85b000)
#         libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f746e61d000)
#         liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f746e3fb000)
#         libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f746e1ea000)
#         libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f746dfd1000)
#         librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f746ddc9000)
#         libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f746dbc4000)
#         libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f746d9b5000)
#         /lib64/ld-linux-x86-64.so.2 (0x0000560abd5fa000)
#         libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f746d78b000)

这个输出的第5行表明R正在使用BLAS库,具体来说是libblas3

感谢您详尽而详细的回答。我自己从来没有想到过这一点。很遗憾R没有像“R --version”那样的“关于我”功能,但也许可以称之为“R --buildoptions”。 - rcorty
1
值得注意的是,如果 system2("file", rpath) 显示一个可执行文件,则“跳过下一步”意味着调用 system2("ldd", rpath) - Alex

4
据我所知,特别是在基础R中没有一个特定的函数能够提供BLAS版本。除非有人使用特定的BLAS版本从源代码构建它,否则R很可能会使用您系统自带的标准库。
你需要从终端操作,输入:
locate libblas.so

它可能会在/usr/lib/libblas.so/usr/lib64/libblas.so中,而且位置很可能是一个符号链接。所以请跟随这些链接。

ls -l /usr/lib/libblas.so

如果您想将符号链接更改为指向不同的BLAS库,可以执行以下命令:update-alternatives --config libblas.so.3gf,然后选择要使用的版本。这篇文章在此处详细解释了它:https://www.r-bloggers.com/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/ 另一种确定您正在使用哪个版本的方法是安装您想要的任何BLAS实现,例如OpenBLAS,然后用符号链接替换标准R BLAS库。请确保使用--with-shared-blas选项安装R,如此处所述:https://cran.r-project.org/doc/manuals/r-release/R-admin.html#BLAS然后您只需要:
# navigate to your R directory
cd  …/path-to-R-installation/lib/R/lib
# backup the original 
mv libRblas.so libRblas.backup 
# create simlink
ln –s …/path-to-new-0blas-library/new-lib.so libRblas.so

很好的解释。我猜@rcorty也可以用这个方法来发现Blas是否真的是问题的原因。通过安装一系列Blas库并更新符号链接,逐一测试它们,看是否会重现错误。 - dww
谢谢您的回复。我特别关注的是这种情况:与我共用一台机器的其他人使用指定的矩阵数学库(例如ATLAS、BLAS、OpenBLAS等)从源代码构建了R。如果我的问题表述不够清楚,我很抱歉。我想知道是否可以找出他所做的事情。 - rcorty

-5

谢谢您的回复。根据我阅读的文章,它提供了有关如何使用不同矩阵库构建R的信息,但并没有帮助我弄清楚现有构建中使用了哪个矩阵库。 - rcorty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接