GPU 高性能计算
目录
计算的硬件加速思路
思路1: 缩短指令的执行时间
思路2: 提升单位时间内指令的吞吐量
对于cpu scalar 实现
CPU 使用 SIMD 实现 CPU 的向量化加速:
Cuda SPMD
并行策略
指令并行 ILP (Instuction Level Parallel)
CPU 指令并行示例
GPU 指令并行示例
多核并行 Multiple core parallelism
CPU 多核并行示例
GPU 多核并行示例
Multi-threaded parallelism
GPU 编程模型
GPU执行模型
GPU 内存模型
GPU 计算:Cuda Core VS Tensor Core
Cuda 编译原理
CUDA NVCC 工作原理及 Host/Device 编译器机制详解
NVCC 的编译流程 (Compilation Trajectory)
第三步:Host 编译 (CPU 侧)
第四步:胖二进制合并 (Fatbinary Embedding)
第五步:链接 (Linking)
Roofline Model —— 性能优化方向的理论指导
核心公式:性能的物理边界
关键概念:算术强度 (Operational Intensity)
图像解读:斜率与平台
实践分析
硬件参数获取(以 RTX 4000 Ada 为例)
实战案例分析
Roofline model的局限性
内存访问密集型高性能计算
GPU 的内存层次结构 (Memory Hierarchy)
L1 缓存的特殊之处
各级存储访问延迟的直观感受
内存访问合并
Bank conflict
优化技巧
内存访问密集型高性能实战
Naive 实现
共享内存优化(Shared Memory)
分析与对比
高级 cuda 特性 —— 从矩阵乘法(gemm)说起
使用Roofline Model对矩阵乘法进行性能分析。
情况 A:无缓存/无复用的实现 (Naive)
情况 B:理想状态/完全复用 (Ideal Cache)
从 Memory-bound 到 Compute-bound 的转变
显性的矩阵乘法性能分析
基本数据
理论极限分析
缓存缺失与带宽约束分析
综合对比总结
矩阵乘法中的分块与数据复用
Shared Memory Tiling (块级复用)
Register Tiling (线程级复用)
利特尔法则与占用率控制
利特尔法则 (Little’s Law):
占用率 (Occupancy) 的计算
人工控制占用率
总结
调度优化
隐藏访存延迟(Hiding Latency)
重叠计算与搬运(Overlapping Data Movement & Computation)
Tensor Cores
什么是 Tensor Core?
TF32 (TensorFloat-32) 精度
关键指令详解:
mma.sync
寄存器布局(Register Layout)—— 最难点
wgmma
:warp-group level tensor core instructions
GPU 上动态的调度 —— 从run-length-compression说起
并行扫描问题
Warp scan
Block scan
grid 级 scan:递归扫描 block sums
整体scan 流程
workspace size
Run length compression
Run length decompression
Cuda TMA (Tensor Memory Accelerator)
基础介绍
Tensor descriptor:
CUtensorMap
TMA 完成异步数据搬运
单 block、单 lane、单 tile 的 TMA load
TMA store
TMA reduce,把“搬运”和“归约”合并
TMA 中使用 swizzling pattern
TPU 与分布式通信原语
TPU 的硬件模型
TPU Pallas
TPU RDMA
reduce-scatter 与 all-gather
collective matmul:通信与计算重叠
为什么需要通信与计算重叠
TIRx 基础
为什么是 TIRx
从一个最小 GEMM 开始,TIRx 在做什么
理解 TIRx,关键是看三个决定
Layout API
Named Axes:Layout 不一定产生线性地址
Swizzle 单独建模
TIRx 真正重要的地方,不在于语法
TIRx 与高性能GEMM (上)
从 GEMM 公式到数据路径
Step 1:单 tile GEMM,先把完整路径跑通
Step 2:加入 K-loop,真正的难点是 barrier phase
Step 3:空间 tiling,把单 CTA 扩展成二维 grid
Step 4:TMA 完成 GMEM 到 SMEM 的异步数据搬运
Step 5:多 stage pipeline 实现计算和数据搬运的重叠
Step 6:Persistent kernel 让 CTA 持续领取 tile
TIRx 与高性能GEMM (下)
step7: warp specialization 和流水线化
Step 8:两个 CTA 组成 cluster,扩大片上复用半径
Step 9:增加第二个 MMA consumer,让 B tile 被更多次使用
性能对比
总结
Flash Attention 4:在 Blackwell 上把 Softmax 接进 Tensor Core 流水线
Attention 的真实瓶颈:不是公式,而是中间矩阵
在线 Softmax 与 Conditional Rescaling
一个 K/V Block 的数据流
Warpgroup 分工:四个 WG 各管一段依赖链
Softmax、Correction 与 Barrier 的交接
Conditional Rescaling 为什么有效
Causal Attention 与 GQA:同一条数据路径上的两个特化
调度策略:non-causal 和 causal 的任务形状不同
当前实现与论文描述的差异
编译与验证约束
总结
Triton 高性能编程
Vector Add:从一个向量加法 kernel 看懂编程模型
Compute Kernel:一个 program 处理一个连续 block
为什么 mask 是必需的
Launch Wrapper:Python 张量如何进入 GPU kernel
Scope / Layout / Dispatch:用三个问题读这段代码
Benchmark
小结
Fused Softmax:看懂 Triton 的算子融合
Softmax 的数学式与内存流量
Compute Kernel:一个 program 处理若干行
Power-of-two padding:为什么尾部要填负无穷
Wrapper:从 shape 推导 launch 数量
Scope / Layout / Dispatch:和 Vector Add 相比发生了什么
Benchmark:用 GB/s 衡量融合后的内存效率
小结
Triton Matrix Multiplication:从 block 映射到 L2 友好的 GEMM
为什么要自己写 matmul
把 GEMM 拆成 program 级 tile
Pointer Arithmetic:二维坐标如何变成一组地址
Program ID 到输出 tile 的映射
L2 cache reuse:为什么 grouped ordering 能提速
Kernel 主体:load、dot、accumulate、store
Autotune:把 tile shape 变成可搜索参数
Wrapper、正确性和 FP8 特化
Benchmark:结果应该怎样读
Scope / Layout / Dispatch 总结
参考
GPU 高性能计算
Search
Please activate JavaScript to enable the search functionality.