4. Adreno GPU 架构详解:SP、TP、RB 与 GMEM 管理
Adreno GPU 是 Qualcomm SoC 中的核心图形处理单元,其架构设计围绕移动端低功耗、高吞吐量的需求展开。在 SA8155 平台上,Adreno 650 GPU 采用了分块渲染(Tile-Based Rendering, TBR)架构,核心计算单元包括 Shader Processor (SP)、Texture Processor (TP)、Render Backend (RB),以及关键的片上缓存 GMEM (GMEM)。理解这四个模块的协同工作是驱动开发和性能调优的基础。
4.1 整体架构概览
Adreno GPU 的渲染管线并非传统的立即模式(Immediate Mode),而是将帧缓冲划分为多个小块(Tile),逐块渲染后再写回系统内存。这种设计极大降低了对系统内存带宽的需求,而 GMEM 则是实现这一流程的关键。
4.2 Shader Processor (SP) 单元
SP 是 GPU 中执行可编程着色器指令的核心计算单元。在 Adreno 650 中,多个 SP 组成一个计算集群,负责处理顶点着色、细分曲面、几何着色以及像素着色等所有可编程阶段。
4.2.1 SP 微架构特性
- 统一着色器架构: 顶点和像素着色器共享 SP 中的 ALU 资源,提高利用率。
- Warp 调度: 以 64 个线程为一组(称为一个 Warp 或 Wavefront)进行 SIMD 执行。分支发散会导致 Warp 内部分线程被屏蔽,降低效率。
- 寄存器文件: 每个 SP 拥有大容量的物理寄存器文件,用于存储线程上下文。寄存器压力过大会导致上下文切换频繁,影响性能。
- 指令缓存: 一级指令缓存(I-Cache)用于缓存着色器程序指令,减少指令 fetch 延迟。
SP_BUSY 性能计数器可以判断 SP 是否成为渲染瓶颈。
4.3 Texture Processor (TP) 单元
TP 单元专门负责纹理采样和过滤操作。它从纹理内存中读取数据,执行双线性、三线性或各向异性过滤,并将结果返回给 SP。TP 的性能直接影响材质复杂的场景帧率。
4.3.1 TP 关键功能
| 功能模块 | 描述 | 性能关注点 |
|---|---|---|
| 纹理采样器 | 配置寻址模式(wrap/clamp)、过滤模式(point/linear) | 采样器状态切换开销 |
| LOD 计算 | 自动计算 Mipmap 层级,决定采样细节 | 过度使用负 LOD bias 导致性能下降 |
| 压缩纹理解码 | 硬件支持 ASTC、ETC2、BC 系列格式 | 压缩率与解码延迟的平衡 |
| 各向异性过滤 | 改善倾斜表面的纹理模糊 | 各向异性等级(1x-16x)与带宽消耗 |
4.4 Render Backend (RB) 单元
RB 是渲染管线的末端,负责光栅化操作、深度/模板测试、Alpha 测试以及颜色混合。它直接与 GMEM 交互,将最终像素数据写入 Tile 中。
4.4.1 RB 核心职责
- 光栅化: 将图元(三角形)转换为片元(Fragment),生成采样点位置。
- Early-Z 测试: 在像素着色器执行前进行深度测试,剔除被遮挡的片元,减少 SP 负载。
- 深度/模板更新: 根据测试结果更新 GMEM 中的深度和模板值。
- 颜色混合: 执行 Alpha 混合、逻辑操作(ROP),并将最终颜色写入 GMEM。
4.5 GMEM 管理
GMEM(GMEM)是 Adreno TBR 架构的核心。它是一个高速、低延迟的片上 SRAM,用于存储当前正在渲染的 Tile 的所有颜色、深度和模板数据。驱动开发中,GMEM 的管理策略直接决定了渲染效率和带宽消耗。
4.5.1 GMEM 分区与生命周期
在渲染一个 Tile 时,GMEM 被逻辑划分为多个分区:
- Color Buffer 分区: 存储渲染目标的颜色值,支持多个渲染目标(MRT)。
- Depth/Stencil 分区: 存储深度和模板值,用于可见性测试。
- Fast Clear 机制: 驱动通过写入特定的清除值(Clear Value)来初始化 GMEM 分区,无需实际清空整个 GMEM,大幅降低带宽。
4.5.2 GMEM 与系统内存的交互
| 操作 | 方向 | 触发条件 | 性能影响 |
|---|---|---|---|
| Load | 系统内存 → GMEM | Tile 开始渲染,需要保留上一帧或之前 Pass 的数据 | 高带宽消耗,应尽量避免 |
| Render | GMEM 内部 | SP/TP/RB 在 Tile 内执行渲染操作 | 极低延迟,TBR 的优势所在 |
| Resolve | GMEM → 系统内存 | Tile 渲染完成,将最终结果写回帧缓冲 | 必要操作,但可通过压缩(Lossless Compression)减少数据量 |
| Discard | 无 | 驱动确定 GMEM 内容不再需要(如深度缓冲在后续 Pass 中不再使用) | 节省 Load 和 Resolve 带宽,关键优化手段 |
glInvalidateFramebuffer (OpenGL ES) 或 VK_ATTACHMENT_STORE_OP_DONT_CARE (Vulkan) 来标记不再需要的 GMEM 内容。这可以指示驱动跳过 Resolve 操作,甚至跳过 Load 操作,是移动 GPU 性能调优中最有效的技巧之一。
4.6 性能调优关键指标
在驱动开发和性能分析中,以下与 SP、TP、RB、GMEM 相关的计数器是核心监控对象:
- SP_BUSY / SP_LOAD: SP 单元的忙碌程度,反映着色器计算是否成为瓶颈。
- TP_BUSY / TP_TEXEL_THROUGHPUT: TP 单元的吞吐量,高纹理复杂度场景下的关键指标。
- RB_BUSY / RB_DEPTH_BUFFER_HIT: RB 的深度测试效率,Early-Z 剔除率越高,性能越好。
- GMEM_LOAD_BYTES / GMEM_RESOLVE_BYTES: 实际发生的 GMEM 与系统内存之间的数据传输量,是衡量驱动优化是否到位的关键。