CUDA简介
CUDA是英伟达开发的一种并行计算平台和编程模型,使用它可以让编程人员非常方便地利用GPU强大的算力。支持CUDA的GPU有数百个内核,可以同时运行数千个计算线程,这些内核拥有共享的资源,包括寄存器文件和共享内存,片上共享内存允许在这些内核上运行的并行任务共享数据而无需通过系统内存总线发送数据。CUDA基于以下设计目的进行开发:
- 为标准编程语言(C/C++)提供一小组扩展支持并行算法的直接实现,使用CUDA C/C++,程序员可以专注于算法的并行化任务,而不是花时间在他们的实施上。
- 支持应用程序同时使用CPU和GPU进行异构计算,应用程序的串行部分在CPU上运行,并行部分则被加载到GPU上运行,CPU和GPU都是拥有独立内存空间的独立设备,允许在CPU和GPU上同时进行计算而不会争用内存资源。因此,CUDA可以增量应用于现有应用程序。
本文将介绍如何在Ubuntu 20.04中安装CUDA开发工具,搭建CUDA编程环境。
安装前的准备工作
每个CUDA版本对操作系统和其他依赖工具软件版本的要求可以从该版本的release notes中找到,下图是CUDA 11.0支持的Linux发行版本和相关工具的支持版本,在安装CUDA之前,我们需要做一些准备工作。
1. 验证是否有可用的GPU
要使用CUDA进行并行计算,首要前提是至少有一个英伟达GPU设备。想要知道自己的机器上是否安装有英伟达GPU,可以在命令行终端中执行以下命令:
lspci | grep -i nvidia
在我机器上得到的结果如下:
01:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1) 01:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1) 01:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1) 01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1) 06:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1) 06:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1) 06:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1) 06:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)
从上面的结果中可以知道,我的机器上装了2个型号为GeForce RTX 2080的GPU。
我们也可以在英伟达网站上查询自己的GPU型号是否是支持CUDA的:https://developer.nvidia.com/cuda-gpus。
2. 验证操作系统是否支持
CUDA开发工具仅在某些特定发行版本的Linux操作系统,如果想知道自己使用的是哪个Linux发行版本,可以在命令行终端中执行以下命令:
uname -m && cat /etc/*release
在Ubuntu 20.04系统中得到如下结果:
x86_64 DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS" NAME="Ubuntu" VERSION="20.04.3 LTS (Focal Fossa)"
3. 验证gcc版本
使用CUDA进行开发需要gcc编译器(运行CUDA应用程序不需要),gcc通常会作为Linux的一部分进行安装,可以运行如下命令查看gcc的版本:
gcc --version
在Ubuntu 20.04系统中得到如下结果,gcc版本为9.3.0:
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4. 验证操作系统是否有正确的内核头文件和开发包
CUDA驱动程序要求在安装驱动程序时安装用于运行内核版本的内核头文件和开发包,在安装CUDA之前最好先确认一下内核头文件和开发包,内核头文件的版本可以通过命令uname -r进行查看,如果要安装当前系统运行内核对应的内核头文件和开发包,可以执行下面的命令:
sudo apt-get install linux-headers-$(uname -r)
6. 下载CUDA安装包
CUDA安装包可以从英伟达网站http://developer.nvidia.com/cuda-downloads进行下载。下载的时候需要选择操作系统和计算架构等信息,可以选择deb文件或runfile文件进行安装,下载下来的安装文件中包含了GPU驱动和CUDA的库文件、头文件、例程、工具等。
用runfile进行安装
在上一节中介绍了CUDA可以通过deb或runfile文件进行安装,本文介绍使用runfile文件进行安装的方法。
1. 删除旧的GPU驱动
在安装之前,如果我们的系统已经安装了英伟达GPU驱动,建议先运行如下命令进行删除:
sudo apt-get --purge remove nvidia-*
2. 禁用Nouveau驱动
要安装英伟达GPU驱动,必须先禁用Nouveau驱动。首先通过下面的命令查看Nouveau驱动是否已经被加载,如果执行命令有输出内容,说明Nouveau驱动还没有被禁用。
lsmod | grep nouveau
要禁用Nouveau驱动,首先执行命令创建并编辑文件
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
然后在文件中添加如下内容
blacklist nouveau options nouveau modeset=0
再执行命令重新生成内核initramfs镜像文件
sudo update-initramfs -u
3. 安装CUDA
上一步禁用Nouveau驱动后,我们需要重启系统并进入命令行模式,然后执行下面的命令进行安装(这里假设下载的runfile文件为cuda_11.0.2_450.51.05_linux.run,也就是CUDA版本为11.0,GPU驱动版本为450.51.05):
sudo sh cuda_11.0.2_450.51.05_linux.run
在安装过程中我们需要根据提示进行一些设置:
- 终止用户许可协议(End User License Agreement),输入accept然后按回车进行下一步。
- 安装GPU驱动。
- 安装CUDA开发工具,需要设置安装路径和是否创建/usr/local/cuda软链接,可以直接按回车用默认的即可。
- 安装CUDA例程,默认会安装在$(HOME)/NVIDIA_CUDA-11.0_Samples路径下。
安装好以后,需要设置一些环境变量:
export PATH=/usr/local/cuda-11.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH export C_INCLUDE_PATH=/usr/local/cuda-11.0/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/usr/local/cuda-11.0/include:$CPLUS_INCLUDE_PATH
如果要卸载安装好的CUDA,可以执行如下命令:
sudo /usr/local/cuda-11.0/bin/cuda-uninstaller
使用CUDA例程
CUDA开发工具的版本可以通过nvcc -V命令进行查看,下面是我的执行结果:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2020 NVIDIA Corporation Built on Thu_Jun_11_22:26:38_PDT_2020 Cuda compilation tools, release 11.0, V11.0.194 Build cuda_11.0_bu.TC445_37.28540450_0
nvcc命令用于编译CUDA应用程序,它可以调用gcc编译C语言程序,调用英伟达PTX编译器编译CUDA程序。
上一节说了在CUDA安装过程中默认会在$(HOME)/NVIDIA_CUDA-11.0_Samples目录下安装CUDA例程,我们可以到该目录下执行命令make对例程进行编译,编译之前可以先执行下面的命令安装必要的依赖库:
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev libglfw3 libglfw3-dev
编译成功的可执行文件会被拷贝到该目录下的bin/x86_64/linux/release文件夹下面,我们可以运行一些例程用于验证CUDA环境是否已经构建好。
运行deviceQuery可以查询每个GPU的详细信息:
运行bandwidthTest可以测试数据传输带宽:
参考资料
- 《CUDA Installation Guide for Linux.pdf》