CUDA Samples实战:10分钟跑通第一个GPU并行计算示例
【免费下载链接】cuda-samplesSamples for CUDA Developers which demonstrates features in CUDA Toolkit项目地址: https://gitcode.com/GitHub_Trending/cu/cuda-samples
1. CUDA Samples 替你省了什么事
CUDA Samples 是 NVIDIA 官方维护的 CUDA 示例仓库,180 个可直接构建运行的 GPU 并行计算示例(C++ 为主,另有一套 Python 版),从最基础的向量加法一路覆盖到 Tensor Core、CUDA Graphs、NVVM。它替你省掉的是"查 API、试编译、逐个查返回码"这段磨人时间——每个示例自带 README,依赖和用法写得明明白白,CMake 一条命令全量构建。仓库还提供run_tests.py,一次跑出全部示例的对错报告。整个仓库 180 个可执行文件,你真的只需要跑通前 3 个就能入门。
2. 5分钟跑通:从 clone 到看到 GPU 输出
装完 Toolkit 想验证环境,结果cmake直接报错?先走一遍最短路径:
- 前置条件:装好与本仓库匹配的 CUDA Toolkit(当前版本对应 CUDA 13.3)和 CMake 3.20+,官方下载页有分平台安装指引,按默认选项装即可。
- 核心命令:
git clone https://gitcode.com/GitHub_Trending/cu/cuda-samples cd cuda-samples mkdir build && cd build cmake .. make -j$(nproc)- 验证标志:在 build 目录里找到并运行
vectorAdd,输出末尾出现Test PASSED,说明分配显存、拷贝数据、启动 kernel、回读校验这条完整链路全部走通。
跑不起来的三个高频坑:
cmake报找不到 CUDA 编译器 →nvcc不在 PATH,或 Toolkit 版本与仓库不匹配,先看nvcc --version。- 一批图形类示例构建失败 → 缺 OpenGL/Vulkan/FreeImage 依赖,这些示例会自动弃权,不影响其他目标。
- 运行报 "no kernel image is available" → 你的 GPU 架构没被编译进去,跑一下
cpp/1_Utilities/deviceQuery/查计算能力再对照。
3. 仓库导览:按"你会在哪找到什么"
目录编号其实不用记,按意图找就行:
- 我想先跑个 Hello GPU→
cpp/0_Introduction/vectorAdd/vectorAdd.cu,显存分配、数据拷贝、kernel 启动、结果校验全流程都有;想看硬件配置就找cpp/1_Utilities/deviceQuery/。 - 我想理解内存/线程模型和经典算法→
cpp/2_Concepts_and_Techniques/,reduction、scan、histogram、threadFenceReduction 都是教科书级写法。 - 我想看库级封装→
cpp/4_CUDA_Libraries/,nvJPEG、cuFFT、cuBLAS、CUB、cuSOLVER 各有一个子目录,直接看官方推荐用法。 - 我想看领域案例→
cpp/5_Domain_Specific/,图像(Mandelbrot、bilateralFilter、marchingCubes)、金融(BlackScholes)、电磁仿真(FDTD3d)都有。 - 我想看新特性 / Python→
cpp/3_CUDA_Features/(Tensor Core、CUDA Graphs)、cpp/9_CUDA_Tile/,以及按同样主题组织的python/目录。
4. 精选 3 个示例深挖:DCT、批量解码、保边滤波
dct8x8:图像块怎么变成压缩系数
核心技术点:在 GPU 上对 8x8 图像块做离散余弦变换(DCT)——JPEG 压缩的关键步骤。逻辑不复杂:host 把图像按块喂给 GPU,每个线程负责一个像素位置,kernel 里直接对预计算的余弦系数矩阵做乘加;仓库同时给了朴素直算版和更接近成熟库实现的优化版做对比。跑完会在终端输出 CUDA 结果与 CPU 黄金结果的对比,两边一致即正确。下面这张图是 DCT 各频率分量的基函数,看一眼就知道 DCT 到底在对图像做什么:
nvJPEG:数据加载的第一道加速
核心技术点:用 nvJPEG 库做 GPU 加速的单张与批量 JPEG 解码,专治"数据喂不饱 GPU"的问题。逻辑是:读入一批 JPEG 文件,创建解码器后整批直接解到设备显存,省掉 CPU 解码瓶颈;还支持双缓冲 pipelining 的解耦 API,让 I/O 和解码重叠。运行后会对示例图片逐批解码并打印每批耗时,批量越大相对 CPU 解码的优势越明显:
bilateralFilter:CUDA 计算 + OpenGL 渲染的完整算法
核心技术点:保边平滑滤波器,每个像素按空间距离和颜色距离双重加权——图像去噪里的经典问题。CUDA 负责邻域统计和滤波计算,OpenGL 负责把结果画出来,是"计算 + 渲染互操作"的完整示范。运行后窗口里会并排展示原图与滤波结果:噪点被压下去,而边缘依然锋利,这就是"保边"的直观含义:
5. 从「能跑」到「跑得快」:性能意识清单
不讲 kernel 怎么写,先建立一份检查清单,每条都能在仓库里找到对应示例:
- 【合并访存】同一 warp 的线程应访问连续全局地址,否则带宽直接打折 —
cpp/0_Introduction/vectorAdd/是标准直线访问,对照组看cpp/6_Performance/transpose/里故意用非合并访问的版本。 - 【共享内存分块】把重复读取的全局内存搬到片上 — 同一个 transpose 目录里有渐进式优化:共享内存分块、加 padding 避免 bank conflict,每一级提速都能测出来。
- 【固定开销摊薄】kernel 启动和 H2D 拷贝是固定成本,批量操作摊薄它 —
cpp/4_CUDA_Libraries/nvJPEG/的批量解码 + 双缓冲流水线就是活例子。 - 【统一内存 vs 手动拷贝】UVM 写起来爽,但缺页迁移有隐藏代价 —
cpp/0_Introduction/UnifiedMemoryStreams/和cpp/6_Performance/UnifiedMemoryPerf/直接给出两种路线的对比。 - 【计算与传输重叠】不同 stream 上同时搬数据和算 —
cpp/0_Introduction/simpleStreams/最短路径示例。 - 【精度换吞吐】fp16/tf32 在可接受误差下吞吐可观 —
cpp/0_Introduction/fp16ScalarProduct/、cpp/3_CUDA_Features/tf32TensorCoreGemm/。 - 【别拍脑袋】真正的调优要看 profiler 数据,示例只是帮你建立直觉,哪慢了就先量再说。
6. 排障速查表
| 症状 | 大概率原因 | 30 秒排查动作 |
|---|---|---|
| cmake 找不到 CUDAToolkit | 没装 Toolkit 或不被识别 | nvcc --version确认;必要时-DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc |
| 链接报 undefined reference(nvjpeg/cufft 等) | 依赖库缺失或版本不匹配 | 看该示例 README 的 Dependencies,确认 Toolkit 里对应库存在 |
| 运行报 no kernel image available | GPU 架构不在编译列表 | 跑 deviceQuery 查计算能力,对照根 CMakeLists.txt 的架构列表 |
| cudaMalloc 失败 / allocation error | 显存不足或前面积累了泄漏 | 缩小数据规模;用 compute-sanitizer 查泄漏 |
| unable to find CUDA-capable device | 驱动没装好或 GPU 不可见 | nvidia-smi一条命令定生死 |
| 示例输出 Failed | 结果校验未通过 | 默认小数据量重跑,看该示例自带的 golden 对比输出 |
7. 延伸:它旁边的生态工具
- Nsight Systems — GPU 时间线级别的 profiler,kernel 耗时、stream 重叠一目了然,真调优的第一站。
- cuda-gdb — 在 GPU 上打断点调试;构建时加
-DENABLE_CUDA_DEBUG=True即自动带-G开关。 - compute-sanitizer — 官方内存错误与竞态检测器,老一代 cuda-memcheck 的现代替代。
run_tests.py+test_args.json— 一键跑完仓库全部示例并生成通过/失败报告,换机器后先跑它给环境做个体检。Common/helper_cuda.h— 错误检查与设备选择工具函数,几乎每个示例都在用,卡住时优先读它而不是猜。
把cpp/0_Introduction/vectorAdd/的校验流程搬到你自己的数据上跑一遍,比看完十篇博客都管用。
【免费下载链接】cuda-samplesSamples for CUDA Developers which demonstrates features in CUDA Toolkit项目地址: https://gitcode.com/GitHub_Trending/cu/cuda-samples
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考