CUDA 代码技能库
本项目是一个面向 AI IDE(如 Claude Code、Trae、Qoder 等)的 CUDA 内核开发辅助项目,通过结合抓取自 NVIDIA 官方文档的深度本地知识库、官方代码范例索引与基于 Agent 的代码生成技能,为底层 GPU 开发者提供准确、高效的自动化代码编写与查阅辅助。
1. 核心特性
针对大模型在底层 GPU 编程中易产生幻觉的问题,本项目通过离线知识库与 Agent 技能的深度结合,提供了以下技术优势:
- 基于知识增强的代码生成 (RAG):操作技能被专门指导去搜索本地的
cuda-knowledge(API 文档)和cuda-samples(代码范例)技能,以确保对复杂 API(如 cuBLASLt、Tensor Cores、PTX 等)的准确使用和代码模式参考,从而避免 AI 产生幻觉。 - 内核内部分段诊断:通过
clock64PTX 指令实现内核内部 phase 级别的耗时分解(load/compute/store 分段),配合-DKERNEL_PROFILE条件编译实现零开销的生产/诊断双模式切换。结合nvidia-smi实时硬件状态监控,形成从环境层到代码层的完整性能排查体系。 - 全面的离线文档:包含大量从 NVIDIA HTML 文档转换而来的、支持本地搜索的 Markdown 文件,涵盖了底层开发中最常用的官方参考资料。
- 文档抓取流水线:内置了一套完善的文档抓取工具,能够随时同步和更新最新的官方文档内容。
2. 技能概览和使用
本项目采用多技能单体仓库(Monorepo)的结构进行组织,skills/ 目录下的各个 Agent 技能不仅可以独立运作,还能相互配合形成一套自动化的性能分析与优化工作流。
2.1 技能概览
当前已就绪的各项核心技能涵盖了从知识检索、范例匹配、代码生成到性能分析的完整闭环,具体分工如下:
| 技能名称 | 角色 | 描述 |
|---|---|---|
| cuda-knowledge | 知识基座 | 提供支持搜索的本地文档库(包含来自 NVIDIA 官方文档的 PTX、cuBLAS、Runtime / Driver、Math API、NCCL 等参考资料)。 |
| cuda-samples | 范例索引 | 精选 50+ NVIDIA 官方 CUDA Samples,按模式(规约/扫描/GEMM/CUDA Graph 等)编排,含 GitHub 永久链接和关键代码片段。 |
| cuda-optimizer | 任务编排 | 负责主导核心性能分析与优化循环,负责协调并调度其他专项技能共同完成复杂的优化任务。 |
| cuda-code-generator | 代码生成 | 用于生成和修改 .cu 代码文件,内置指令要求其在执行时必须查阅 cuda-knowledge 和 cuda-samples 以保证 API 和代码模式的准确性。支持 -DKERNEL_PROFILE 条件编译插桩,同一份 .cu 文件可通过编译 flag 在零开销生产模式与 per-phase clock64 诊断模式之间切换。 |
| ncu-rep-analyzer | 性能分析 | 负责解析 NCU(Nsight Compute)性能分析报告,并结合内置的性能陷阱指南(如 performance-traps.md,含 GPU 硬件状态监控与环境排查清单)进行深度的瓶颈诊断。 |
| kernel-benchmarker | 基准测试 | 负责内核代码的编译、正确性验证与基准测试,当遇到编译或运行错误时会利用调试指南(如 debugging-tools.md)进行自动修复。支持 PTX 缓存、ncu_profile 自包含可执行文件、nsys 快速分析等多种 profiling 路径。 |
2.2 快速开始
将 skills/ 目录加载到支持的 AI IDE(Claude Code、Trae、Qoder 等)中即可启用所有技能。
加载完成后,在对话中通过自然语言即可调用对应技能,例如:
# 查阅官方范例寻找代码模式
"使用 cuda-samples,帮我找一个 shared memory 矩阵转置的 CUDA 代码范例。"
# 调用代码生成技能并结合本地知识库与范例
"使用 cuda-code-generator,帮我写一个矩阵转置的 CUDA kernel,并在实现前查阅 cuda-knowledge 和 cuda-samples 中的相关文档与范例。"
也可以直接在命令行中检索和运行示例:
# 查看官方 vectorAdd 范例
cat cuda-samples/cpp/0_Introduction/vectorAdd/vectorAdd.cu
# 运行 benchmark 示例
python3 skills/kernel-benchmarker/scripts/benchmark.py examples/vectorAdd/solution.cu --N=1000000
3. 文档抓取工具
scrape_cuda_docs.py 是一个采用了统一的单文件设计的脚本,并且针对不同 API 文档支持灵活的抓取与清理策略。
[!NOTE] 位于
cuda-knowledge中的原始文档是通过自定义的抓取工具生成的。
3.1 安装与运行
scrape_cuda_docs.py 依赖于 uv 运行,它是一个包含内联依赖声明(PEP 723)的单文件脚本,无需繁琐的虚拟环境配置。关于如何添加新 API 支持,详细可参阅 nvidia_doc_sync/README.md 文件。
# 如果尚未安装 uv 工具,请先执行安装
curl -LsSf https://astral.sh/uv/install.sh | sh
# 抓取各类 CUDA 官方文档
uv run nvidia_doc_sync/scrape_cuda_docs.py ptx
uv run nvidia_doc_sync/scrape_cuda_docs.py runtime
uv run nvidia_doc_sync/scrape_cuda_docs.py driver
uv run nvidia_doc_sync/scrape_cuda_docs.py cublas
uv run nvidia_doc_sync/scrape_cuda_docs.py math
uv run nvidia_doc_sync/scrape_cuda_docs.py nccl
# 跳过网络下载,仅对缓存的原始文件重新运行清理流程
uv run nvidia_doc_sync/scrape_cuda_docs.py driver --skip-download
4. 校验与测试
本项目内置了多层次的校验与测试工具。
4.1 静态校验
# 校验各技能间的接口一致性(子技能引用、瓶颈类型对齐、路径解析等)
python3 scripts/check_skills.py
# 校验文档中的文件数/大小与磁盘实际内容一致
python3 scripts/check_counts.py
# 校验 cuda-samples 参考文件中的路径在子模块中均存在
uv run scripts/check_links.py
[!NOTE]
check_links.py依赖cuda-samples子模块。首次使用前需执行:git submodule update --init
4.2 Kernel 基准测试
对 CUDA kernel(extern "C" __global__ void solve(...))进行编译、执行和性能测试,支持与 PyTorch 参考实现对比验证。示例文件在 examples/vectorAdd/:
# 仅基准测试(无参考对比)
python3 skills/kernel-benchmarker/scripts/benchmark.py examples/vectorAdd/solution.cu \
--N=1000000 --repeat=20
# 编译 + 正确性验证 + 性能对比
python3 skills/kernel-benchmarker/scripts/benchmark.py examples/vectorAdd/solution.cu \
--ref=examples/vectorAdd/ref.py --N=1000000 --repeat=20
kernel 通过 nvcc -ptx 编译为 PTX,经由 CUDA Driver API (cuLaunchKernel) 在同一进程中加载执行。PTX 文件自动缓存,首次后的运行跳过编译。
4.3 NCU Profiling
通过 ncu_profile.py 构建自包含 profiling 可执行文件(无子进程,NCU 不会断连):
# 构建 profiling 专用可执行文件
python3 skills/kernel-benchmarker/scripts/ncu_profile.py examples/vectorAdd/solution.cu \
--N=1000000 --build-only
# 默认模式(--set launch),所有环境可用(容器/云主机等无需 PMU 权限)
ncu --kernel-name solve --launch-skip 10 --launch-count 1 \
--set launch -o report -f ./examples/vectorAdd/solution_bench --N=1000000
# 详细性能指标模式(需宿主机 PMU 权限: perf_event_paranoid=0)
# ncu --kernel-name solve ... --set full ...
样例报告见
examples/ncu-profile/,含.ncu-rep二进制文件和文本导出。
4.4 查阅官方代码范例
通过 cuda-samples 技能索引查找 NVIDIA 官方 CUDA 代码范例:
# 按模式搜索
grep -r "reduction\|GEMM\|CUDA Graph" skills/cuda-samples/SKILL.md
# 查看完整源码(需先 git submodule update --init)
cat cuda-samples/cpp/0_Introduction/vectorAdd/vectorAdd.cu
4.5 内核内部诊断与环境排查
clock64 内核内部分段计时
使用 %%clock64 PTX 指令在内核内部任意位置插入计时点,实现 load/compute/store 等 phase 级别的延迟分解,精度远超 cudaEvent(仅能测量完整 kernel 耗时)。详见 cuda-optimization-strategies.md → Kernel Internal Phase Timing。
快速示例:
unsigned long long t0, t1;
asm volatile("mov.u64 %0, %%clock64;" : "=l"(t0));
// ... 待测量代码段 ...
asm volatile("mov.u64 %0, %%clock64;" : "=l"(t1));
// t1 - t0 = 该段代码的 GPU 周期数
-DKERNEL_PROFILE 条件编译
cuda-code-generator 支持通过 -DKERNEL_PROFILE 编译 flag 在同一份 .cu 文件中切换生产(零开销)和诊断(per-phase clock64 耗时)模式,无需维护两份源码:
# 生产构建 — 零 profiling 开销
nvcc -O3 -arch=sm_89 -o kernel solution.cu
# 诊断构建 — 输出 per-phase clock64 耗时
nvcc -O3 -arch=sm_89 -DKERNEL_PROFILE -o kernel_profile solution.cu
GPU 硬件状态监控
在进行 benchmark 或 profiling 时,并行运行以下命令以排除环境因素(clock throttling、PCIe 降级、功耗墙等)对性能数据的干扰:
# 实时采样(另开终端,与 benchmark 并行运行)
nvidia-smi -i 0 --query-gpu=timestamp,clocks.gr,clocks.mem,pstate,power.draw,\
pcie.link.gen.current,pcie.link.width.current,temperature.gpu,\
utilization.gpu,utilization.memory --format=csv -l 1 > gpu_monitor.csv
详见 performance-traps.md → GPU Hardware State Monitoring,包含 7 项关键指标解读表和 9 步环境排查清单。
nsys 快速分析
nsys-guide.md 提供了四组一键式 profile + report 工作流,适用于快速定位瓶颈:
# Kernel 耗时主导分析(哪个 kernel 占 GPU 时间最多?)
nsys profile -o /tmp/nsys_bench --force-overwrite true ./program
nsys stats --report cuda_gpu_kern_sum /tmp/nsys_bench.nsys-rep
# 单命令快速模式(profile + stats 一步完成)
nsys profile --stats=true --trace=cuda -o /tmp/nsys_quick --force-overwrite true ./program