在Ubuntu下安裝、配置和測試cuda
在Ubuntu下安裝CUDA要比在Windows下稍微複雜和費事一些,尤其對於平臺和一些其他依賴軟體包的安裝上要求多些。
Nvidia官方只提供了Ubuntu10.10下的CUDA的Toolkit,SDK,自己一開始是想在Ubuntu11.10上安裝CUDA的,結果安裝了編譯時卻出現很多錯誤並且提示gcc版本過高(Ubuntu11.10核心是2.6而預設安裝編譯的gcc是4.6的)後來重新又把gcc4.6解除安裝再裝了gcc4.4。結果由於之前使用的是預設的Ubuntu開源的nvidia驅動,還是不能正常工作,又網上查了重新安裝nvidia官方的驅動,卻在安裝驅動的時候提示後來裝的gcc4.4與核心版本不一致,驅動程式也無法正常編譯和安裝。末了還把我係統上的很多重要軟體包弄壞了,gcc也解除安裝不了。最終只好重新裝回Ubuntu10.10。
經過幾經摺騰終於安裝好了,後來在網上查了一下,貌似國外也有人遇到了類似的問題,只有一篇文章中提到將nvidia的CUDA在11.04上安裝好了http://topic.csdn.net/u/20110809/13/281a50dc-605f-4b32-92bf-4193eeebf7ec.html問題的關鍵主要就是要用與系統核心版本相符的gcc來編譯和安裝nvidia的驅動程式,然後用CUDA要求的不高於4.6版本的gcc來編譯CUDA程式,這樣的話重要的就是切換兩個版本的gcc連結,而至於自己編譯的CUDA程式和系統和之間是否還會有問題則不得而知了,總的說來還是就用與官方提供的版本一致的系統會更可靠些。
不過,自己暫時也不想再換回Ubuntu11.10了,新出來的發行版相容性也還需要改進,而且實際上做程式開發使用的系統也不用像桌面使用者那麼要求太新,關鍵是要求穩定,網上查了一下用Ubuntu10.10的人還是比較多的。現在把安裝過程總結一下,以便下次用上。
Nvidia的SDK中的C/doc目錄下有一個Getting_Started_Linux.pdf文件介紹了怎樣安裝和入門Linux下的CUDA,但是由於要針對不同的Linux發行版,所以有些地方相對介紹得比較大概,但是大部分步驟是和其中一致的。下面正式開始安裝步驟:
1.下載安裝包和驅動程式
下載後需要的四個檔案如下圖所示:
2.驗證系統和安裝相關的軟體包
安裝和後面開發程式時,都需要管理員root許可權,建議是直接用root使用者登陸系統之後安裝,省得每操作一下又要輸入密碼。
首先和Windows平臺下一樣先驗證nvidia顯示卡,在終端中輸入命令:
lspci | grep -i nvidia
我的電腦上執行結果如下:
接下來驗證Ubuntu系統,獲得系統版本資訊,在終端輸入命令如下:
uname -m && cat /etc/*release
我的電腦上執行結果如下:
再驗證gcc版本,如果沒有相關資訊,則需要安裝。輸入如下命令:
gcc –version
我的電腦上執行結果如下:
實際上編寫CUDA程式時還會用到g++,所以將其安裝上。
為了編譯和執行SDK中的示例,還需要freeglut、mesa和opengl相關庫和標頭檔案等支援,Getting_Started_Linux.pdf文件中建議通過如下命令列安裝:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
如果沒有安裝上build-essential,編譯時會出現錯誤“g++: Command not found”,
沒有安裝freeglut、mesa和opengl庫時會在CUDA的SDK程式編譯時給出錯誤“cannot find -lXi -lXmu -lglut”,如下圖所示:
才明白過來的。
Getting_Started_Linux.pdf文件中還提到如果先安裝了nvidia的驅動程式再安裝mesa庫會導致編譯時提示/usr/lib/libGL.so檔案找不到的錯誤“cannot find -lGLU”。這主要是由於安裝mesa庫時會重寫安裝nvidia驅動時建立的/usr/lib/libGL.so檔案。因而最好是先安裝了這些庫,再裝驅動,以免反序安裝造成不得不重新再裝一次驅動以解決錯誤“cannot find -lGLU”。帖子http://topic.csdn.net/u/20110809/13/281a50dc-605f-4b32-92bf-4193eeebf7ec.html中是先安裝了nvidia驅動,然後把/usr/lib/libGL.so檔案備份,然後安裝完freeglut、mesa和opengl庫之後再恢復回去,也是個可行的辦法。
3.安裝nvidia驅動
如果是剛裝好的Ubuntu系統,其中的開源的nvidia顯示卡驅動是沒有啟用的,可以直接安裝nvidia官方下載的驅動,而如果已經激活了則需要先將其解除安裝掉再安裝nvidia官方下載的驅動。
刪除以前啟用的顯示卡驅動或者舊版本的nvidia官方驅動,在終端中輸入如下命令:
sudo apt-get –purge remove nvidia-*
sudo apt-get --purge remove xserver-xorg-video-nouveau
然後重啟電腦,在登入介面或者登陸之後按快捷鍵Ctrl + Alt+F1到第一控制檯。ubuntu在字元介面輸入root使用者名稱和密碼之後。
如果是不需要解除安裝nvidia驅動的情況則可以不重啟而直接按快捷鍵Ctrl + Alt+F1到第一控制檯,不過此時則需要多一個步驟,即輸入如下命令把gui服務關閉:
sudo stop gdm
如果是Ubuntu11.04以上版本則應該輸入如下命令:
sudo stop lightgdm
如果是Ubuntu10.10以前版本則應該輸入如下命令:
sudo /etc/init.d/gdm stop
接著通過cd命令切換到之前下載的顯示卡驅動程式的目錄,通過命令:
sudo sh 驅動程式全名
如我自己的電腦上輸入的是:
sudo sh devdriver.run
回車之後就進入了安裝介面。第一個介面選擇“accept”接受安裝協議,第二個介面,第二個介面選擇“yes”,後面的也都選“OK”或者“yes”就可以一路安裝完畢了。
安裝完之後會重新返回字元介面,此時需要重新開啟gui服務才會再返回到圖形介面,輸入如下命令啟動gui的服務:
sudo start gdm
如果是Ubuntu11.04以上版本則應該輸入如下命令:
sudo start lightgdm
如果是Ubuntu10.10以前版本則應該輸入如下命令:
sudo /etc/init.d/gdm start
最後按快捷鍵Ctrl + Alt+F7返回到圖形介面,這樣nvidia顯示卡官方驅動就安裝完成了。
有些主機板,如獨立顯示卡情況下,可能還需要設定一下grub才能支援nvidia的顯示卡,不然可能重啟之後無法正常進入圖形介面:
開啟系統中的grub配置檔案:
sudo gedit /etc/default/grub
把 “nomodeset”引數加到 GRUB_CMDLINE_LINUX行:
GRUB_CMDLINE_LINUX=”nomodeset”
並更新 grub:
sudo update-grub
4.安裝CUDA所需的cudatoolkit、cudatools和gpucomputingsdk
這部分則非常簡單了,網上有一些文章是通過終端sh命令啟動安裝的,而實際上可以直接將這些以.run為字尾的檔案的屬性設定為“允許檔案執行”就可以直接通過滑鼠右鍵單擊的“開啟”選單命令安裝,如下圖所示:
在彈出的對話方塊中選擇最右邊的“命令列”按鈕即會彈出命令列視窗並給出相應的安裝提示。其中主要是提示是否設定toolkit等的安裝路徑,使用預設的路徑即可,因而只需要一路回車就可以完成這三個軟體包的安裝。
預設CUDA Toolkit和CUDA Tools是安裝在/usr/local/cuda路徑下,
安裝在$(HOME)/NVIDIA_GPU_Computing_SDK路徑下。可以自己定義個簡單的路徑來安放SDK,預設的名字實在太長了。
安裝順序建議為cudatoolkit、cudatools、gpucomputingsdk,因為sdk安裝時要引用toolkit的安裝路徑。
三個都安裝完畢之後可以通過如下命令檢視nvcc編譯器的版本:
nvcc –V
後面注意那個“V”是大寫的,如果能夠如下圖所示正常看到其版本則表明toolkit安裝正確了。
安裝完之後為了能夠編譯示例程式和自己寫的CUDA應用程式,還需要設定環境變數,輸入命令:
sudo gedit ~/.bashrc
然後如果是32位的Linux系統在開啟檔案的末尾新增:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH
如果是64位的Linux系統則在開啟檔案的末尾新增:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/64:$LD_LIBRARY_PATH
儲存檔案並關閉,最後更新一下:
~/.bashrc
5.執行SDK例子測試開發環境
在終端中切換到SDK的安裝路徑:
cd /(HOME)/NVIDIA_GPU_Computing_SDK/C
其中HOME為自己的使用者名稱,如root使用者下:
cd /root/NVIDIA_GPU_Computing_SDK/C
然後直接編譯:
make
但是在自己的電腦上編譯時出錯,提示“error:kernel lauches from templates are not allowed in system files”,如下圖所示
貌似是煙霧粒子示例沒有編譯通過,原因還沒有找出來,nvidia論壇中也有人遇到這樣的情況也尚未解決。
中給出了問題的解釋,原文如下:
nvccerrors
kernellaunches from templates are not allowed in system files
occurswhenever a kernel is launched from a template class or function that isdeclared in a header residing in a standard include path of the compiler
Note: thisapplies also to include path expansion e.g. through the CPLUS_INCLUDE_PATHenvironment variable
Solution:the include path for thecorresponding headers must be specified by a -I flag to the compiler
意思是說:這個錯誤在核心從一個在編譯器標準的引用路徑的標頭檔案中宣告的模板類或者函式中啟動時發生。
注意:這種錯誤同樣在CPLUS_INCLUDE_PATH環境變數中包含了相關的引用路徑時發生。解決辦法是為對應的包含路徑的標頭檔案在編譯選項中指定一個-l標誌。
既然無法全部編譯通過也就只好切換到原始碼路徑
cd /root/NVIDIA_GPU_Computing_SDK/C/src然後再進入自己感興趣的示例專案資料夾下去make,應該大多數例子就沒有什麼問題了。這裡主要對deviceQuery、bandwidthTest、bicubicTexture、bilateralFilter四個示例進行編譯和測試。
分別進入目錄編譯,如下圖所示
編譯完之後進入生成資料夾,執行各個示例,如執行deviceQuery則輸入命令:
./ deviceQuery
回車即可執行並打印出檢測到的GPU裝置和其對應的CUDA的一些資訊:
執行資料傳輸頻寬bandwidthTest測試例子
執行雙邊濾波bilateralFilter測試例子
執行雙立方紋理bicubicTexture測試例子
由上可見其執行效果和在Windows中是一致的。
不過有時編譯時能夠通過,可是執行時卻提示這樣的錯誤:“X error of failed reques:BadWindows (invalid Windows parameter)”
按其意思是說程式中opengl的視窗引數設定錯誤,實際上不是。這個問題通常是由於系統更新,如運行了sudo apt-get upgrade命令等更新了系統中的X服務改寫了之前安裝的nvidia顯示卡的一些檔案造成的,重新按前面的步驟安裝一次nvidia的顯示卡驅動即可解決。可以參考http://www.linuxdiyf.com/bbs/viewthread.php?tid=194013
6.Linux下CUDA程式設計的一些資源
CSDN
Nvidia
參考文獻:
ubuntu10.10下顯示卡驅動的安裝及3D特效的開啟
ubuntu下實踐編譯安裝Nvidia顯示卡驅動
在Ubuntu10.10下搭建CUDA 4.0平臺
ubuntu 10.10下安裝與配置CUDA 4.0 .