1. 程式人生 > >Ubuntu 16.04 安裝 NVIDIA CUDA Toolkit 7.5

Ubuntu 16.04 安裝 NVIDIA CUDA Toolkit 7.5

NVIDIA CUDA Toolkit 7.5 目前官方只適配了 Ubuntu 15.04 和 Ubuntu 14.04 兩個版本的系統。如果你是這兩個系統,可以直接去官方下載安裝檔案安裝。

由於其沒有適配 Ubuntu 16.04 ,這裡我們通過下載官方為 CUDA 7.5 為 Uubuntu 15.04 適配的 runfile(local) 安裝。

顯示卡型號
NVIDIA Corporation GM204 [GeForce GTX 970]
安裝過程
1. 驅動安裝檔案下載

    從 Nvidia 官網下載 CUDA 7.5 為為 Uubuntu 15.04 適配的 runfile(local)

    cuda_7.5.18_linux.run

2. 準備工作

開啟一個終端(Ctrl+Alt+T),或者直接切換到終端介面(Ctrl+Alt+F1),進行如下操作

    安裝可能需要的依賴

    $sudo apt-get update

    $sudo apt-get install ca-certificates-java default-jre default-jre-headless fonts-dejavu-extra freeglut3 freeglut3-dev java-common libatk-wrapper-java libatk-wrapper-java-jni  libdrm-dev libgl1-mesa-dev libglu1-mesa-dev libgnomevfs2-0 libgnomevfs2-common libice-dev libpthread-stubs0-dev libsctp1 libsm-dev libx11-dev libx11-doc libx11-xcb-dev libxau-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb1-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxmu-dev libxmu-headers libxshmfence-dev libxt-dev libxxf86vm-dev lksctp-tools mesa-common-dev x11proto-core-dev x11proto-damage-dev x11proto-dri2-dev x11proto-fixes-dev x11proto-gl-dev x11proto-input-dev x11proto-kb-dev x11proto-xext-dev x11proto-xf86vidmode-dev xorg-sgml-doctools xtrans-dev libgles2-mesa-dev nvidia-modprobe build-essential

3. 安裝 CUDA

由於我已經安裝過 NVIDIA 最新版顯示卡驅動(安裝 Nvidia 顯示卡驅動),因此安裝 CUDA 過程中不再安裝顯示卡驅動。(之前在16.04中安裝nvidia的驅動,重啟完總是會發生無邊框的情況,每次都解決不了,這次重新找到一個方法,連結一會兒發上來)

$ chmod 755 cuda_7.5.18_linux.run

$ sudo ./cuda_7.5.18_linux.run --override
-------------------------------------------------------------
Do you accept the previously read EULA? (accept/decline/quit): accept
You are attempting to install on an unsupported configuration. Do you wish to continue? ((y)es/(n)o) [ default is no ]: y
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 352.39? ((y)es/(n)o/(q)uit): n
Install the CUDA 7.5 Toolkit? ((y)es/(n)o/(q)uit): y
Enter Toolkit Location [ default is /usr/local/cuda-7.5 ]:
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y
Install the CUDA 7.5 Samples? ((y)es/(n)o/(q)uit): y
Enter CUDA Samples Location [ default is /home/kinghorn ]: /usr/local/cuda-7.5
Installing the CUDA Toolkit in /usr/local/cuda-7.5 ...
Finished copying samples.

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-7.5
Samples:  Installed in /usr/local/cuda-7.5

4. 配置 CUDA 環境變數

$sudo vim /etc/profile.d/cuda.sh

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$PATH:/usr/local/cuda/lib64

$ source /etc/profile.d/cuda.sh

5. 修改 CUDA header 檔案使其相容 gcc 5

該版本的 CUDA 無法在 gcc > 4.8 時使用,因此我們需要註釋掉程式碼中的 gcc 版本檢測程式碼

sudo vim /usr/local/cuda/include/host_config.h

line: 115 comment out error
//#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!  

6. 編譯 CUDA Samples

    將 Samples 程式碼拷貝到一個普通使用者可讀寫的目錄(這裡我們拷到根目錄 ~/ )

    $ rsync -av /usr/local/cuda/samples ~/

    如果你在安裝 CUDA 的時候安裝了 Driver (此版本的驅動應該是Nvidia 352),這裡可以考慮直接編譯並忽略下面兩步(未驗證過此種方法)

    $ cd ~/samples/

    $ make

    如果你在安裝 CUDA 的時候沒有 Driver ,而是安裝了最新版的 Nvidia 361 顯示卡驅動,你需要修改 samples 程式碼中引用到的庫的路徑,然後再編譯

    $ cd ~/samples/

    $ grep -r nvidia-352 -l --null . | xargs -0 sed -i 's#nvidia-352#nvidia-361#g'

    $ make

    編譯的過程中你可能會遇到找不到 nvidia-361 庫的提示,該問題可以通過在 apt 中安裝 第三方 nvidia-361 解決。但是經實驗,安裝完成後雖然可以編譯 samples ,但是執行 samples 時提示沒有顯示卡驅動,於是再重灌官方顯示卡驅動,問題解決。,切換到終端介面(Ctrl+Alt+F1),進行如下操作

    $ sudo service lightdm stop

    $ sudo apt-get install nvidia-361

    $ sudo reboot

    切換到終端介面(Ctrl+Alt+F1):

    $ sudo service lightdm stop

    $ sudo ./NVIDIA-Linux-x86_64-361.45.11.run

NVIDIA-Linux-x86_64-361.45.11.run 檔案的下載方法見Ubuntu 16.04 安裝英偉達(Nvidia)顯示卡驅動
7. gcc 5 的編譯問題

由於 gcc 5 用到的 /usr/include/string.h 相比 gcc 4 中的 string.h 有所改動。在編譯samples的過程中你可能會遇到類似這種錯誤

/usr/include/string.h: In function ‘void* __mempcpy_inline(void*, const void*, size_t)’: /usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope return (char *) memcpy (__dest, __src, __n) + __n; ^ /usr/include/string.h: In function ‘void* __mempcpy_inline(void*, const void*, size_t)’: /usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope return (char *) memcpy (__dest, __src, __n) + __n;

解決此問題的方法是在對應的 sample 目錄下的 Makefile 中增加編譯選項 -D_FORCE_INLINES 既可解決

例如將 Makefile 中的

NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

替換為

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS).

8. 執行 samples

$ cd ~/samples/bin/x86_64/linux/release

$ ./nbody -benchmark -numbodies=256000

Windowed mode
Simulation data stored in video memory
Single precision floating point simulation
1 Devices used for simulation
GPU Device 0: "GeForce GTX 970" with compute capability 5.2

Compute 5.2 CUDA device: [GeForce GTX 970]
number of bodies = 256000
256000 bodies, total time for 10 iterations: 7207.025 ms
= 90.934 billion interactions per second
= 1818.670 single-precision GFLOP/s at 20 flops per interaction

參考

[1]https://www.pugetsystems.com/labs/articles/NVIDIA-CUDA-with-Ubuntu-16-04-beta-on-a-laptop-if-you-just-cannot-wait-775/

[2]https://github.com/BVLC/caffe/issues/4046