CUDA学习笔记——基本概念与CUDA下载
显卡
显卡(Graphics card),全称显示接口卡,又称显示适配器,是计算机的重要硬件组件之一,负责图形处理和显示输出。显卡通常由 GPU(图形处理器)、显存、供电模块等部分组成。类似的扩展设备还有网卡、声卡等。显卡的主要功能是将计算机内部处理的数字信号转换为显示器可识别的图像信号,从而驱动屏幕显示内容。
早期显卡多集成在主板上,仅承担基础的视频输出功能,并不负责复杂的图形计算。随着技术发展,出现了独立显卡和集成显卡的区分:
- 集成显卡:集成在 CPU 或主板芯片组中,依赖系统内存(RAM)作为显存,无法单独更换。适用于轻量办公和日常使用。
- 独立显卡:作为独立硬件插入主板的 PCIe 插槽,拥有专用显存和更强的计算能力,可随时更换升级。独立显卡在图形渲染、视频处理、科学计算等任务中表现更优。
现代笔记本通常配备双显卡:一个集成显卡(低功耗)和一个独立显卡(高性能)。系统可根据任务需求自动切换,以平衡性能和能耗。轻薄本可能仅配集成显卡以延长续航,而游戏本、工作站则倾向于搭载强大的独立显卡。
显卡驱动
显卡作为硬件设备,需要在操作系统中安装正确的显卡驱动程序以正常运行。显卡驱动是显卡与操作系统之间的桥梁,负责翻译操作系统的指令,使显卡能够理解并执行。驱动程序通常由显卡制造商提供,并需要与显卡型号和操作系统版本匹配,否则可能导致性能下降甚至设备无法识别。
以 NVIDIA 为例,其显卡驱动有两个主要版本:
- Game Ready 驱动:针对游戏场景优化,优先支持最新游戏的性能和稳定性。
- Studio 驱动:为创意和生产力软件优化,如视频编辑、3D 建模、深度学习等,注重稳定性和专业软件兼容性。
有时也可以理解为 Game Ready 更像 "快速迭代版",而 Studio 更类似 "长期支持版"。
nvidia-smi
(NVIDIA System Management Interface)是一个
NVIDIA 提供的命令行工具,旨在帮助管理和监控 NVIDIA
显卡设备。它提供了关于显卡型号、驱动版本、显存使用、GPU 利用率、CUDA
支持版本等详细信息。
1 | nvidia-smi |
以下是一个 nvidia-smi
的输出示例:
1 | +-----------------------------------------------------------------------------------------+ |
GPU
GPU(Graphics Processing Unit,图形处理单元)是一种专门设计用于处理图形计算的芯片,通常焊接在显卡上。可以类比 CPU 和主板的关系:GPU 是显卡的核心组件,就像 CPU 是主板的核心处理器。 GPU 不等于显卡。GPU 只是显卡的“大脑”,负责执行密集的计算任务。 为了正常工作,GPU 还需要供电模块、显存、散热系统和接口电路的支持。这些附属硬件与 GPU 芯片共同构成了完整的显卡。
GPU 的功能随着技术发展在不断扩展,NVIDIA 在推动 GPU 通用计算方面起到了关键作用:
- 图形渲染(GPU 的初衷):最早的 GPU 专注于图形渲染,将 3D 模型和场景转换成像素点输出到显示器上。例如光栅化、纹理映射和着色计算,这些任务都依赖 GPU 的强大并行能力。
- 通用计算 GPGPU(General Purpose GPU):人们逐渐发现 GPU 不仅擅长图形计算,还能加速其他高强度的数学运算。由于 GPU 本质上是大规模并行处理器,有人想到把普通的浮点运算伪装成图形任务,交给 GPU 加速处理。虽然这种做法绕了点弯,但它催生了 GPGPU 的概念。
- CUDA 时代:为了降低使用门槛,NVIDIA 推出了 CUDA(Compute Unified Device Architecture),提供了一个编程平台,让开发者可以用熟悉的 C/C++ 语言直接编写并行计算程序,摆脱了图形学知识的限制。CUDA 彻底打开了 GPU 的通用计算能力,使其广泛应用于深度学习、科学模拟、密码破解等领域。
GPU vs CPU:
- CPU(中央处理器):
- 由少量高性能核心组成(通常 4-64 个)。
- 适合复杂、逻辑性强、串行的任务,如操作系统调度、程序逻辑控制。
- 少数精英专家,擅长解决复杂的单个大问题。
- GPU(图形处理器):
- 拥有成千上万的简单核心(如 RTX 4090 拥有 16384 CUDA 核心)。
- 擅长大规模并行计算,将任务拆分成小片段,批量处理。
- 庞大士兵军团,每个士兵处理一小部分任务,同时执行,快速完成整体工作。
CPU 与 GPU 是领导和协作关系,在典型的工作流程中:
- CPU 负责整体任务调度,分解大任务。
- CPU 把适合 GPU 处理的计算任务打包发送给 GPU。
- GPU 并行处理计算任务,完成后把结果返回。
最早,GPU 主要处理图形渲染相关的任务。 如今,深度学习训练、分子动力学模拟、密码学破解等计算密集型任务也大量交给 GPU。 例如 PyTorch 等框架就是通过 CUDA 调用 GPU 加速训练神经网络模型。
由于图形学以及深度学习等并不关注的浮点数精度,GPU 从设计之初就主要关注 float 数据的大量高效运算,对于 double 数据的运算效率支持则要大打折扣,除非使用为高精度科学计算定制的 GPU型号?
CUDA
CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的(闭源)通用并行计算平台和编程模型,使开发人员能够利用 GPU 中的大量线程并行执行任务。CUDA 提供了一个全新的编程框架,能够充分利用 GPU 的计算能力,执行计算密集型的任务。
并不是所有 GPU 都支持 CUDA,只有 NVIDIA 自家的 GPU 才支持 CUDA,NVIDIA 的竞争对手 AMD 更倾向于支持 OpenCL 和 ROCm,它们在某些情况下相当于 CUDA 的竞争对手。
CUDA 平台包含多个组件,其中主要包括:
- CUDA C/C++ 编译器:
nvcc
,负责将 CUDA C/C++ 代码(.cu
文件)编译为 GPU 执行的机器码。(类比于gcc来理解) - 运行时库:提供与 GPU 交互的接口,包括内存管理、设备启动、线程同步和内核调度等功能,如 CUDA Runtime API 和 Driver API。
- 工具:用于管理 GPU 资源和执行 CUDA 程序的工具,帮助开发人员进行程序的调试、优化和性能分析。
在 CUDA 这个计算平台上可以使用一种定制的编程语言:CUDA C/C++。 CUDA C/C++ 的语法主要基于 C/C++,但是在 C/C++ 基础上提供了额外的定制语法和库函数,用于更好地描述和控制 GPU 的并行计算任务。
在通常的语境下,安装 CUDA 主要是指的是安装 NVIDIA 提供的 CUDA Toolkit,它包括了 CUDA 开发所需的编译器、CUDA 运行时、库、配套工具等,可以理解为一个完整的开发环境,
CUDA Toolkit 和支持 CUDA 的显卡驱动并不是一个概念:
- 为了正确运行已经编译好的 CUDA 程序,安装支持对应 CUDA 版本的 CUDA 驱动是必要的(CUDA 驱动并不等于 NVIDIA 显卡驱动,只是其中的一个模块),但是并不一定需要安装完整的 CUDA Toolkit。
- 为了开发和编译新程序,则必须在本机安装 CUDA Toolkit,并且要求 CUDA Toolkit 的版本不超过 CUDA 驱动支持的最高版本。
如果已经安装了 CUDA Toolkit,可以使用以下命令查看 nvcc
的版本,这个编译器的版本也就是编译器所属的 CUDA Toolkit 的版本。
1
nvcc --version
在nvidia-smi
命令的输出中可以看到
CUDA Version
一栏,这里显示的就是当前显卡驱动可以支持的最高
CUDA 版本。 反过来同理,指定版本的 CUDA
对于显卡驱动存在一个最低的版本要求。
在 NVIDIA 官网下载的 CUDA 套件包含以下几个主要部分:
- GPU 驱动(可选):
- 如果勾选了 "CUDA with Driver",安装包会附带显卡驱动。
- 注意:显卡驱动是独立的,通常电脑中已经下载了显卡驱动,可以单独下载和升级,通常建议直接保持最新驱动。
- CUDA Toolkit:核心开发工具链,包括:
nvcc
:CUDA C/C++ 编译器。- CUDA Runtime 和 Driver API:用于管理 GPU、启动内核、内存操作等。
- cuBLAS / cuFFT / cuSPARSE 等库:常用的 GPU 加速数学库。
- 工具链:如
cuda-gdb
调试器、nvprof
性能分析器。
直接去 NVIDIA 官网安装CUDA即可:CUDA Toolkit 12.4 Downloads | NVIDIA Developer, 安装中需要提供一个临时目录,在安装完成之后这个临时目录会被自动删除。
因为我的电脑的显卡和显卡驱动都足够新,选择CUDA 12.4,检查CUDA的版本是匹配的。 安装完成之后,可以检查nvcc的版本等,或者尝试一下简单的 CUDA C/C++ 代码编译测试。
cuDNN
cuDNN(CUDA Deep Neural Network library)是 NVIDIA 开发的专门用于深度神经网络加速的 GPU 加速库,它具有以下特点:
- 不属于基础的 CUDA 运行时库,而是建立在 CUDA 之上的高性能计算库。
- 主要优化深度学习中的关键操作,如卷积、池化、归一化、激活函数等常用算子。
- 广泛支持深度学习框架,如 TensorFlow、PyTorch 等,帮助这些框架充分发挥 GPU 的并行计算能力。
可以用一个类比来理解:
- CUDA 像是一套通用的工具箱,里面有锤子、螺丝刀等基础工具。
- cuDNN 则是一把专门为深度学习任务定制的扳手,它针对神经网络的特殊需求进行了极致优化。
对于常规的 PyTorch 使用,框架通常会自带编译好的 cuDNN,因此用户不需要直接操作。 但在更高级的场景,比如自定义算子或特殊模型优化,可能需要手动安装或升级 cuDNN,以利用最新的性能优化。
补充
用 conda 安装 PyTorch 时看起来会附带下载 cuda,但是实际下载的并不等于完整的 CUDA Toolkit!
实际上,附带安装的只是 PyTorch
正常运行所需的部分,主要是动态链接库,包括 CUDA Runtime Library(如
libcuda.so
)和 cuDNN、cuBLAS 等必要的计算库;不包括 nvcc
编译器、其它开发工具以及显卡驱动等,因此只是足够运行
PyTorch,但并不能支持 CUDA 程序的开发。
由于conda和pip的定位不同,conda可以管理这些非 python 库,而pip则只能安装python库,因此基于pip安装的pytorch会更加依赖系统中的CUDA Toolkit,最新的pytorch官网教程已经只推荐使用 pip 安装。