2015-03-31 73 views
10

我在我的大學使用計算機羣集時出現矩陣錯誤,無法在本地計算機上重現。我認爲這可能是由於矩陣庫(BLAS,LAPACK,ATLAS等)的不同所致。我不知道很多關於比我讀過here等這些庫,但我想應該有一個辦法讓R鍵告訴我哪個矩陣庫,它與(它的使用即哪些)安裝,類似於到sessionInfo()告訴我它正在使用哪個版本的R包。如何確定我的R安裝使用哪個矩陣庫?

回答

5

雖然有可能不是這個明確的一個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-bit LSB executable, 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 for "/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) 

此輸出的第五行表明,R是使用BLAS庫,特別是libblas3

+0

感謝您的詳細解答。我從來都不會自己弄明白。令人遺憾的是R沒有「關於我」的功能,比如「R --version」,但也許它可以被稱爲「R --buildoptions」。 – rcorty 2017-01-13 13:39:19

4

的據我所知,沒有一個特定的功能(尤其不要在基礎R),這將使你的BLAS版本。 R很可能會使用系統附帶的標準庫(除非有人使用特定的BLAS版本從源代碼構建)。

你不得不從終端做到這一點,類型

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 
+0

很好的解釋。我想也可以用@rcorty來發現Blas是否真的是問題的原因。通過安裝一系列Blas庫並更新符號鏈接來一次測試一個庫,以查看它是否複製錯誤。 – dww 2017-01-06 17:26:25

+0

感謝您的回覆。我特別感興趣的是其中與我共享一臺機器的其他人使用指定的矩陣數學庫從源代碼構建了R,例如。 ATLAS,BLAS,OpenBLAS等。如果我的問題不夠清楚,請道歉。我很好奇,如果我能弄清楚他做了什麼。 – rcorty 2017-01-13 13:32:26