Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

001 · 什么是 CUDA —— 面向 C++ 工程师的 GPU 编程第一课

一份教案 + 可运行代码的完整包:HTML 讲义 6 章、3 个 CMake 代码子项目, 全部在 RTX 5070(Blackwell, CC 12.0)+ CUDA 13.3 + MSVC(VS 2026 BuildTools) 上 构建、运行、校验通过,讲义中的性能数据均为该环境实测值。

阅读入口:用浏览器打开 docs/index.html。

学完你能做什么

  1. 判断 C++ 项目的热点值不值得搬上 GPU,并说清楚理由(第 1 讲)
  2. 徒手写出带 stream / event / pinned memory 的完整 CUDA 程序, 在 Windows 上用 nvcc 或 CMake 两条路径编译(第 2 讲)
  3. 把 thread / warp / block / shared memory / 寄存器映射到 RTX 30/40/50 的真实硬件(第 3 讲)
  4. 分清 __syncthreads / __syncwarp / __threadfence / atomics 各管什么, 独立写出 8 个版本的 reduce(第 4 讲)
  5. 用 CUB 的 warp/block/device 三层原语替换大部分手写协作代码(第 5 讲)
  6. 遇到任何问题知道翻哪份官方文档(第 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

构建与运行

路径 B(推荐):CMake

在 "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 侧基准慢一个数量级。

路径 A:纯 nvcc 命令行(理解底层用)

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。

Windows 实战避坑(本教案开发中全部实际踩到)

症状 原因 解法
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

实测结果摘要(RTX 5070 · CUDA 13.3 · 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。

主要参考

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages