
7 月 21 日,2026 夏季 InfiniTensor 训练营 CUDA 编程方向第二课《性能模型与逐元素优化》开讲。
前置课程《并行编程导论与 CUDA 入门》详细讲解了 CUDA 编程基础、线程层级结构与向量加法示例。但也发现了一个残酷的现实:数据传输耗时远超计算本身。
本节课我们将深入剖析性能瓶颈的根源,掌握量化分析工具,并通过“向量化”这一核心优化手段,带你突破内存墙限制,实现性能的提升。
温故知新:从现象到本质
- 上节回顾:

性能痛点:为何 GPU 满载时,H2D/D2H 传输耗时仍远大于 Kernel 计算?
核心矛盾:CPU-GPU 通信带宽 vs GPU 内部算力,谁是真正的瓶颈?
内存墙与 Roofline 模型
理解“内存墙” (Memory Wall)

- 摩尔定律的失衡:处理器性能增速 vs 内存带宽增速的巨大 Gap
- 冯·诺依曼架构局限:存储与计算分离导致的频繁数据搬运
- 通信:PCIe/NVLink 带宽增长滞后于算力增长
Roofline 模型详解

核心坐标:计算强度 (Operational Intensity, FLOPS/Byte) vs 性能 (FLOPS)
两大区域:
- 🔴 Memory Bound(访存密集型):受限于内存带宽 (β × I)
- 🟢 Compute Bound(计算密集型):受限于峰值算力 (π)

关键拐点 (Ridge Point):达到硬件理论最高性能所需的最低计算强度 ($I_{max} = pi / eta$)
实战分析:以 A100 为例,量化分析 FP32 向量加法为何是典型的访存密集型任务

Nsight Compute (NCU)

- 工具定位:区别于 Nsight Systems,NCU 专注于 Kernel 级微观性能分析
- 核心功能:
- Summary 页:快速查看吞吐率与运行时间
- Details 页:GPU Speed of Light Throughput 与 Roofline 图表自动生成
- 实测验证:通过 NCU 确认向量加法的内存利用率高达 70%,验证访存瓶颈假设

向量化访存 (Vectorization)
什么是向量化?

- SIMD vs SIMT:单指令多数据流与单指令多线程的协同而非冲突
- 核心思想:单次指令读写多个标量数据,提升内存带宽利用率

CUDA 内置向量类型实战

- 数据类型:
float2、float4等内置向量化访存类型 - 代码重构:使用模板函数 +
__device__封装通用加法逻辑

- 性能实测:
float4相比float性能显著提升,内存利用率逼近 90%


避坑:向量化的边界
- 并非越大越好:为何
Vec8反而比Vec4慢?(寄存器溢出 Register Spilling)


float3为何比float慢?:- 内存对齐 (Memory Alignment):非 2 的幂次导致无法对齐内存事务边界

- 内存合并 (Memory Coalescing):Warp 内连续访问 + 对齐 = 高效合并



进阶优化:半精度计算与 SIMD 指令

半精度(half)

降低访存压力:FP16 (
half) 数据类型原理与优势半精度并行加法示例:

- 头文件与类型转换 (
__float2half,__half2float) - 舍入模式解析 (RD/RU/RN/RZ)

向量化计算:使用
__hadd2实现真正的 SIMD 半精度加法Roofline 再分析:FP16 如何同时实现“右移”(提高计算强度)与“上移”(利用 Tensor Core 提升天花板)
❓️课后思考题:
- 若必须使用
float3结构,如何优化其内存访问性能? - 除内置向量类型外,还有哪些方式可实现向量化访存?(提示:与思考题1相关)
加入训练营
📺完整课程内容,请观看直播或查看课程回放:
InfiniTensor 官网: https://www.infinitensor.com
B站直播: InfiniTensor 官方直播间
视频号直播: InfiniTensor 视频号预约
答疑交流: 训练营官方社群⬇️

关注与交流

