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
的库文件、头文件、例程、工具等。
在上一节中介绍了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
开发工具的版本可以通过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
》