r - 如何确定我的 R 安装正在使用哪些矩阵库?

在我的大学使用计算机集群时出现矩阵错误,无法在本地计算机上重现。我认为这可能是由于矩阵库(BLAS、LAPACK、ATLAS 等)的不同。除了我读过的 here 之外,我对这些库了解不多,但我认为应该有一种方法让 R 告诉我它安装了哪些矩阵库(即它正在使用哪些矩阵库),类似于 sessionInfo() 告诉我它正在使用哪个版本的 R 包。

最佳答案

虽然可能没有明确的 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

https://stackoverflow.com/questions/29372810/

相关文章:

java - react-native run-android 构建错误 ':app:generat

java - Gradle 中的 uberJar、fatJar 和 shadowJar 有什么区别?

java - 在 Eclipse 中添加 API 基线

java - 与 Maven 相比,构建 Java Web 应用程序的更好、更简单和更现代的方法是什

c++ - 使用 Cython 和 C++ 组织项目

ios - bundle 的 Info.plist 不包含 CFBundleVersion 键或其值

java - 最好的 Ant 教程/快速入门?

.net - 在构建时生成的 T4 模板上使用的 MSBuild 锁定 dll

java - 如果激活多个配置文件,如何解决冲突的属性

build - MSBuild:并行构建和 .Net 项目