gputools 是 R 底下的一個套件,可以將 CUDA 引入 R 中作計算,目前是 0.28 版
買了這張顯卡本來是要幫我的論文計算碎形維度的,但直到我都算完了套件還沒有裝好
昨天終於突破困境把 R 的 gputools 給裝起來了
過程中大概需要突破數個重大關卡...
1. 先裝CUDA
參考Installing CUDA Toolkit 7.5 on Ubuntu 14.04 Linux這篇文章的裝法,我簡述過程1.1下載CUDA 到 https://developer.nvidia.com/cuda-downloads 下載最新版的工具
1.2 我選 Linux x86_64 Ubuntu 14.04 deb(local)
並下載 1.9GB 的檔案,下載完後用命令安裝該檔案
sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install cuda
跑完之後算是安裝完成CUDA了,這時建議重新開機,讓 CUDA 的驅動載入
1.3 還要設定環境變數
到 ~/.bashrc 底下新增 幾行路徑
vim ~/.bashrc
到最底下加入
export CUDA_HOME=/usr/local/cuda-7.5
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
PATH=${CUDA_HOME}/bin:${PATH}
export PATH
然後存檔,重開機(或使用 source .bashrc)
這樣CUDA才算是裝完了,如果要測試可以安裝範例來跑看看,在原本的文章中有
2. 安裝 gputools
到 CRAN - Package gputools 下載 gputools,我這時是 0.28 版,八成也不會再更新了
下載這個 Package source: gputools_0.28.tar.gz
下載之後你可以直接安裝,如果過了就沒問題,但問題我就是不過
直接安裝可以鍵入
sudo R CMD INSTALL gputools_0.28.tar.gz
我的會出現編譯錯誤,這時請把該檔案解壓縮,修改 src 資料夾底下的 Makefile
我把編譯指令 NVCC 中的 -gencode arch=compute_10,code=sm_10 刪除
錯誤變成 13,因此也把 -gencode arch=compute_13,code=sm_13 刪除
重新打包tar檔
sudo R CMD build gputools
sudo R CMD INSTALL gputools_0.28.tar.gz
可以編譯,但仍有錯誤,檢查
src 資料夾底下的 config.mk
發現 $(CUDA_HOME)/include 沒有這個檔案(CUDA HOME 在 /usr/lib/R/)
真正的檔案在 /usr/share/R/include
所以建立軟連結
cd /usr/lib/R/
sudo ln -s /usr/share/R/include include
再次安裝
sudo R CMD INSTALL gputools_0.28.tar.gz
發現會編譯完成,但再檢查套件載入時,無法載入共用文件 libcublas.so.7.5 檔
這是讓我卡最久的地方,先找出該檔案在哪
sudo updatedb
locate libcublas.so.7.5
我的在
/usr/local/cuda-7.5/targets/x86_64-linux/lib/libcublas.so.7.5
這個問題不是因為你的環境變數沒設定好,是 R 的環境變數沒設定好
所以打開 R ,執行
Sys.getenv("LD_LIBRARY_PATH")
簡單看一下他顯示什麼
然後離開 R ,去修改R內部的LD_LIBURARY_PATH
cd /usr/lib/R/etc/
sudo vim ldpaths
插入 :/usr/local/cuda-7.5/targets/x86_64-linux/lib 在適當的地方,注意要有冒號
其實直接插在第三行應該也可以,儲存後離開,這時打開 R
Sys.getenv("LD_LIBRARY_PATH")
應該可以看到顯示 /usr/local/cuda-7.5/targets/x86_64-linux/lib/ 這個路徑了
最後請再安裝 gputools 再給他一次機會
sudo R CMD INSTALL gputools_0.28.tar.gz
應該就會過了
3.測試 gputools
我參考了R and GPU 這個網站的範例
進入 R
#載入套件
library("gputools")
#撰寫函數,測試矩陣乘法
gpu.matmult <- font="" function="" n="">->
A <- font="" matrix="" n="" runif="">->
B <- font="" matrix="" n="" runif="">->
tic <- font="" sys.time="">->
C <- a="" b="" font="">->
toc <- font="" sys.time="">->
comp.time <- -="" font="" tic="" toc="">->
cat("CPU: ", comp.time, "\n")
tic <- font="" sys.time="">->
C <- b="" font="" gpumatmult="">->
toc <- font="" sys.time="">->
comp.time <- -="" font="" tic="" toc="">->
cat("GPU: ", comp.time, "\n")
}
#呼叫函數
gpu.matmult(1)
gpu.matmult(10)
gpu.matmult(100)
gpu.matmult(1000)
gpu.matmult(2000)
應該可以看到 CPU 和 GPU 在運算時間的差異,矩陣越大 GPU 越有優勢
但注意別輸入超過 10000 ,我的顯卡記憶體不足,最後會溢位
後記
gputools 這個套件有些時間沒有修正了,沒有跟上 CUDA 的速度,因此有些路徑可能會有錯,希望這篇可以幫到有需要的朋友們,開心的使用 GPU 進行運算。
https://github.com/nullsatz/gputools/wiki/Install
回覆刪除