本目录基于 Professional C programming 和 https://docs.nvidia.com/cuda/cuda-c-programming-guide/contents.html v12.9 整理。旨在提供一个系统的入门和实践指南,并且会注意一些编程特性的更新。本系列会尽量表明所有内容的参考和出处,尽量保证信息来源可信且有时效性。

总体来说推荐的资源是:

  • 推荐查阅与跟进——官方文档:注意 CUDA 和 GPU 架构一直在不断进展,需要跟进 官方编程指南 NVIDIA CUDA C++ Programming 以同步最新编程范式和方法。官方文档是一个详尽的编程指南,但是没有给出具体的指导方法或者构建整个体系,没有把各个用法的关联组织起来。
  • 强烈推荐入门与系统——Professional C programming:一个详尽的入门指导书,有助于掌握核心的概念和编程模型,需要注意一些特性和工具链的更新,与官方更新的文档相互对照。
  • 视频课程推荐——Programming Massively Parallel Processors A Hands-on Approach 及 CMPS224 课程。
  • 在有了一定上面的基础变成后,推荐性能分析——C++ best Practice, NCU profiling guide,以及深入了解 CUDA toolkit 或 PTX/SASS。
  • 强烈推荐——性能优化和 tensor core 英文博客,见 cutlass与GEMM
  • 选择看其他书籍或者个人博客,注意有一些旧的资料可能会有一些过时的内容,要和官方文档同步。不推荐看照搬英文文章的中文博客。

推荐资源

https://people.maths.ox.ac.uk/gilesm/cuda/index.html

NVIDIA CUDA Tutorial 1: Introduction

其他参考

https://christianjmills.com/series/notes/cuda-mode-notes.html

https://shichaoxin.com/tags/

chen tianqi:DLSYS https://dlsys.cs.washington.edu/

Preofessional CUDA® C Programming

https://github.com/mapengfei-nwpu/ProfessionalCUDACProgramming

参考博客:https://jinbridge.dev/docs/hpc/cuda-programming-101/

CUDA C Programming Guide 解读:https://zhuanlan.zhihu.com/p/53773183

  • 书籍
    • 《CUDA C 编程权威指南》Professional CUDA C Programming:全面介绍 CUDA 编程模型与优化技巧。
    • 《GPU 高性能编程 CUDA 实战》:通过案例学习 CUDA 并行编程。《CUDA by Example》(CUDA 编程入门经典)
    • 《高性能 CUDA 应用设计与开发》(深入优化)
  • 在线课程

HPC 方向主要需要了解 HPC SDK 等较上层的模块,如何使用。涉及运维、功耗控制等方面时,也会涉及驱动中的 NVML 等模块。下面挑选常用的模块作一些介绍:

  • HPC SDK:其实就是把 HPC 常用的子模块打包到了一起。
    • 分析部分包括 Profiles(Nsight)和 Debugger(cuda-gdb)。
  • Nsight:有几个子产品:
    • System:综合分析 CPU、GPU 的性能
    • Compute:kernel profiler,专门调试核函数
    • Graphics:调试、分析 Windows 和 Linux 平台图形应用的性能
  • NVTX (Tools Extension Library):C 语言 API,提供 C++ 和 Python 接口。Nsight 等性能分析工具通过该 API 进行测量。我们也可以在程序中使用该 API 进行事件记录等。和 MPI 的 PMPI 有些类似。
  • CUPTI (Profiling Tools Interface):和上面那个功能类似,允许各种测量和性能检测的 API。
  • NVML (NVIDIA Management Library):C 语言 API,监控和管理 NVIDIA GPU 设备。API 分为五个模块:初始化和清理、查询、控制、事件处理、错误报告。库文件 libnvidia-ml.so,链接参数 -lnvidia-ml
  • NCCL (NVIDIA Collective Communications Library):C 语言 API,MPI 的替代品。提供多 GPU、多节点通信原语。适用硬件:NVLink、Mellanox Network。

在一切开始之前——安装

