我报名参加金石计划1期应战——分割10万奖池,这是我的第6篇文章,点击检查活动概况

CUDA简介

CUDA是英伟达开发的一种并行计算渠道和编程模型,运用它能够让编程人员十分方便地运用GPU强壮的算力。支撑CUDAGPU有数百个内核,能够一起运转数千个计算线程,这些内核具有同享的资源,包含寄存器文件和同享内存,片上同享内存允许在这些内核上运转的并行任务同享数据而无需经过体系内存总线发送数据。CUDA基于以下规划目的进行开发:

  • 为规范编程语言(C/C++)供给一小组扩展支撑并行算法的直接完成,运用CUDA C/C++,程序员能够专注于算法的并行化任务,而不是花时间在他们的施行上。
  • 支撑应用程序一起运用CPUGPU进行异构计算,应用程序的串行部分在CPU上运转,并行部分则被加载到GPU上运转,CPUGPU都是具有独立内存空间的独立设备,允许在CPUGPU上一起进行计算而不会争用内存资源。因而,CUDA能够增量应用于现有应用程序。

本文将介绍如何在Ubuntu 20.04中装置CUDA开发东西,建立CUDA编程环境

装置前的准备工作

每个CUDA版别对操作体系和其他依靠东西软件版别的要求能够从该版别的release notes中找到,下图是CUDA 11.0支撑的Linux发行版别和相关东西的支撑版别,在装置CUDA之前,咱们需求做一些准备工作。

CUDA编程-01: 搭建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 2080GPU

咱们也能够在英伟达网站上查询自己的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编程-01: 搭建CUDA编程环境

用runfile进行装置

在上一节中介绍了CUDA能够经过debrunfile文件进行装置,本文介绍运用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.0GPU驱动版别为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的详细信息:

CUDA编程-01: 搭建CUDA编程环境

运转bandwidthTest能够测验数据传输带宽:

CUDA编程-01: 搭建CUDA编程环境

参考资料

  • CUDA Installation Guide for Linux.pdf