第一章: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架构,统一着色器开天辟地
Fermi2010ECC内存,双精度性能提升科学计算的福音
Kepler2012动态并行,Hyper-Q我用的第一个架构
Maxwell2014低功耗,改进的共享内存笔记本用户的春天
Pascal2016NVLink,统一内存大模型开始萌芽
Volta2017Tensor Core,独立线程调度AI计算的转折点
Turing2018RT Core,INT8推理加速实时光线追踪+AI
Ampere2020第三代Tensor Core,稀疏计算目前最主流
Hopper2022Transformer引擎,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能同时跑成千上万个线程,以及怎么控制它们。

到时候见。