个人环境:

  • win11 下安装 wsl2+archlinux 系统,windows 下装有驱动。
  • linux 下安装 cuda-tools,包含 ncu,完成后可在 windows 下启动图形界面,arch 下通过 yay 安装。
    • ERROR ERR_NVGPUCTRPERM - The user does not have permission to access NVIDIA GPU Performance Counters on the target device 0. For instructions on enabling permissions and to get more information see https://developer.nvidia.com/ERR_NVGPUCTRPERM
    • To allow access for any user, create a file with the .conf extension containing options nvidia NVreg_RestrictProfilingToAdminUsers=0 in /etc/modprobe.d.
    • 开启 windows 下控制面板性能分析权限,支持 ncu profile。
  • 硬件与驱动:NVIDIA GeForce RTX 4060 | NVIDIA-SMI 580.82.09 Driver Version: 581.29 CUDA Version: 13.0 |
  • vscode ssh 远程连接与调试

CUDA 核心知识提纲

CUDA 编程的核心知识体系可分为基础语法并行策略内存优化高级技术四个递进层次。

CUDA 编程核心

  1. 硬件模型
    • GPU 架构层次:SM(流式多处理器)、CUDA Core、Tensor Core
    • 内存层次:寄存器、共享内存、全局内存、常量内存、纹理内存
    • 线程调度:Warp(32 线程)、调度器、指令发射单元
  2. 编程模型
    • 主机 - 设备分离:CPU(主机)控制,GPU(设备)执行计算
    • Kernel 函数:用 __global__ 修饰,并行执行的函数
    • 线程组织:网格(Grid)→ 线程块(Block)→ 线程(Thread)
    • 线程索引计算:blockIdxthreadIdxblockDim
  3. 内存管理
    • 内存分配:cudaMalloccudaFree
    • 数据传输:cudaMemcpy(同步)、cudaMemcpyAsync(异步)
    • 统一内存(Unified Memory):cudaMallocManaged,自动内存迁移
  4. 线程同步
    • 块内同步:__syncthreads(),确保所有线程执行到该点再继续
    • 原子操作:atomicAddatomicCAS,实现线程安全的内存操作
  5. CUDA 流(Stream)
    • 异步执行:任务在流中排队,支持计算与数据传输重叠
    • 流同步:cudaStreamSynchronize、事件(cudaEvent

性能优化核心

高级实践方法总结

  1. 内存优化
    • 全局内存合并访问:确保 Warp 内线程连续访问内存
    • 共享内存 tiling:减少全局内存访问(如矩阵乘分块)
    • 内存带宽利用率计算:实际带宽 / 理论峰值带宽
    • 优化内存带宽:合并访问、对齐数据合并访问:相邻线程访问连续内存地址
    • 内存对齐:数据大小为 4/8/16 字节倍数
    • 减少全局内存访问:尽量在寄存器和共享内存中计算
    • 减少全局内存访问:每 100 次计算对应 1 次内存访问
  2. 计算优化
    • Tensor Core 利用:使用 wmma 库实现高效矩阵乘(FP16/BF16/INT8)
    • 向量化编程:用 float4 等类型提高内存访问效率
    • 指令级并行:减少分支发散,提高 Warp 执行效率
    • 最大化并行度:充分利用 SM 资源
    • 避免线程发散:减少 warp 内分支差异
  3. 资源利用率
    • 线程块调度:调整块大小以最大化 SM 占用率(Occupancy)
    • 寄存器压力:通过 nvcc --ptxas-options=-v 查看寄存器使用

调试与性能分析

  1. 基准测试:用 nvprof 确定热点函数
  2. 分析瓶颈
    • 计算瓶颈:低占有率(Occupancy)
    • 内存瓶颈:低内存带宽利用率
  3. 针对性优化
    • 计算密集型:增加并行度、展开循环
    • 内存密集型:优化内存访问模式、使用共享内存
  4. 调试工具
    • CUDA-GDB:GPU 内核调试
    • Nsight Compute:详细分析内核性能指标
    • Nsight Systems:系统级性能追踪
  5. 关键性能指标
    • 计算指标:SM 利用率、Tensor Core 利用率
    • 内存指标:全局内存带宽、共享内存 Bank 冲突
    • 指令指标:分支发散率、寄存器压力

相关生态系统

一、基础计算与核心库(CUDA 生态基础)

  1. CUDA Runtime API:CUDA 的核心运行时接口,提供设备初始化、内存管理(如 cudaMalloc)、核函数启动等基础操作,是 CUDA 编程的入口。
  2. CUDA Driver API:比 Runtime 更底层的驱动接口,需显式加载 CUDA 驱动,支持动态版本适配,常用于需要细粒度控制驱动交互的场景。
  3. NVRTC:CUDA 运行时编译库,可在程序运行时动态编译 CUDA 核函数,支持动态生成计算逻辑(如根据输入动态调整算子)。
  4. CUDA Math Library (cuMath):CUDA 内置的数学函数库,包含基础算术、三角函数、指数函数等,已针对 GPU 架构优化。

二、线性代数与矩阵计算

  1. cuBLAS:NVIDIA 优化的线性代数库,支持 dense 矩阵的乘法(GEMM)、向量 - 矩阵运算等,是深度学习和科学计算的基础依赖(如 PyTorch/TensorFlow 底层调用)。
  2. cuSPARSE:稀疏矩阵计算库,支持稀疏矩阵存储(如 CSR、COO 格式)及稀疏 - 稠密矩阵乘法、稀疏线性方程组求解,适用于高稀疏数据场景(如推荐系统)。
  3. cuSOLVER:线性代数求解库,基于 cuBLAS 和 cuSPARSE,支持矩阵分解(LU、Cholesky)、特征值求解、最小二乘问题等,面向科学计算和工程仿真。
  4. cuTENSOR:张量计算库,支持高维张量(如 3D/4D)的收缩、点积、广播等操作,优化了张量内存布局和并行访问,适配深度学习中的张量运算。

三、深度学习专用库

  1. cuDNN(CUDA Deep Neural Network library):深度学习核心加速库,针对卷积(Conv)、池化(Pooling)、激活函数(如 ReLU)、LSTM 等算子做了极致优化,是 PyTorch/TensorFlow 的必选依赖。
  2. TensorRT:深度学习推理优化库,通过模型量化(INT8/FP16)、层融合、内核自动调优等方式加速推理,支持 C++/Python 接口,常用于生产环境部署。
  3. cuML:GPU 加速的机器学习库,提供分类(如随机森林)、回归、聚类等算法,兼容 scikit-learn 接口,适合大规模数据集训练。
  4. cuGraph:GPU 加速的图计算库,支持图遍历(BFS/DFS)、社区发现、图神经网络(GNN)算子等,适配社交网络、推荐系统等图数据场景。

四、并行算法与数据结构

  1. Thrust:基于 CUDA 的并行算法库,接口类似 C++ STL,提供排序(sort)、扫描(prefix_sum)、归约(reduce)等算法,自动优化并行粒度,降低并行编程门槛。
  2. CUB(CUDA Unbound):更底层的并行原语库,包含线程级 / 块级协作的内存访问、数据重组等工具,供开发者手动优化高性能算子(如 cuDNN 内部使用)。
  3. Moderngpu:开源并行算法库,专注于高吞吐量的内存密集型操作(如散列、稀疏数据处理),提供可复用的并行模式。

五、信号与图像处理

  1. cuFFT(CUDA Fast Fourier Transform):GPU 加速的快速傅里叶变换库,支持 1D/2D/3D FFT 及逆变换,性能远超 CPU 实现,用于雷达信号处理、图像滤波等。
  2. NPP(NVIDIA Performance Primitives):图像处理与信号处理算子库,提供像素级操作(如 resize、滤波)、视频编解码辅助、直方图计算等,适用于实时视觉系统。
  3. cuCVD(CUDA Computer Vision Data Structures):计算机视觉基础库,提供图像金字塔、特征点匹配等底层数据结构和算子,常与 NPP 配合使用。

六、科学计算与工程仿真

  1. cuRAND:GPU 加速的随机数生成库,支持均匀分布、正态分布等多种随机数类型,性能和随机性优于 CPU 实现,用于蒙特卡洛模拟、深度学习初始化等。
  2. cuSparseX:cuSPARSE 的扩展,支持更复杂的稀疏矩阵格式(如块稀疏)和高阶运算,面向大规模科学计算(如有限元分析)。
  3. MAGMA(Matrix Algebra on GPU and Multicore Architectures):混合 CPU-GPU 的线性代数库,自动分配 CPU/GPU 计算任务,兼容 LAPACK 接口,适合异构计算场景。