第3章:经典算子实现—Reduce

本章简介

Reduce(归约)是最经典的并行算法之一,也是学习 CUDA 优化的最佳入门案例。本章通过 8 个递进版本(V0→V7),体验”分析瓶颈 → 针对优化 → 量化收益”的完整优化循环,带宽利用率从 15% 提升至 85%。

1. Reduce 算子基础 介绍并行规约的概念、性能瓶颈分析(Memory-Bound 特性),以及测试环境说明。

2. 版本 V0:朴素并行规约 最直观的树形规约实现,分析 tid % (2*step) == 0 导致的 Warp Divergence 问题。

3. 版本 V1:消除 Warp Divergence 使用 strided index 重新映射活跃线程,让完整 Warp 进入/跳过分支,大幅减少分化。

4. 版本 V2:解决 Bank Conflict 反转步长方向(从 blockDim/2 逐步减半),一次性解决 Bank Conflict 和 Warp Divergence 两类问题。

5. 版本 V3:解决idle线程 每个线程在加载阶段处理 2 个元素,Block 数量减半,提升线程利用率。

6. 版本 V4:展开最后一个 Warp 当活跃线程不超过 32 个时,Warp 内无需 __syncthreads(),手动展开循环省去同步开销。

7. 版本 V5:完全循环展开 使用 template <int BLOCK_SIZE> 模板参数,让编译器在编译期消除所有循环和死分支,生成紧凑的直线代码。

8. 版本 V6:Warp Shuffle 替代 Shared Memory__shfl_down_sync 实现 Warp 内寄存器直通通信,配合两级规约(Warp 内 + Warp 间)完成 Block 级 Reduce。

9. 版本 V7:向量化加载 + Grid Stride Loop 使用 float4 向量化加载减少指令数,固定 Grid 大小配合 Grid Stride Loop 最大化 GPU 占用率,达到 ~85% 带宽利用率。