【CUDA C學習】Day01:CUDA安裝
基本情況
- 安裝包:
CUDA_10.0_.run - 測試系統:
Ubuntu16.04 - 已測試顯示卡:
Nvidia GeForce GTX 1080TI
Nvidia GeForce GTX 970
Nvidia GeForce GTX 960
Nvidia GeForce GTX 960m
安裝
第1步:驗證電腦是否支援CUDA
- 驗證電腦是否有一個可以支援CUDA的GPU
在ubuntu的終端中輸入命令:
$ lspci | grep -i nvidia 顯示出你的NVIDIA GPU版本資訊,筆者結果為 01:00.0 VGA compatible controller: NVIDIA Corporation GM204 [GeForce GTX 970] (rev a1) 01:00.1 Audio device: NVIDIA Corporation GM204 High Definition Audio Controller (rev a1)
CUDA的官網檢視自己的GPU版本是否在CUDA的支援列表中
https://developer.nvidia.com/cuda-gpus
- 驗證Linux版本是否支援 CUDA(Ubuntu 16.04)
輸入命令:
$ uname -m && cat /etc/*release
輸出結果為:
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
...
第2步:下載安裝包
如果以上的檢查全部通過,恭喜你,可以進行以下操作。
- 在官網下載自己需要安裝的cuda版本 *.run 軟體
https://developer.nvidia.com/cuda-toolkit-archive
注意:
為了避免無圖形安裝時的無法找到安裝包,建議將安裝包命名為cuda.r,並放置在個人目錄,筆者的為 /home/hirah
- 驗證安裝包完整性
http://developer.nvidia.com/cuda-downloads/checksums
$ md5sum <file>
如果輸出結果和官方網址提供一致即可。
第3步:準備安裝
1 ). 驗證安裝基礎環境
- 更新系統:
sudo apt-get update
sudo apt-get dist-upgrade
- 驗證系統是否安裝gcc
輸入命令:
$ gcc --version 輸出結果為: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. ...
若未安裝輸入命令:
sudo apt-get install build-essential
2 ). 取消 nouveau(會和NVIDIA kernel module衝突)
a ). 輸入命令:
$ lsmod | grep nouveau
如果有輸出則代表nouveau正在載入,需要配置禁掉nouveau。
nouveau禁用方法:
a )、在/etc/modprobe.d中建立檔案blacklist-nouveau.conf
輸入命令:
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
在檔案中輸入一下內容:
blacklist nouveau
options nouveau modeset=0
b )、執行:
$ sudo update-initramfs -u
c )、再執行:
$ lsmod | grep nouveau
注意:
- 若無內容輸出,則禁用成功;
- 若仍有內容輸出,請檢查a、b、c操作,並重覆上述操作。
e ) 、重啟:
$ sudo reboot
3 ). 獲取Kernel Source
- 驗證系統是否安裝kernel source 和 package development
a )、安裝kernel source
$ sudo apt-get install linux-source
b )、檢視正在執行的系統核心版本:
輸入命令:
$ uname -r
輸出結果為:
4.15.0-38-generic
c )、在終端中輸入:
$ sudo apt-get install linux-headers-$(uname -r)
結果顯示:
......
升級了 0 個軟體包,新安裝了 0 個軟體包,要解除安裝 0 個軟體包,有 0 個軟體包未被升級。
表示系統裡已經有了,不用重複安裝。
若以上各項驗證檢查均滿足要求,便可進行下面的正式安裝過程。
第4步:正式安裝
1 ). 處理之前安裝版本(會產生衝突,導致安裝失敗)
注意:
- 如果之前未安裝過任何版本nvidia驅動,請跳過;
- 如果你之前安裝過其他版本,請執行下面操作;
*** 型別一: .run檔案安裝執行 ***
解除安裝 Toolkit 執行檔案:
$ sudo /usr/local/cuda-X.Y/bin/uninstall_cuda_X.Y.pl
解除安裝NVIDIA驅動:
$ sudo /usr/bin/nvidia-uninstall
*** 型別二:RPM、Deb檔案安裝執行 ***
$ sudo apt-get --purge remove <package_name>
2). 重啟電腦,安裝新版本
$ sudo reboot
a ). 進入登入介面,不要登入進入桌面(否則可能會失敗),直接按Ctrl+Alt+F1進入命令列介面,筆者顯示
Ubuntu16.04.5 LTS pc tty1
pc login:
輸入使用者名稱,回車;
passwd
輸入密碼,回車;
b ). 關閉圖形介面
輸入命令:
$ sudo service lightdm stop
c ). 安裝
- 切換到cuda安裝檔案的路徑:
輸入命令:
$ cd
$ sudo chmod +777 ./<cuda_fliename>
$ sudo ./<cuda_filename>
- 安裝按提示進行
* 1) Do you accept the previously read EULA?
accept/decline/quit: accept
* 2) Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: yes
* 3) Do you want to install OpenGL libraries?
(y)es/(n)o/(q)uit: no
注意:如果電腦是雙顯,且主顯是非NVIDIA的GPU在工作需要選擇no,否則可以yes
* 4) Do you want to run nvidia-xconfig?
(y)es/(n)o/(q)uit: n
注意:如果電腦是雙顯,且主顯是非NVIDIA的GPU在工作需要選擇no,否則可以yes
* 5) Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: y
* 6) Enter Toolkit Location
[default is /usr/local/cuda-10.0 ]:
* 7) Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y
* 8) Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: y
* 9) Enter CUDA Samples Location
[default is /home/hirah ]:
- 安裝成功後,會顯示
==========
= summary =
==========
Driver: Installed
Toolkit: Install in /usr/local/cuda-10.0
samples: Install in /home/hirah,(but missing recommended libraries)
表示安裝成功,否則會顯示failed。
- 重新啟動圖形化介面,輸入命令:
$ sudo service lightdm start
返回到圖形化登入介面。
如果能夠成功登入,則表示不會遇到迴圈登入的問題,基本說明CUDA的安裝成功了。
** 注意:**
如果你遇到了重複登陸情況,首先回憶是否在安裝openGL時可能不注意選擇了yes,請解除安裝cuda,然後重灌。
解除安裝方法:
- 在登陸介面狀態下,按Ctrl + Alt + f1,進入文字使用者介面
- 登入輸入命令:
$ sudo /usr/local/cuda-10.0/bin/uninstall_cuda_10.0.pl
$ sudo /usr/bin/nvidia-uninstall
$ reboot
- 重新安裝*.run,再次安裝時請一定留意,在提示是否安裝OpenGL時,如果是雙顯示卡應該選則no。
第5步:檢查安裝狀態
1) 檢查Device Node Verification。
輸入命令:
$ sudo reboot
$ ls /dev/nvidia*
可能出現a、b兩種結果,請對號入座。
- 若結果顯示
/dev/nvidia0 /dev/nvidiactl /dev/nvidia-modeset
或顯示出類似的資訊,應該有三個(包含一個類似/dev/nvidia-modeset的檔案),則安裝成功。
- 若結果顯示
ls: cannot access/dev/nvidia*: No such file or directory
或
/dev/nvidia0 /dev/nvidiactl
沒有/dev/nvidia-modeset,即檔案顯示不全。
官方安裝指導的解決方案:
a ). 新增一個啟動指令碼
輸入命令
$ sudo nano /etc/rc.local
如果你是第一次開啟這個檔案,它應該是空的(除了一行又一行的#註釋項外)。這檔案的第一行是
#!/bin/sh -e
把-e去掉(這步很重要,否則它不會載入這文字的內容)
b ). 然後把下列內容複製到其中,儲存退出。
#!/bin/bash
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
else
exit 1
fi
c ). 重啟
輸入:
$ ls /dev/nvidia*
應該能直接看到/dev目錄下的三個nvidia的檔案:/dev/nvidia0 /dev/nvidiactl /dev/nvidia-modeset
2) 設定環境變數
a ). 終端中輸入
$ sudo gedit /etc/profile
b ). 在開啟的檔案末尾,新增以下兩行。
64位系統:
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
儲存檔案,並重啟。
c ). 重啟電腦,檢查上述的環境變數是否設定成功。
- 驗證驅動版本
輸入命令:
$ cat /proc/driver/nvidia/version
結果顯示:
NVRM version: NVIDIA UNIX x86_64 Kernel Module 410.48 Thu Sep 6 06:36:33 CDT 2018
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
- 驗證CUDA Toolkit
敲入
$ nvcc -V
結果顯示:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
如果是這樣的:
The program 'nvcc' is currently not installed. You can install it by typing:
sudo apt-get install nvidia-cuda-toolkit
可能是環境配置沒有成功,請重複上述步驟2。
- 執行示例檔案
$ cd ~/NVIDIA_CUDA-10.0_Samples
$ make -j8
$ cd bin/x86_64/linux/release/
$ ./deviceQuery
顯示結果為:
...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.0, CUDA Runtime Version = 10.0, NumDevs = 1
Result = PASS
$ ./bandwidthTest
顯示結果為:
...
Result = PASS