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之前,我们需要做一些准备工作。

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的库文件、头文件、例程、工具等。

用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的详细信息:

运行bandwidthTest可以测试数据传输带宽:

参考资料

  • CUDA Installation Guide for Linux.pdf

CUDA编程-01: 搭建CUDA编程环境相关推荐

  1. 来自GPU的Hello World-基于Win10+VS2019+CUDA 11.0搭建CUDA编程环境

    序   CPU和GPU 当代计算机的两个核心,GPU计算与CPU计算的结合,使得原本的计算性能得到大幅度的提高,两者功能的互补性使得CPU+GPU的异构并行计算得到快速发展.为了支持使用CPU+GPU ...

  2. java alsa 编程_搭建JavaWeb开发环境

    更好的阅读体验欢迎访问博客搭建JavaWeb开发环境 前言 在服务器上搭建javaweb开发环境,特此记录 一.安装JDK 查看默认JDK java -version rpm -qa|grep jav ...

  3. 侯捷老师-01面向对象高级编程

    侯捷老师-01面向对象高级编程 01面向对象高级编程 1.编程习惯 总结 2.三大函数 2.1 拷贝构造函数.拷贝赋值函数.析构函数(带有指针的类) 2.2 构造函数.析构函数 局部变量.全局变量 3 ...

  4. GPU编程自学2 —— CUDA环境配置

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  5. linux运行并行计算cuda,并行化计算与CUDA编程

    原标题:并行化计算与CUDA编程 近年来,显卡的更新换代也比较快,NVIDIA今年的发布会也宣布了RTX3080TI即将到来.显卡的运算能力也越来越强. 很多人对显卡的了解可能源于游戏,但是你的显卡不 ...

  6. CUDA刷新器:CUDA编程模型

    CUDA刷新器:CUDA编程模型 CUDA Refresher: The CUDA Programming Model CUDA,CUDA刷新器,并行编程 这是CUDA更新系列的第四篇文章,它的目标是 ...

  7. 一种基于CUDA标准的异构并行编程模型开发简介

    一种基于CUDA标准的异构并行编程模型开发简介 目录 一.绪论 1.1研究背景及意义 1.2目标平台体系结构简介 二.HPPA基本组成结构 三.编译工具链开发 3.1 拆分工具HPCufe开发 3.2 ...

  8. CUDA 8的混合精度编程

    CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...

  9. Ubuntu18.04+RTX 2080Ti+CUDA 10.0 +cuDNN+PyTorch搭建深度学习环境

    SSH无密码登陆 安装SSH Server Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: sudo apt-get install openssh-serv ...

最新文章

  1. NLP(1) | 词向量one hot编码词向量编码思想
  2. php 面对对象总结,PHP 面向对象总结
  3. 决策树--从原理到实现
  4. R学习笔记:文档间函数调用
  5. 类C编译器 C代码实现
  6. 日志管理(一):slf4j原理简单介绍
  7. C语言课设 成绩管理程序
  8. 开发人员对Spring vs JavaEE的看法
  9. MS_DOS头部 IMAGE_DOS_HEADER
  10. 自学大数据前,零基础,三个月,找到一份测试工作
  11. 解决eclipse为什么不能查看源码
  12. 新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)
  13. 10.31,11.1外出纪要
  14. python 协程进阶
  15. Clickhouse 实现row_number、dense_rank
  16. 圣帕特里克 VoxEdit 大赛
  17. 论文阅读——R树:一种用于空间查找的动态索引结构(算是节译)
  18. 电脑耳机电流声的消除2021-09-11
  19. 计算机硬盘分区安全,如何安全、简便的对固态硬盘分区?
  20. 如何向码云(Gitee)上传项目

热门文章

  1. 计算机毕设(附源码)JAVA-SSM慧学IT精品课程网站
  2. 习题10-7 十进制转换二进制
  3. 写在2013的尾巴 即 写在蛇年的尾巴
  4. mysql 切分_MySQL 切分(Sharding)、水平切分、垂直切分以及读写分离的区别
  5. tomcat项目部署到本地局域网访问
  6. SecureCRT语言设置
  7. 电源符号:VCC、VDD、VEE、VSS、VBAT各表示什么意思?
  8. 天龙3d服务器维护,《新天龙八部》2017年3月6日全服更新维护公告
  9. axure9安装加汉化加秘钥
  10. 【python】使用requests多线程爬取论坛文章并存储在sqlite中