第一章:CUDA入门——从GPU架构到你的第一个核函数
各位同学,欢迎来到CUDA编程的世界。
说实话,我第一次接触CUDA是在2012年,那时候还在做分子动力学模拟。当时CPU算一个几千原子的体系要跑好几天,老板急得直跺脚。后来听师兄说有个叫CUDA的东西,能把计算速度提升几十倍...嗯,从那天起,我就再也没离开过GPU编程。
1.1 GPU架构简介:为什么GPU能跑这么快?
先问大家一个问题:为什么CPU和GPU长得不一样?
你看CPU,它就像个全能冠军——控制单元占了一大块面积,缓存也大,分支预测、乱序执行样样精通。但GPU呢?它把大部分晶体管都用来做计算单元了。说白了,CPU是几个精兵,GPU是成千上万的民工。
核心差异一句话:
- CPU:延迟优化,适合复杂控制流(比如操作系统、数据库)
- GPU:吞吐量优化,适合大规模并行计算(比如矩阵乘法、图像处理)
我给大家画个简化的GPU架构图(用文字描述):
GPU (以NVIDIA Ampere架构为例)
├── GPC (图形处理簇) × 8
│ └── TPC (纹理处理簇) × 2
│ └── SM (流式多处理器) × 2
│ ├── CUDA Core × 64 (FP32)
│ ├── Tensor Core × 4 (AI专用)
│ ├── Shared Memory (共享内存)
│ ├── Register File (寄存器堆)
│ └── Warp Scheduler (线程束调度器)
└── HBM2/HBM3 显存 (高带宽)
这里有个关键概念——Warp(线程束)。GPU一次调度32个线程一起执行。我在项目中遇到过一个问题:如果线程分支严重,同一个warp里的线程走不同路径,性能会急剧下降。这个坑后面会详细讲。
1.2 CUDA发展史:从G80到Hopper
CUDA的历史,其实就是GPU从图形卡变成通用计算卡的历史。
| 架构代号 | 发布年份 | 关键特性 | 我的评价 |
|---|---|---|---|
| Tesla (G80) | 2006 | 第一个CUDA架构,统一着色器 | 开天辟地 |
| Fermi | 2010 | ECC内存,双精度性能提升 | 科学计算的福音 |
| Kepler | 2012 | 动态并行,Hyper-Q | 我用的第一个架构 |
| Maxwell | 2014 | 低功耗,改进的共享内存 | 笔记本用户的春天 |
| Pascal | 2016 | NVLink,统一内存 | 大模型开始萌芽 |
| Volta | 2017 | Tensor Core,独立线程调度 | AI计算的转折点 |
| Turing | 2018 | RT Core,INT8推理加速 | 实时光线追踪+AI |
| Ampere | 2020 | 第三代Tensor Core,稀疏计算 | 目前最主流 |
| Hopper | 2022 | Transformer引擎,DPX指令 | 大模型专用 |
你想想看,从2006年到现在,GPU的计算能力提升了上万倍。我2015年用K80跑一个深度学习模型要三天,现在用A100只要两小时。这就是CUDA的魅力。
1.3 CUDA应用场景:不只是AI
很多人一听到CUDA就想到深度学习。其实它的应用范围广得很。
我见过的CUDA应用场景:
- AI/深度学习:训练和推理(PyTorch/TensorFlow底层就是CUDA)
- 科学计算:分子动力学(GROMACS、AMBER)、计算流体力学(OpenFOAM)
- 金融工程:蒙特卡洛模拟、期权定价(我帮某券商优化过,提速40倍)
- 图像/视频处理:实时滤镜、编解码加速
- 数据库:GPU加速SQL查询(比如BlazingSQL)
- 密码学:哈希碰撞、加密解密
说白了,只要你的计算可以拆成大量独立的小任务,GPU就能派上用场。我曾经帮一个做地震勘探的团队优化过代码,他们把波动方程模拟从CPU迁移到GPU后,一个工区从一周算完变成半天算完。老板当场就批了经费买V100。
1.4 CUDA开发环境搭建:手把手教你配环境
嗯,这里要注意。环境搭建是很多新手的第一道坎。我见过太多人在这一步卡住,然后放弃CUDA。其实没那么复杂。
第一步:确认你的硬件
先看看你的电脑有没有NVIDIA显卡:
# Linux/Mac
lspci | grep -i nvidia
# Windows
设备管理器 -> 显示适配器
如果没有独立显卡,也可以用云端环境(比如Google Colab、AWS EC2 P系列)。我个人建议初学者先用Colab,免费还不用配环境。
第二步:安装驱动
去NVIDIA官网下载对应显卡的驱动。注意:
避坑指南:
- 笔记本用户不要用Windows自动更新的驱动,去官网下
- Linux用户建议用runfile安装,别用包管理器(我曾经用apt装驱动,结果黑屏了三次)
- 安装后重启,运行
nvidia-smi验证
第三步:安装CUDA Toolkit
CUDA Toolkit包含了编译器(nvcc)、库(cuBLAS、cuFFT等)和调试工具。
# 下载地址:https://developer.nvidia.com/cuda-downloads
# 以Ubuntu 22.04为例:
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run
# 配置环境变量
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH
验证安装:
nvcc --version
# 应该输出:Cuda compilation tools, release 12.2, V12.2.0
第四步:安装Nsight工具
Nsight是NVIDIA的性能分析工具,分两种:
- Nsight Systems:系统级性能分析(看CPU/GPU时间线)
- Nsight Compute:内核级性能分析(看SM利用率、带宽等)
我个人习惯先装Nsight Systems,跑一遍程序看看瓶颈在哪,再用Nsight Compute深入分析。
我的建议:
初学者先别急着装Nsight。先写几个简单的核函数跑通,等遇到性能问题了再上分析工具。不然信息量太大,容易懵。
第五步:写个Hello World验证
创建一个文件 hello.cu:
#include <stdio.h>
__global__ void hello_from_gpu() {
printf("Hello from GPU thread %d\n", threadIdx.x);
}
int main() {
hello_from_gpu<<<1, 10>>>();
cudaDeviceSynchronize();
return 0;
}
编译运行:
nvcc hello.cu -o hello
./hello
# 输出:Hello from GPU thread 0 到 9
看到这10行输出,恭喜你,CUDA环境配好了!
本章小结
这一章我们聊了:
- GPU为什么快——架构设计决定了它适合并行计算
- CUDA的发展——从G80到Hopper,性能翻了上万倍
- 应用场景——AI只是冰山一角
- 环境搭建——驱动、Toolkit、Nsight,一步都不能少
下一章,我们会真正进入CUDA编程的核心——线程层次结构。你会明白为什么GPU能同时跑成千上万个线程,以及怎么控制它们。
到时候见。