本项目逐步优化深度学习核心算子:从朴素基线实现到接近硬件峰值利用率的 CUDA Kernel,并在 NVIDIA GeForce RTX 5060 Ti(Blackwell,sm_120) 上与 cuBLAS / cuDNN / CUB 等库做基准对比。
下列数字来自各子目录 README 中汇总的 Release 实测(具体规模与 CSV 路径见对应文档)。硬件峰值利用率以各算子目录中的 Nsight Compute 截图与分析为准。
| 算子 | 瓶颈类型 | 代表性加速(相对较朴素/早期实现) | 相对库基线(同环境单次测得) |
|---|---|---|---|
| GEMM | 计算受限 | 1024³:V1 → V5 约 14×(1.610 ms → 0.112 ms) | V5 / cuBLAS:1024³ ≈1.43×,4096³ ≈1.46×(更快) |
| Softmax | 内存受限 | 2048²:V0 → V4 约 39×(1.21 ms → 0.031 ms) | 1024–2048:多组规模下 V3/V4 快于 cuDNN;128–512 常 cuDNN 更快 |
| RMSNorm | 内存受限 | 4096²:V0 → V4 约 3.6×(1.25 ms → 0.35 ms) | 4096² 带宽:自研 V4 ≈574 GB/s vs cuBLAS ≈244 GB/s(约 2.4×);与 CUB 互有胜负 |
详细表格、相对比率与解读见:GEMM · Softmax · RMSNorm。
每个算子都遵循一致的系统化优化流程:
理论分析 → 基线实现 → 性能剖析(Nsight)→ 定向优化 → 正确性验证 → 循环迭代
- Roofline 分析 —— 计算算术强度,判断计算受限 / 内存受限,并给出理论性能上限
- 朴素基线 —— 保证正确但未优化的 CUDA Kernel
- Nsight Compute 剖析 —— 定位真实瓶颈:warp stall、内存吞吐、占用率、指令构成
- 渐进优化 —— 通常实现多个版本(V0–V5),每版聚焦一个剖析得到的瓶颈
- 验证评估 —— 与 CPU 参考比对正确性,与 cuBLAS / cuDNN / CUB 比对性能
| 版本 | 优化点 | 关键技术 |
|---|---|---|
| V0 | 朴素实现 | 每线程一个输出元素 |
| V1 | 共享内存分块 | 32×32 tile,float4 / __ldg |
| V2 | 线程级寄存器分块 | 每线程 8×8 输出子块 |
| V3 | 软件流水 | 寄存器预取、加载与计算重叠 |
| V4 | 更大 CTA 分块 | 大矩阵上提高块内复用 |
| V5 | Tensor Core | WMMA(fp16 输入、fp32 累加) |
| Ref | cuBLAS | cublasSgemm |
| 版本 | 优化点 | 关键技术 |
|---|---|---|
| V0 | 朴素实现 | 每行单线程,多趟扫描 |
| V1 | 共享内存归约 | block 内 max / sum |
| V2 | Online softmax | 单趟数值稳定更新 |
| V3 | Warp 归约 + 向量化 | __shfl + float4,可选行缓存 |
| V4 | 融合 exp(可 staging 时) | sum 与 write 共享一次 __expf |
| Ref | cuDNN | cudnnSoftmaxForward |
| 版本 | 优化点 | 关键技术 |
|---|---|---|
| V0 | 朴素实现 | 每行单线程 |
| V1 | 共享内存 + 向量化 | __ldg、float4 |
| V2 | Warp 归约 | __shfl_down_sync |
| V3 | 双缓冲流水 | ping-pong 加载与规约重叠 |
| V4 | 实验分支 | shared padding 降低 bank 冲突、写回 2-way |
| Ref | CUB / cuDNN | 规约与归一化基线 |
# 配置(按本机 GPU 架构修改,Blackwell 示例为 120)
cmake -S . -B build -DCMAKE_CUDA_ARCHITECTURES=120
# 编译(Windows 示例为 Release)
cmake --build build --config Release -j 8
# 单算子可执行文件(路径以生成器为准)
./build/bin/Release/gemm_v0_naive
./build/bin/Release/gemm_v5
./build/bin/Release/softmax_v4
./build/bin/Release/rmsnorm_benchmark_all
# 汇总基准(生成各算子对比 CSV,默认位于 data/results/,多数被 .gitignore)
./build/bin/Release/gemm_benchmark_all
./build/bin/Release/softmax_benchmark_all
./build/bin/Release/rmsnorm_benchmark_all说明:
gemm_benchmark_all支持仅聚合已有结果:设置环境变量GEMM_BENCH_SKIP_RUN=1后执行。- 运行前请保证
data/下对应test_cases.csv存在(仓库中已跟踪脚本与用例模板)。 - 剖析脚本位于
data/scripts/(如 GEMM 的 Nsight Compute 脚本),可按需本地执行。
| 项目 | 配置 |
|---|---|
| GPU | NVIDIA GeForce RTX 5060 Ti 16GB |
| 架构 | Blackwell(sm_120) |
| CUDA Toolkit | 13.2(子 README 实测记录) |
| cuDNN | 9.20(与 Softmax 文档一致;请以本机安装为准) |
| 计时 | cudaEvent;汇总程序多为 10 次迭代去极值均值;cuDNN 参考实现含 warmup |
├── common/ 通用头文件与基准工具(计时、随机矩阵、CSV 用例等)
├── gemm/ GEMM:V0–V5 + cuBLAS 参考 + benchmark_all
├── softmax/ Softmax:V0–V4 + cuDNN 参考 + benchmark_all
├── rmsnorm/ RMSNorm:V0–V4 + CUB/cuDNN 参考 + benchmark_all
├── data/
│ ├── scripts/ 剖析与辅助脚本(版本管理)
│ ├── */test_cases.csv 各算子基准用例(版本管理)
│ └── results/ 运行生成的 CSV(默认 .gitignore)
├── docs/ 本地文档(默认不纳入版本库,见 .gitignore)
└── CMakeLists.txt 顶层构建入口
若将本仓库开源或分发,请补充所选开源许可证,并在说明中写明硬件与驱动版本以保证结果可复现。