学习资料
InfiniTensor 冬季训练营 CUDA 编程第四课《分块与不规则访存》
发表于:

2026 年 1 月 22 日,2025 冬季 InfiniTensor 大模型与人工智能系统训练营 CUDA 编程系列第四课《分块与不规则访存》开讲。

矩阵乘法(GEMM)基础

  1. 矩阵乘法实现方式
  2. 矩阵乘法计算复杂度分析:
    O(n³) 计算 vs O(n²) 访存
  3. 行优先(Row Major)与列优先(Column Major)存储格式
  4. GEMM 通用矩阵乘法规范(转置选项、缩放因子Alpha/Beta)

基础矩阵乘法实现与性能分析

  1. 简单矩阵乘法 Kernel 实现
  2. 内存合并访问的重要性
  3. NCU 性能分析工具使用
  4. Roofline 模型分析计算密集型特征

共享内存优化技术

  1. 数据复用与共享内存缓存
  2. 分块(Tiling)技术原理

  1. Tile 大小选择策略(32 的合理性)
  2. 同步机制保证数据完整性

分级分块优化策略

  1. 1D Block Tiling优化原理

把单纯使用共享内存(SMEM Caching)进阶到一维分块(1D Blocktiling)后的性能变化作对比,主要包含以下关键发现:

  • 性能提升指标:通过 Nsight Compute (NCU) 的 Profiling 结果可以看出,采用 1D Blocktiling 后,L1 缓存的命中率(Hit Rate)增加
  • 带宽利用优化:缓存命中率的提升直接带动了内存带宽有效利用率的增加,从而提升了整体计算吞吐量。
  • 进一步优化的思考:图片底部提出了从 1D 向 2D 演进的核心问题 —— 既然在列方向(Column)进行拓展(1D)能带来收益,那么是否可以继续在行方向(Row)进行拓展?这也引出了后续 2D Block Tiling 的优化思路。

  1. 2D Block Tiling实现方法
    访存数量优化分析(9次→5次/entry)

下图详细对比了 SMEM Caching2D Block Tiling 在访存效率上的显著差异,直观展示了二维分块如何通过增加寄存器层面的数据复用来降低全局内存访问压力:

  • SMEM Caching 模式:在仅使用共享内存缓存的情况下,计算每个结果元素(Entry)平均需要 9 次 Load 操作(源于对 A 和 B 的重复读取以及 C 的读写)。
  • 2D Block Tiling 模式:通过在寄存器层面引入二维分块(如图中 Tile A 和 Tile B 的配合,一次计算 Tile C 中的多个元素),数据复用率大幅提升。图示表明,该策略将计算每个 Entry 的平均访存开销显著降低至 5 次 Load 操作
  • 核心收益:这种策略的核心在于“分摊开销”。通过一次性加载 A 的一小块和 B 的一小块到寄存器,并计算出 C 的对应子块(如 $2 imes2$),使得加载到寄存器的数据能在多次计算指令中被重复使用,从而突破了带宽瓶颈。

  1. Bank Conflict 在矩阵乘法中的出现与解决
    Swizzling 技术

高级优化技术

  1. 向量化访存优化
  2. WarpTiling 技术
  3. 与 cuBLAS 性能对比(达到 82.6%)
  4. 不同矩阵尺寸下的性能变化

不规则访存与高级主题

  1. Z-order Curve(Morton码)原理
  2. 空间局部性保证技术
  3. 线性包围体层次(LBVH)算法

  1. 光线追踪中的空间数据结构
  2. 不规则访存优化策略
  3. 动态并行(CUDA Dynamic Parallelism)概念与应用场景

总结

本节课主要讲解了 CUDA 矩阵乘法(GEMM)的优化技术,从基础实现逐步深入到高级优化方法,下节课将讲解进阶的时空优化技术和系统级优化方法。

2025冬季训练营课程表

💡 学习贴士

更多细节及完整课程内容,请观看直播或查看课程回放。

链接:https://www.infinitensor.com/camp/winter2025

📚 训练营报名持续进行中

扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名