Skip to content

zhils/cuda_kernel_optimization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CUDA Kernel 优化

本项目逐步优化深度学习核心算子:从朴素基线实现到接近硬件峰值利用率的 CUDA Kernel,并在 NVIDIA GeForce RTX 5060 Ti(Blackwell,sm_120) 上与 cuBLAS / cuDNN / CUB 等库做基准对比。

性能总览

下列数字来自各子目录 README 中汇总的 Release 实测(具体规模与 CSV 路径见对应文档)。硬件峰值利用率以各算子目录中的 Nsight Compute 截图与分析为准。

算子 瓶颈类型 代表性加速(相对较朴素/早期实现) 相对库基线(同环境单次测得)
GEMM 计算受限 1024³:V1 → V514×(1.610 ms → 0.112 ms) V5 / cuBLAS:1024³ ≈1.43×,4096³ ≈1.46×(更快)
Softmax 内存受限 2048²:V0 → V439×(1.21 ms → 0.031 ms) 1024–2048:多组规模下 V3/V4 快于 cuDNN128–512cuDNN 更快
RMSNorm 内存受限 4096²:V0 → V43.6×(1.25 ms → 0.35 ms) 4096² 带宽:自研 V4 ≈574 GB/s vs cuBLAS ≈244 GB/s(约 2.4×);与 CUB 互有胜负

详细表格、相对比率与解读见:GEMM · Softmax · RMSNorm

优化方法论

每个算子都遵循一致的系统化优化流程:

理论分析 → 基线实现 → 性能剖析(Nsight)→ 定向优化 → 正确性验证 → 循环迭代
  1. Roofline 分析 —— 计算算术强度,判断计算受限 / 内存受限,并给出理论性能上限
  2. 朴素基线 —— 保证正确但未优化的 CUDA Kernel
  3. Nsight Compute 剖析 —— 定位真实瓶颈:warp stall、内存吞吐、占用率、指令构成
  4. 渐进优化 —— 通常实现多个版本(V0–V5),每版聚焦一个剖析得到的瓶颈
  5. 验证评估 —— 与 CPU 参考比对正确性,与 cuBLAS / cuDNN / CUB 比对性能

算子列表

GEMM(通用矩阵乘)— 计算受限

详细分析 →

版本 优化点 关键技术
V0 朴素实现 每线程一个输出元素
V1 共享内存分块 32×32 tile,float4 / __ldg
V2 线程级寄存器分块 每线程 8×8 输出子块
V3 软件流水 寄存器预取、加载与计算重叠
V4 更大 CTA 分块 大矩阵上提高块内复用
V5 Tensor Core WMMA(fp16 输入、fp32 累加)
Ref cuBLAS cublasSgemm

Softmax — 内存受限

详细分析 →

版本 优化点 关键技术
V0 朴素实现 每行单线程,多趟扫描
V1 共享内存归约 block 内 max / sum
V2 Online softmax 单趟数值稳定更新
V3 Warp 归约 + 向量化 __shfl + float4,可选行缓存
V4 融合 exp(可 staging 时) sum 与 write 共享一次 __expf
Ref cuDNN cudnnSoftmaxForward

RMSNorm — 内存受限

详细分析 →

版本 优化点 关键技术
V0 朴素实现 每行单线程
V1 共享内存 + 向量化 __ldgfloat4
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         顶层构建入口

许可证与引用

若将本仓库开源或分发,请补充所选开源许可证,并在说明中写明硬件与驱动版本以保证结果可复现。

About

This repo is a playground for my CUDA kernel learnings. The ultimate goal: push the GPU hardware to its absolute limits.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors