一份教案 + 可运行代码的完整包:HTML 讲义 6 章、3 个 CMake 代码子项目, 全部在 RTX 5070(Blackwell, CC 12.0)+ CUDA 13.3 + MSVC(VS 2026 BuildTools) 上 构建、运行、校验通过,讲义中的性能数据均为该环境实测值。
阅读入口:用浏览器打开 docs/index.html。
- 判断 C++ 项目的热点值不值得搬上 GPU,并说清楚理由(第 1 讲)
- 徒手写出带 stream / event / pinned memory 的完整 CUDA 程序, 在 Windows 上用 nvcc 或 CMake 两条路径编译(第 2 讲)
- 把 thread / warp / block / shared memory / 寄存器映射到 RTX 30/40/50 的真实硬件(第 3 讲)
- 分清
__syncthreads/__syncwarp/__threadfence/ atomics 各管什么, 独立写出 8 个版本的 reduce(第 4 讲) - 用 CUB 的 warp/block/device 三层原语替换大部分手写协作代码(第 5 讲)
- 遇到任何问题知道翻哪份官方文档(第 6 讲)
001_what_is_cuda/
├── README.md ← 你在这里
├── CMakeLists.txt ← 顶层工程(CUDA 作为一等公民语言)
├── common/
│ └── cuda_check.h ← CUDA_CHECK / CUDA_CHECK_LAST 错误检查宏
├── ch02_vector_add/ ← 第 2 讲随讲代码
│ ├── vector_add_minimal.cu ← 30 行最小可运行程序
│ ├── vector_add.cu ← 完整版:pinned buffer + stream + event + grid-stride
│ └── build_nvcc.cmd ← 编译路径 A:纯 nvcc 命令行(自动定位 VS)
├── ch04_reduce/
│ └── reduce.cu ← reduce v0→v7 渐进优化,运行输出性能对比表
├── ch05_cub/
│ ├── cub_reduce.cu ← CUB 三层 reduce:Warp / Block / Device
│ └── cub_primitives.cu ← BlockLoad+BlockScan+BlockStore / WarpScan / BlockRadixSort
└── docs/ ← HTML 教案(离线可读,无外部依赖)
├── index.html ← 课程地图
├── 01_why_cuda.html … 06_docs.html
└── assets/ ← 样式与轻量代码高亮
| 组件 | 要求 | 本教案实测 |
|---|---|---|
| GPU | NVIDIA,CC ≥ 7.5(30/40/50 系均可) | RTX 5070(CC 12.0) |
| 驱动 | 与 toolkit 配套或更新 | R580+ |
| CUDA Toolkit | 12.x / 13.x | 13.3(winget install Nvidia.CUDA) |
| 主机编译器 | Visual Studio 2022/2026 的 MSVC x64(BuildTools 即可) | MSVC 14.51 |
| CMake + Ninja | CMake ≥ 3.24(VS BuildTools 自带) | CMake 4.3 |
在 "x64 Native Tools Command Prompt for VS" 中,进入本目录:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
build\ch02_vector_add\vector_add_minimal.exe
build\ch02_vector_add\vector_add.exe
build\ch04_reduce\reduce.exe
build\ch05_cub\cub_reduce.exe
build\ch05_cub\cub_primitives.exe- 默认
CMAKE_CUDA_ARCHITECTURES=native(只为本机 GPU 编译)。 发布/多卡兼容时改为:-DCMAKE_CUDA_ARCHITECTURES="86;89;120"(30/40/50 系)。 - 务必显式
-DCMAKE_BUILD_TYPE=Release:新版 CMake 在 Windows 默认 Debug,/Od /RTC1会让 host 侧基准慢一个数量级。
cd ch02_vector_add
build_nvcc.cmd REM 或手动:
nvcc -O2 -arch=sm_120 -Xcompiler /utf-8,/Zc:preprocessor -I..\common vector_add.cu -o vector_add.exe-arch:50 系 sm_120,40 系 sm_89,30 系 sm_86。原理讲解见教案第 2 讲 §2.7。
| 症状 | 原因 | 解法 |
|---|---|---|
CUB/CCCL 头文件 #error ... traditional preprocessor |
CUDA 13.x 的 CCCL 强制要求 MSVC 标准预处理器 | 给 cl.exe 传 /Zc:preprocessor(本工程 CMake 已配好) |
error: missing closing quote,行内有中文 |
nvcc 前端按 GBK 解码无 BOM 的 UTF-8 源文件,中文尾字节把引号"吃"了 | 源文件存成 UTF-8 with BOM,或字符串只用 ASCII(中文注释安全) |
kernel 模板报 type defined inside a __host__ function |
把 functor 定义在了函数体内 | 自定义算子(如给 CUB 的比较器)必须放在全局作用域 |
| 新编译的 exe 被 "Device Guard 组织策略" 拦截 | 企业管控机的 WDAC 按文件 hash 做云信誉判定 | 重新链接(产生新 hash)通常即可;不行找 IT 加白名单 |
| 基准数据异常慢 | 忘了 Release | -DCMAKE_BUILD_TYPE=Release |
ch02 vector_add(16M 元素):kernel 0.409 ms(492 GB/s); 两趟 PCIe 拷贝共 14.3 ms —— 传输是计算的 35 倍,"数据驻留显存"的现场论据。
ch04 reduce(32M float,20 次平均):
CPU single-thread (double) 21.402 ms reference
v0 interleaved + modulo 0.514 ms 261 GB/s 1.00x
v2 sequential addressing 0.492 ms 273 GB/s 1.05x
v3 multi-element per thread 0.229 ms 586 GB/s 2.25x ← 最大飞跃
v5 warp-shuffle two-level 0.230 ms 584 GB/s 2.24x
v6 single-pass atomicAdd 0.223 ms 603 GB/s 2.31x ← 规格带宽的 90%
v7 single-pass __threadfence 0.246 ms 546 GB/s 2.09x
ch05 cub:DeviceReduce::Sum 0.237 ms(567 GB/s)≈ 手写最优; WarpReduce / BlockReduce / BlockScan / BlockRadixSort 全部校验 OK。
- CUDA Programming Guide (注意:CUDA 13.0 起这是新版主教材;旧的 CUDA C++ Programming Guide 已标记 Legacy 停更)
- CUDA C++ Best Practices Guide
- Mark Harris, Optimizing Parallel Reduction in CUDA(经典讲义)
- RussWong/CUDATutorial 之 5_reduce(T4 实测数据,与本教案 5070 数据形成代差对照)
- CCCL / CUB 文档、官方 cuda-samples(
threadFenceReduction为 v7 原型) - 官方文档完整地图见教案第 6 讲