Ubuntu 16.04下CUDA8环境配置的2种方法

系统为ubuntu 16.04.1 x64,具体参数如下:

1
2
3
4
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

系统为Ubuntu 64位服务器版的最小化系统
安装Nvidia官网最新版本的CUDA 8(2016.12.19)
下面分别使用Nvidia官方手册中使用deb源的方式安装,和根据Nvidia提供的二进制包配合双显卡技术的方式安装。前者更新更方便,后者针对双显卡最方便。服务器系统推荐使用第一种方式安装,笔记本建议使用第二种方式,因为可以实现双显卡,集显更省电。
如果只是为了玩游戏需要配置Ubuntu下的Nvidia和intel双显卡,也可以直接跳到双显卡切换的配置部分

根据nvidia官方手册安装

该安装方法由于是在服务器系统下测试,并没有桌面环境,所以不保证安装配置完成之后依然能进入桌面环境。

安装准备

验证NVIDIA显卡

1
$ lspci | grep -i nvidia

看看是否有nvidia的显卡

查看linux系统信息

1
$ uname -m && cat /etc/*release

确保你的系统在nvidia官方的cuda支持列表中

安装gcc及g++

就是安装C++开发环境,因为CUDA是基于C/C++开发的,当然现在也支持很多其他语言

1
$ sudo apt-get install gcc g++

安装linux kernel header及开发包

1
$ sudo apt-get install linux-headers-$(uname -r)

为了避免出现头文件相关的问题,推荐安装上build-essential:

1
$ sudo apt-get install build-essential

下载并安装CUDA

下载CUDA:

1
$ wget --no-check-certificate https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb

通过以下命令安装cuda源:

1
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb

如果是下载的local版本,实际上会在本地增加一个local源,指定为cuda的解压路径,如果是网络源,实际上会添加以下源:

1
deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 /

更新包缓存:

1
$ sudo apt-get update

安装CUDA:

1
$ sudo apt-get install cuda

设置环境变量

在自己的.bashrc的最后添加以下代码

1
2
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

使用环境变量设置立即生效:

1
$ source ~/.bashrc

安装官方示例并验证环境

在些之前最后重启一下系统,以使驱动生效。
查看驱动等信息是否正常:

1
$ cat /proc/driver/nvidia/version

我这里的输出如下:

1
2
NVRM version: NVIDIA UNIX x86_64 Kernel Module  367.57  Mon Oct  3 20:37:01 PDT 2016
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

如果上面的环境变量已经配置完成,则可以使用以下命令安装官方示例到用户根目录:

1
$ cuda-install-samples-8.0.sh  ~

进入刚安装的CUDA官方示例文件夹NVIDIA_CUDA-8.0_Samples运行make进行示例的编译。
如果没有问题的话,稍后会编译成功,编译完成之后会在目录NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release中生成deviceQuery
运行查询输出

1
$ ./deviceQuery

我这里的输出结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
./deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 1080"
CUDA Driver Version / Runtime Version 8.0 / 8.0
CUDA Capability Major/Minor version number: 6.1
Total amount of global memory: 8112 MBytes (8506179584 bytes)
(20) Multiprocessors, (128) CUDA Cores/MP: 2560 CUDA Cores
GPU Max Clock rate: 1734 MHz (1.73 GHz)
Memory Clock rate: 5005 Mhz
Memory Bus Width: 256-bit
L2 Cache Size: 2097152 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device PCI Domain ID / Bus ID / location ID: 0 / 3 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 1080
Result = PASS

只要最后输出中显示结果为PASS即表示安装完成

手动配置CUDA环境

安装显卡驱动并配置双显卡

对于桌面系统肯定希望安装nvidia显卡之后不会影响之前系统的正常使用,例如笔记本自带的intel显卡,和nvidia的显卡,此时可以通过bumblebee进行管理来切换双显卡。
可以通过ppa进行bumblebee安装。为了能够安装最新的nvidia显卡驱动,这里同样可以使用ppa来进行安装最新的显卡驱动。
首先删除系统中已经有的相关软件包:

1
sudo apt-get purge nvidia* bumblebee* nouveau*

安装Nvidia显卡驱动

安装显卡ppa并更新缓存:

1
2
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

可以添加后只更新一次缓存。

然后自己去nvidia官方查询你自己的显卡对应的linux下最新版本驱动的版本号,然后按如下替换安装nvidia显卡驱动所需要的包(可以通过Tab键补全的方式来安装最新版本的驱动):

1
sudo apt install nvidia-375 nvidia-prime

或者通过以下命令查看系统中所有可以安装的驱动:

1
sudo ubuntu-drivers list

然后运行以下命令生成nvidia的配置文件(有些系统可能并不需要):

1
sudo nvidia-xconfig

重启系统,如果安装成功,此时使用的应该就是nvidia的显卡。可以运行glxgears来查看fps,如果提示没有该命令,就需要多安装一个包:sudo apt-get install mesa-utils
也可以通过命令:glxinfo | head查看当前启用的是不是nvidia显卡
或者直接打开设置中的关于也可以查看当前使用的显卡
运行以下命令打开nvidia显卡配置程序:

1
sudo nvidia-settings

如果不考虑双显卡切换的问题,到这里就可以直接跳到CUDA安装部分了
如果执行上述命令有如下提示:

1
2
** Message: PRIME: No offloading required. Abort
** Message: PRIME: is it supported? no

说明你的显卡不支持Nvidia的prime技术,或者说你显卡当前的驱动还不支持该技术,这样的话后面的双显卡切换就可以直接跳过了。

配置双显卡驱动切换

安装bumblebee的ppa并更新缓存:

1
2
sudo add-apt-repository ppa:bumblebee/stable
sudo apt-get update

执行以下命令安装bumblebee以及相关包:

1
sudo apt-get install primus nvidia-profiler nvidia-visual-profiler nvidia-prime nvidia-prime-applet bumblebee-nvidia

重启系统之后应该就可以看到状态栏里面有个显卡切换的图标了

如果上述命令在更新包缓存时出现404,并且安装nvidia-prime-applet时提示无法找到该包,则可以在/etc/apt/source.list.d/中删除刚添加的这个源,换成以下源并安装他的prime-indicator:

1
2
3
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install prime-indicator-plus

如果nvidia-settings运行之后提示支持prime,也可以直接在这个里面的PRIME Profiles进行显卡的切换,而不需要再安装那个indicator

安装cuda

安装cuda之前需要进行c++环境的安装,参见前面的内容
从官方下载cuda的二进制runfile文件,之所以使用这个文件安装也是为了避免安装的驱动破坏了之前已经配置好的驱动

1
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run

然后执行以下命令进行安装:

1
sudo sh cuda_8.0.44_linux.run

注意安装过程中不要安装显卡驱动,其他根据需要按提示操作即可。
安装完成之后记得配置环境变量,跟上面一样,增加如下内容到.bashrc的最后:

1
2
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

然后:

1
source ~/.bashrc

不过runfile的官方安装结束之后会提示增加libs到ld.so.conf中。可以添加如下文件:
/etc/ld.so.conf.d/cuda.conf,内容为/usr/local/cuda-8.0/lib64,然后运行:

1
sudo ldconfig

至此CUDA的显卡都已经安装完成,通过显卡切换程序将显卡切换为Nvidia显卡之后,即可像上面的验证过程一样,验证CUDA是否正常运行

常见问题

解决方法是手动创建一个符号链接,或者使用root权限执行以下命令来进行:
然后再次手动运行sudo ldconfig,发现已经没有那个错误提示了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#! /bin/sh
#
# find the file in /usr/lib
LIBEGL=`find /usr/lib/nvidia* -name libEGL.so.\* | egrep "[0-9][0-9]*\.[0-9][0-9]*$"`
LIBEGL_LINK=`echo $LIBEGL | sed 's/[0-9][0-9]*\.[0-9][0-9]*$/1/'`
printf "\n\nThe following commands will be executed:\n+++++++++++++++++++++++++++++++++++++++\n"
printf "mv $LIBEGL_LINK ${LIBEGL_LINK}.orig\nln -s $LIBEGL $LIBEGL_LINK\n\n"
while true; do
read -p "Do you wish to perform these commands? " yn
case $yn in
[Yy]* ) mv $LIBEGL_LINK ${LIBEGL_LINK}.orig; ln -s $LIBEGL $LIBEGL_LINK ; break;;
[Nn]* ) break;;
* ) echo "Please answer yes or no.";;
esac
done

# find the file in /usr/lib32
LIBEGL=`find /usr/lib32/nvidia* -name libEGL.so.\* | egrep "[0-9][0-9]*\.[0-9][0-9]*$"`
LIBEGL_LINK=`echo $LIBEGL | sed 's/[0-9][0-9]*\.[0-9][0-9]*$/1/'`
printf "\n\nThe following commands will be executed:\n+++++++++++++++++++++++++++++++++++++++\n"
printf "mv $LIBEGL_LINK ${LIBEGL_LINK}.orig\nln -s $LIBEGL $LIBEGL_LINK\n\n"
while true; do
read -p "Do you wish to perform these commands? " yn
case $yn in
[Yy]* ) mv $LIBEGL_LINK ${LIBEGL_LINK}.orig; ln -s $LIBEGL $LIBEGL_LINK ; break;;
[Nn]* ) break;;
* ) echo "Please answer yes or no.";;
esac
done