相关知识收集于网络,主要来自

  1. 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
  2. GPU 和显卡是什么关系?
  3. 显卡、显卡驱动、cuda 之间的关系是什么?

并增加了一些自己的理解,如有错误,欢迎指正

如有侵权请联系删除

它们之间的关系如下图,可以直接跳到总结查看结论
在这里插入图片描述


显卡

显卡(Video card、Display card、Graphics card、Video adapter)全称显示接口卡,是计算机最基本配置、最重要的配件之一。就像电脑联网需要网卡,主机里的数据要显示在屏幕上就需要显卡。因此,显卡是电脑进行数模信号转换的设备,承担输出显示图形的任务。具体来说,显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来。

原始的显卡一般都是集成在主板上,只完成最基本的信号输出工作,并不用来处理数据。随着显卡的迅速发展,就出现了GPU的概念,显卡也分为独立显卡和集成显卡。

GPU

GPU这个概念是由Nvidia公司于1999年提出的。GPU是显卡上的一块芯片,就像CPU是主板上的一块芯片(如下图所示)。

自Nvidia提出GPU这个概念后,GPU就进入了快速发展时期。简单来说,其经过了以下几个阶段的发展:

  1. 仅用于图形渲染,此功能是GPU的初衷,这一点从它的名字就可以看出:Graphic Processing Unit,图形处理单元
  2. 后来人们发现,GPU这么一个强大的器件只用于图形处理太浪费了,它应该用来做更多的工作,例如浮点运算。怎么做呢?直接把浮点运算交给GPU是做不到的,因为它只能用于图形处理。最容易想到的,是把浮点运算做一些处理,包装成图形渲染任务,然后交给GPU来做。这就是GPGPU(General Purpose GPU)的概念。不过这样做有一个缺点,就是你必须有一定的图形学知识,否则你不知道如何包装。
  3. 于是,为了让不懂图形学知识的人也能体验到GPU运算的强大,Nvidia公司又提出了CUDA的概念

在这里插入图片描述

CPU和GPU的关系

在没有GPU之前,基本上所有的任务都是交给CPU来做的。有GPU之后,二者就进行了分工, CPU负责逻辑性强的事物处理和串行计算,GPU则专注于执行高度线程化的并行处理任务(大规模计算任务)。为什么这么分工?这是由二者的硬件构成决定的。

可以看出, CPU是“主(host)”而GPU是“从(device)”,GPU无论发展得多快,都只能是替CPU分担工作,而不是取代CPU。

CUDA

CUDA(Compute Unified Device Architecture),通用并行计算架构。它包含CUDA指令集架构以及GPU内部的并行计算引擎。你只要使用一种类似于C语言的 CUDA C语言,就可以开发CUDA程序,从而可以更加方便的利用GPU强大的计算能力,而不是像以前那样先将计算任务包装成图形渲染任务,再交由GPU处理。注意,并不是所有GPU都支持CUDA。

CUDA只是一种并行计算架构,属于软件层面。相关的概念还有OpenCL、OpenMP等。

CUDA Toolkit

CUDA Toolkit是CUDA的工具包

一般我们安装CUDA,其实就是安装CUDA Toolkit

从CUDA 11开始,CUDA Toolkit 中的各个组件都是独立的版本。

对于CUDA 11.4,下表列出了各个组件版本:
在这里插入图片描述
图片来自 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-new-cuda-tools

下面会介绍CUDA Toolkit中几个重要的组件

显卡驱动

上图中,NVIDIA Linux Driver 与 NVIDIA Windows Driver就是不同操作系统的对应的NVIDIA显卡驱动。显卡驱动可以单独安装,也可以和CUDA Toolkit中的组件一起安装

显卡驱动就是用来驱动显卡的程序,它是硬件所对应的软件。驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。没有显卡驱动,操作系统就不能识别显卡,不能调用gpu计算资源

运行CUDA应用程序需要系统至少有一个支持CUDA的GPU和一个与CUDA Toolkit 兼容的显卡驱动。

每个版本的CUDA Toolkit都对应一个最低版本显卡驱动。显卡驱动是向后兼容的。这意味着根据CUDA的特定版本编译的应用程序将继续在后续发布的驱动上也能继续工作

不同版本的CUDA对应的显卡驱动版本如下图:
在这里插入图片描述
图片来自 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-new-cuda-tools

nvidia-smi

nvidia-smi是nvidia 的系统管理界面 ,其中smi是System management interface的缩写,它可以收集各种级别的信息,查看显存使用情况。此外, 可以启用和禁用 GPU 配置选项 (如 ECC 内存功能)。

一般安装好了显卡驱动,就可以使用该命令

nvidia-smi
Mon Sep 13 12:07:26 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.31       Driver Version: 465.31       CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:05:00.0 Off |                  N/A |
| 23%   22C    P8     9W / 250W |     45MiB / 11177MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:06:00.0 Off |                  N/A |
| 23%   22C    P8     9W / 250W |   1021MiB / 11178MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA GeForce ...  Off  | 00000000:09:00.0 Off |                  N/A |
| 23%   18C    P8    10W / 250W |      4MiB / 11178MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

nvcc

CUDA NVCC 其实就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器

使用命令 nvcc -V 可以查看当前的cuda版本

Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

如果安装好了CUDA,却找不到该命令可能是环境变量没有设置,可以参考https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions 进行设置。

在这里插入图片描述

nvcc和nvidia-smi显示的CUDA版本不同

答案来自 Different CUDA versions shown by nvcc and NVIDIA-smi

  1. CUDA有两个主要的API,runtime APIdriver API。两者都有相应的版本
  2. 用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。nvidia-smi 就属于这一类API
  3. 用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的

如果driver API和runtime API的CUDA版本不一致可能是因为显卡驱动是单独安装的,而不是和CUDA Toolkit中的组件一起安装

由于显卡驱动是向后兼容的,因此一般显卡驱动的版本都要高于当前CUDA Toolkit 所对应的最低版本。 nvidia-smi获得的CUDA版本一般大于或者等于nvcc -V 获得的CUDA版本,实际运行时是使用的nvcc -V 报告的版本

此外,当使用docker时,nvidia-smi命令通常会报告安装在宿主机的driver API CUDA版本,而nvcc -V 会报告安装在docker容器中的CUDA版本。

总结

  1. 显卡是计算机最基本配置、最重要的配件之一,gpu是显卡上的用于计算的芯片,独立显卡除了gpu以外还包含自己显存。
  2. 原本的gpu只能用作图形处理,为了能让gpu处理浮点运算,出现了CUDA(通用并行计算架构),从而可以更加方便的利用GPU强大的计算能力。CUDA Toolkit是CUDA的工具包,安装CUDA就是安装CUDA Toolkit。不同版本的CUDA Toolkit对应一个最低版本的显卡驱动。
  3. 显卡驱动是用来驱动显卡的程序,它是硬件所对应的软件。显卡驱动可以单独安装,也可以和CUDA Toolkit一起安装。nvidia-smi报告的CUDA版本和显卡驱动的版本有关,nvcc -V 报告的CUDA版本才是运行时的CUDA版本
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