1. CUDA与GPU计算概述:GPU架构演进、CUDA生态全景、异构计算模型、课程目标与前置知识

1.1 从图形卡到通用计算加速器

说起GPU,很多人第一反应还是「打游戏的显卡」。但说实话,过去这十几年,GPU早就不是那个只会画图的角色了。我2012年刚入行时,公司里用GPU做科学计算的人还被视为异类。现在呢?几乎每个AI团队都在抢A100、H100。

GPU的架构演进,我把它分成三个阶段:

  • 固定功能管线时代(2000年前后):GPU只能做图形渲染,程序员没法干预。你想用它算个矩阵乘法?门都没有。
  • 可编程着色器时代(2006年之前):出现了顶点着色器和像素着色器,但编程模型极其别扭。我记得当时有人用HLSL写通用计算,那代码简直不忍直视。
  • 统一计算架构时代(2006年至今):NVIDIA推出了CUDA,GPU终于有了通用的编程接口。从Fermi到Ampere,再到Hopper,每一代都在强化计算能力。

核心变化:GPU从「很多小核心+固定逻辑」变成了「很多小核心+可编程+专用加速单元」。说白了,就是越来越像CPU,但保留了并行优势。

我个人觉得,理解GPU架构的关键在于抓住两个数字:核心数量和内存带宽。一个A100有6912个CUDA核心,内存带宽超过2TB/s。你想想看,CPU才几个核?几十个顶天了。这就是GPU能碾压CPU并行计算的根本原因。

1.2 CUDA生态全景:不只是个编程语言

很多人以为CUDA就是「用C++写GPU代码」。嗯,这只是冰山一角。CUDA生态其实是一个庞大的软件栈,我把它画成了下面这张图:

CUDA生态全景图 硬件层 GPU(Fermi / Kepler / Maxwell / Pascal / Volta / Turing / Ampere / Hopper) 驱动与运行时层 CUDA Driver API / CUDA Runtime API / cuBLAS / cuFFT / cuRAND / cuSPARSE 编程模型层 CUDA C/C++ / CUDA Fortran / PTX / NVCC编译器 / 线程层次结构 库与框架层 TensorRT / cuDNN / NCCL / Thrust / CUB / PyTorch / TensorFlow / JAX

这张图我想强调几点:

  • 硬件层是一切的基础。不同架构的GPU,性能特征差异很大。我在项目中遇到过,同样的代码在V100上跑得飞快,换到T4上就慢了一半——因为T4的Tensor Core少了很多。
  • 驱动与运行时层提供了底层API和数学库。我个人习惯直接调用cuBLAS做矩阵乘法,而不是自己手写——除非你要做极致优化。
  • 编程模型层是CUDA的核心。线程、块、网格这三层结构,你必须吃透。后面几章我们会反复用到。
  • 库与框架层让开发者不用从零造轮子。比如NCCL,做多卡通信时几乎必用。

我的建议:初学者先别碰Driver API,从Runtime API入手。Driver API太底层,调试起来很痛苦。我当年为了调一个上下文切换的bug,整整花了三天。

1.3 异构计算模型:CPU+GPU的协作之道

异构计算,说白了就是让CPU和GPU各干各的擅长的事。CPU擅长控制逻辑和串行任务,GPU擅长数据并行计算。你想想看,让CPU去算几百万个矩阵乘法,那不是找虐吗?

典型的异构计算流程是这样的:

  1. 数据准备:CPU把数据从硬盘加载到内存
  2. 数据搬运:CPU把数据从内存拷贝到GPU显存
  3. GPU计算:CPU启动GPU内核,GPU并行执行
  4. 结果回传:GPU把计算结果拷贝回CPU内存
  5. 后处理:CPU对结果做进一步处理

这里有个坑,我必须要说:数据搬运的开销往往被忽略。我曾经优化一个图像处理管线,GPU计算只用了2ms,但数据从CPU传到GPU花了15ms。你说这优化还有什么意义?所以,尽量减少CPU和GPU之间的数据传输,能一次传完就别分多次。

避坑指南:我曾经在项目中犯过一个低级错误——在循环里反复调用cudaMemcpy。每次只传几个字节,结果性能惨不忍睹。后来改成一次性传完,速度提升了20倍。记住:批量传输,避免小数据量频繁传输。

1.4 课程目标与前置知识

这门课的目标很明确:让你从零开始,掌握CUDA部署的完整流程。从单卡优化到多卡通信,再到集群部署,每一步我都会结合自己的实战经验来讲。

具体来说,学完这门课你应该能:

  • 理解GPU架构对性能的影响,能针对不同架构做优化
  • 熟练使用CUDA编程模型,写出高效的内核函数
  • 掌握内存优化技巧,包括共享内存、寄存器、常量内存的使用
  • 会用NCCL做多卡通信,能部署多机多卡训练
  • 了解常见的性能分析工具,比如nsys、ncu

前置知识方面,你需要:

知识领域 具体要求
C/C++编程 熟悉指针、内存管理、函数调用。不要求精通,但至少能看懂代码
计算机体系结构 了解CPU缓存、内存层次结构。不懂的话,建议先补一下
并行计算基础 知道什么是线程、什么是同步。有OpenMP或MPI经验更好
Linux基础 会基本的命令行操作,能编译代码。我们全程在Linux环境下做

重要提醒:如果你对C++的指针和内存分配还不熟,建议先花一周时间补一补。CUDA编程中90%的bug都跟内存有关。我见过太多人因为野指针问题调试到崩溃。

嗯,以上就是第一章的内容。GPU架构演进、CUDA生态、异构计算模型,这些概念是后续所有章节的基础。从下一章开始,我们就要真正动手写代码了——我会带你从最简单的「Hello World」内核函数开始,一步步深入到性能优化。

想要更多资料,联系可可