4. Adreno GPU架构详解

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 则是实现这一流程的关键。

核心设计理念: 通过 GMEM 将频繁访问的颜色、深度、模板数据保持在片内,减少对外部 DDR 的读写,从而在移动功耗预算内实现高性能。
Adreno GPU 顶层架构与数据流 Adreno GPU 核心模块与数据流 命令处理器 (CP) Shader Processor (SP) 核心计算 Texture Processor (TP) 纹理采样 Render Backend (RB) 光栅化/输出 GMEM 片上缓存 (Color/Depth/Stencil) 命令流 纹理请求 片元数据 写入 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 的指令数。同时,监控 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)与带宽消耗
常见陷阱: 在驱动开发中,如果纹理格式与 TP 硬件单元不匹配(例如使用未对齐的 stride),会导致 TP 进入降级模式(fallback path),性能急剧下降。务必确保纹理布局符合 Adreno 的硬件对齐要求(通常为 64 字节对齐)。

4.4 Render Backend (RB) 单元

RB 是渲染管线的末端,负责光栅化操作、深度/模板测试、Alpha 测试以及颜色混合。它直接与 GMEM 交互,将最终像素数据写入 Tile 中。

4.4.1 RB 核心职责

  1. 光栅化: 将图元(三角形)转换为片元(Fragment),生成采样点位置。
  2. Early-Z 测试: 在像素着色器执行前进行深度测试,剔除被遮挡的片元,减少 SP 负载。
  3. 深度/模板更新: 根据测试结果更新 GMEM 中的深度和模板值。
  4. 颜色混合: 执行 Alpha 混合、逻辑操作(ROP),并将最终颜色写入 GMEM。
Render Backend 内部流水线 RB 内部处理流水线 图元设置 (Setup) 光栅化 (Rasterize) Early-Z (深度测试) 混合/ROP (Blend) Early-Z 失败后直接丢弃片元,不进入后续混合阶段,节省带宽

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 性能调优中最有效的技巧之一。
GMEM 生命周期与 Tile 渲染流程 GMEM 生命周期:Tile 渲染流程 系统内存 (DDR) 帧缓冲 深度缓冲 纹理数据 GMEM (片上 SRAM) Color Tile Depth Tile Stencil Tile 渲染核心 (SP/TP/RB) 执行着色器 深度/模板测试 颜色混合 Load Render Resolve 优化目标:减少 Load 和 Resolve 次数,最大化 Render 阶段在 GMEM 内部的处理比例

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 与系统内存之间的数据传输量,是衡量驱动优化是否到位的关键。
工具推荐: 使用 Qualcomm 的 Snapdragon Profiler 或 Adreno GPU Profiler 可以实时捕获上述计数器,帮助定位是 SP 计算瓶颈、TP 纹理瓶颈还是 RB/GMEM 带宽瓶颈。