1. 如何判断 CPU 或 GPU 瓶颈
核心思路:对比 CPU frame time 和 GPU frame time。
GPU frame time > CPU frame time:更可能是 GPU 瓶颈。
CPU frame time > GPU frame time:更可能是 CPU 瓶颈。
2. RenderDoc 和 NVIDIA Nsight 的区别
- RenderDoc:图形调试器,回答“渲染了什么 / 哪一步出了问题”。
- Nsight:硬件性能分析器,回答“GPU 硬件在做什么 / 卡在哪里”。
2.1 什么时候只用 RenderDoc 就够了
- 排查渲染 Bug(画面错误、资源绑定问题)。
- 性能问题只需要 Pass 级别粗定位(哪个 Pass 明显异常)。
- 在非 NVIDIA 平台上(Nsight 不可用)。
- 项目早期快速验证渲染流程正确性。
2.2 什么时候必须上 Nsight
- RenderDoc 只能告诉你“这个 Pass 慢”,但不知道“为什么慢”。
- 需要做 Shader 精细优化,要有硬件计数器数据支撑。
- 写 Compute Shader 时,需要分析 occupancy / warp 利用率。
- 需要给优化结果做量化报告(例如 ALU 利用率从 X 变化到 Y)。
2.3 典型排查流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 发现帧率低 ↓ [RenderDoc] 粗定位 -> 看 Pass 耗时分布 -> 发现 GBuffer Pass 耗时 12ms,异常 ↓ [Nsight] 细定位 -> 对 GBuffer Pass 做 GPU Trace -> 发现 L2 Cache Hit Rate 只有 38% -> 判断为 Memory Bound(纹理采样瓶颈) -> Source View 定位到具体采样代码行 ↓ 针对性优化(减少采样次数 / Channel Packing / 压缩格式) ↓ 对比优化前后数据,验证收益
|
3. GPU 常见性能瓶颈指标
3.1 ALU Bound(计算量过大)
- 移动端优先考虑
mediump。
- 用近似函数替代昂贵精确计算。
- 能在顶点着色器做的计算,尽量不要放到像素着色器。
3.2 Memory Bound(纹理采样 / 带宽不足)
- 减少不必要的纹理采样次数。
- 使用更合适的纹理格式和压缩方式。
- 合理使用 Mipmap / 各向异性等级,降低带宽压力。
3.3 Occupancy Bound(并发度不足)
寄存器或共享内存压力过大,会导致 warp 并发度偏低。
1
| Occupancy = 实际同时活跃的 Warp 数量 / SM 理论可容纳的最大 Warp 数
|
3.4 Divergence(分支发散)
- 同一 warp 内分支路径不一致,会降低执行效率。
1 2 3 4
| 常见瓶颈分类: - Memory Bound:纹理采样/带宽不足 - Occupancy Bound:寄存器/共享内存压力导致并发度低 - Divergence:分支导致 warp 利用率下降
|
4. GPU 显存和带宽的区别
- 显存:占用了多少数据(容量问题)。
- 带宽:每秒能传输多少数据(吞吐问题)。
5. GPU 内存空间(从快到慢)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| GPU 内存空间(快 -> 慢) | |- [片上,SM 内部,最快] | |- Register File(寄存器) | | - 延迟:约 1 cycle | | - 大小:每 SM 约 256KB | | - 存放:Shader 局部变量、临时计算值 | | - 归属:线程私有 | | | |- Shared Memory(共享内存) | | - 延迟:约 1~2 cycles | | - 大小:每 SM 约 48~100KB(上限受架构限制) | | - 存放:`groupshared` 声明的数据 | | - 归属:线程组共享 | | | `- L1 Cache / Texture Cache | - 延迟:约 30 cycles | - 大小:每 SM 约 32~128KB | - 存放:纹理与全局内存热点数据 | - 管理:硬件自动管理 | |- [片上,所有 SM 共享] | `- L2 Cache | - 延迟:约 200 cycles | - 大小:整个 GPU 约 4~80MB | - 存放:L1 Miss 后的数据 | - 管理:硬件自动管理 | `- [片外,最慢] `- VRAM(显存) - 延迟:约 600 cycles - 大小:8GB / 10GB / 24GB ... - 存放:纹理、RT、Buffer、Mesh 等资源 - 带宽:约 760GB/s ~ 1000GB/s(很高但仍可能成为瓶颈)
|
6. GPU 计算单元(以 Ampere 为例)
1 2 3 4 5 6
| 一个 SM 内: - CUDA Cores(FP32): 128 <- 普通 Shader 运算 - INT32 Cores : 64 <- 整数运算,可与 FP32 并行 - Tensor Cores : 4 <- 矩阵运算,AI / DLSS - RT Cores : 1 <- 光线求交,DXR 光追 - SFU : 若干 <- sin/cos/sqrt 等超越函数
|