Blas版本的R检测

26

有没有一种方法可以在R内部检测R所使用的BLAS版本?我正在使用Ubuntu,并安装了几个BLAS版本,但我不知道从R的角度来看哪一个是“活动”的!

我知道这里有一个帖子http://r.789695.n4.nabble.com/is-Rs-own-BLAS-td911515.html,其中Brian Ripley在2006年6月表示这是不可能的,但事情是否有所改变呢?


1
你是否检查了在[gcbd][1]包中这行代码是否有问题?这是我开始查看的地方。 [1]: http://cran.r-project.org/web/packages/gcbd/index.html - cbeleites unhappy with SX
4个回答

26

我认为你不行。R将基于BLAS 接口构建,而R本身不知道哪个软件包提供了实际的库。

你只能查看ldd输出。在我的服务器上,这指向Atlas。

edd@max:~$ ldd /usr/lib/R/bin/exec/R
    linux-vdso.so.1 =>  (0x00007fffc8ddb000)
    libR.so => /usr/lib/libR.so (0x00007f8be940c000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8be91ef000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8be8e4d000)
    libblas.so.3gf => /usr/lib/atlas-base/atlas/libblas.so.3gf (0x00007f8be88e4000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8be8660000)
    libreadline.so.6 => /lib/libreadline.so.6 (0x00007f8be841d000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f8be81e1000)
    liblzma.so.2 => /usr/lib/liblzma.so.2 (0x00007f8be7fbf000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8be7da6000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8be7b9e000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8be799a000)
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f8be778b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8be99a5000)
    libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f8be7475000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8be725f000)
    libtinfo.so.5 => /lib/libtinfo.so.5 (0x00007f8be7037000)
    libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f8be6e01000)
edd@max:~$ 
这是有道理的,因为这个提供BLAS的包在Debian包装中具有最高优先级。 编辑,九年后:R不断增强其功能,现在可以通过sessionInfo()报告此信息(甚至可以漂亮地打印出来)。在我的机器上(R 4.1.1,Ubuntu 21.04),它也只显示了这个。
> sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 21.04

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.13.so

[...]

您也可以直接访问这两个路径:

> si <- sessionInfo()
> si$BLAS
[1] "/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3"
> si$LAPACK
[1] "/usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.13.so"
> 

2
对于Mac用户,我认为这应该可以工作:otool -L /Library/Frameworks/R.framework/R - user2503795
在 Debian 或 Ubuntu 上,我认为您可以执行以下操作:update-alternatives --config libblas.so.3。像 Dirk 所写的那样使用 ldd,我看到我的 R 指向 /usr/lib/libblas.so.3,这是一个链接到 /etc/alternatives/libblas.so.3 的文件。 - Jack Wasey
是的,如果你对系统有一些了解,那么update-alternatives是个不错的选择。我在旧的gcbd软件包/测试框架/文档中使用了这个技巧。但我不确定是否推荐将其作为面向R用户的命令。 - Dirk Eddelbuettel
也许我们应该修改这个答案,以便说 BLAS 版本现在在 sessionInfo() 中报告?答案的另一部分可以保留给旧版本的 R。 - nograpes
这是一个好建议(现在已完成),我去年也大致注意到了。你还记得那个更改是什么时候做的吗?是R 4.0.0吗? - Dirk Eddelbuettel

18

在 R 中,键入:

sessionInfo()

除其他外,它应该为您提供所使用的BLAS。

例如,在我的计算机上,我得到:

Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.6.1    Matrix_1.2-17     tools_3.6.1       Rcpp_1.0.2        grid_3.6.1        data.table_1.12.2 packrat_0.5.0     lattice_0.20-38  
[9] stm_1.3.3        


这似乎容易多了,当 Dirk 回答时这不是一个选项吗? - Brian Stamper
2
是的,这个功能直到2018年才出现。提交历史记录表明他们在2017年开始着手开发。 - gomfy

9

如果你只需要知道BLAS库的路径,那么这个解决方案就可行。例如,我使用这个解决方案来决定是否加载“正常”R版本或OpenBLAS版本的软件包库。

当然,你不可能知道其他人存储库的位置,所以它不适用于包或共享代码。但是对于自己维护的项目可以使用:

extSoftVersion()["BLAS"]
## [1] "/the/path/to/your/libblas.so"

6
如果已安装lsof,则以下是Linux的部分答案。
# on a system using openblas:
> grep('blas', system2('lsof', c('-p', Sys.getpid()), stdout=TRUE), value = TRUE)
[1] "R       282 docker  mem    REG   0,52 29998440     233 /usr/lib/libopenblasp-r0.2.12.so"


# on a system using R internal Blas:
> grep('blas', system2('lsof', c('-p', Sys.getpid()), stdout=TRUE), value = TRUE)
[1] "R       157 docker  mem    REG   0,44   180936     3105 /usr/local/lib/R/lib/libRblas.so"

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