有没有办法从 R 内部检测 R 使用的 BLAS 版本?我正在使用 Ubuntu,并且我安装了几个 BLAS 版本 - 从 R 的角度来看,我只是不知道哪个是“活动的”!
我知道http://r.789695.n4.nabble.com/is-Rs-own-BLAS-td911515.html布赖恩·里普利在 2006 年 6 月说这是不可能的 - 但事情发生了变化吗?
有没有办法从 R 内部检测 R 使用的 BLAS 版本?我正在使用 Ubuntu,并且我安装了几个 BLAS 版本 - 从 R 的角度来看,我只是不知道哪个是“活动的”!
我知道http://r.789695.n4.nabble.com/is-Rs-own-BLAS-td911515.html布赖恩·里普利在 2006 年 6 月说这是不可能的 - 但事情发生了变化吗?
我认为你不能。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"
>
在 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
如果它足以让您知道可以在哪个路径找到 BLAS 库,则此解决方案有效。例如,我使用此解决方案来决定是加载“普通”R 版本还是 OpenBLAS 版本的包库。
当然,您无法知道其他人将他们的库存储在哪里,因此不适合在包或共享代码中使用。但对于自己的维护,它可以使用:
extSoftVersion()["BLAS"]
## [1] "/the/path/to/your/libblas.so"
如果安装了 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"