AMD RDNA3 GPU架构解析

news/2025/3/5 7:51:41/

如果你对AMD的RDNA3还不了解,在profile过程中的指标无法完全理解一些指标,比如说你听过着色器性能方面指标"occupancy",听说它有助于隐藏内存 latency,但不理解其中的具体用法,那这篇文章将对你有一些帮助。本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式,深入理解GPU如何高效处理顶点着色、像素计算等任务。


一、施工公司的组织架构

1. 施工公司(WGP)与施工队(CU)

  • WGP(Work Group Processor):相当于一个大型施工公司,负责统筹管理两个施工队。
  • CU(Compute Unit):每个WGP下属的两个施工队。
  • SIMD模式:每个施工队会有两个小分队,小分队采用“批量施工”模式——比如挖土就所有点位一起挖土,倒混凝土就全部一起倒混凝土,铺钢筋就一起铺钢筋,即使有的点位提前完成了挖土,也要等其他的点位都完成才能倒混凝土(这就是Single Instruction Multiple Data (SIMD),单指令多数据架构——每个线程各自处理一个顶点或者像素,执行相同的指令,但是处理不同的数据)。

2. 施工队的两种工作模式

  • Wave32和Wave64
    基于SIMD模式,施工小分队的工作要么32点位一组一起干,或者64点位为一组一起干(wave32/wave64,即32线程一组或者64线程一组)。也就是wave32和wave64。

    • Wave32模式:32个点位(线程)为一组,适合复杂任务(如分支判断多的场景)。
    • Wave64模式:64个点位为一组,适合简单重复任务(如大规模矩阵计算)。
  • wavefront

    • 如果施工小分队只有一个任务,那当这个任务中发生等待材料送达、等待水泥这些情况的时候,就会浪费时间。所以施工队会做多个 任务。
    • 每个施工队会做多少个任务要看资源的情况。
    • 每个施工队最多做16个任务。
    • 同一时刻一个施工小分队只能执行一个任务。
    • 任务不必按顺序执行,也不需要连续地执行完一个任务中的所有步骤。
  • 任务相当于RDNA3的wavefront 的概念,wavefront 类似于 NVIDIA 的 warp,都是调度和执行的基本单位。每个 wavefront 包含多个线程,通常是32个。这些线程在同一个指令下同步执行,换句话说,同一个 wavefront 中的线程会执行相同的指令,但处理不同的数据。
  • 一个着色器在SIMD上运行所需的资源量是在编译时评估好的,一般来说,资源指的是:VGPR(Vector General Purpose Registers,向量通用寄存器)、SGPR(Scalar General Purpose Registers,标量通用寄存器)和称为LDS(Local Data Share,本地数据共享)的“groupshared”内存
  • RDNA 3则每个SIMD有16个slot
  • 一个SIMD上一次只能执行一个wavefront
  • 分配的这些wavefront不必按顺序执行,也不需要连续地执行完一个wavefront的所有指令)

二、任务分配的核心逻辑

1. 自动组队:隐式并行化

  • 顶点/像素处理:当GPU需要顶点或800万像素,比如说绘制三角形,那么顶点着色器处理3个顶点;如果渲染4K画面,那么片段着色器需要处理830万像素。不管是3个顶点还是830万像素,硬件都会自动将它们打包:
    • 每凑满32或64个点位,就分配给一个小分队。
    • 程序员无需手动分组,完全由硬件和驱动自动完成。
  • 计算着色器例外:compute shader需显式指定线程组大小(如[numthreads(64,1,1)]),这是唯一需要程序员干预的场景。

2. 分组规模的选择依据

  • 编译器与驱动的幕后优化
    • 分支复杂任务(如光线追踪中的条件判断):优先选择Wave32模式,减少分支等待时间。
    • 计算密集型任务(如纹理生成):采用Wave64模式,最大化吞吐量。
  • 程序员无需干预:优化过程完全由编译器和驱动根据代码特征自动完成。

三、资源管理:施工队的“生存法则”

1. 三大核心资源

资源类型比喻技术对应容量限制(每CU)特性
ALU施工工人算术逻辑单元128个同一时间只服务一个Wavefront
SGPR公共工作手册标量寄存器(常量、全局变量)1024个全队共享,内容统一
VGPR各个施工点位工具箱向量寄存器(线程私有变量)2048个每个线程独立占用,限制分队数量
LDS公司内部仓库本地数据存储(线程组共享内存)64KB (验证?)仅限本WGP使用,跨公司不可共享

2. 资源争夺与性能瓶颈

  • VGPR的致命影响
    若每个Wavefront需256个VGPR,则每CU最多驻留 (2048 / 256 = 8) 个Wavefront,导致50%的算力闲置。
  • LDS的协作限制
    若一个线程组申请32KB LDS,则同一WGP最多同时运行2个线程组(64KB / 32KB)。

四、优化手段

  1. 减少VGPR占用

    • 复用寄存器变量,避免冗余存储。
    • 示例:将临时计算结果直接用于下一阶段,而非创建新变量。
  2. 规避分支发散

    • 用掩码运算替代条件分支(如 result = a * mask + b * (1 - mask))。
    • 统一控制流:尽量让所有线程走相同逻辑路径。
  3. LDS的智慧使用

    • 高频访问数据预加载到LDS(如粒子系统的位置信息)。
    • 避免单个线程组占用超过50% LDS容量。
  4. 工具辅助分析

    • 使用 Radeon GPU Profiler 监控Occupancy和资源瓶颈。
    • 关注编译器警告(如VGPR/LDS超额分配提示)。

五、RGP 性能指标

  1. wavefront特性回顾
  • wavefront 是GPU调度和执行的基本单位。
  • 每个 wavefront 包含多个线程,通常是32个,同一个 wavefront 中的线程会执行相同的指令,但处理不同的数据。
  • RDNA3的每个SIMD有16个wavefront slot。
  • 一个SIMD上一次只能执行一个wavefront。
  • 一个SIMD上的这些wavefront不必按顺序执行,也不需要连续地执行完一个wavefront的所有指令。
  1. latency
  • latency 的产生过程GPU在一个SIMD选中了一个wavefront A,开始执行一些ALU计算,执行的过程中wavefront A需要从内存中获取数据(例如对纹理进行采样)。根据最近是否访问过这个数据,这个需求可能会经过整个缓存层次结构,最终到达主内存(memory)然后才返回,这个过程可能需要数百个时钟周期,如果这个SIMD单元中没有其他wavefront在运行,那这个SIMD单元只能等待wavefront A的数据返回,期间会处于空闲状态,浪费计算资源。然而,如果有多个正在执行的wavefront,GPU可以在wavefront A等待数据的时候,立即切换到另一个wavefront,比如wavefront B,并开始执行wavefront B的任务。最好的情况就是wavefront B刚好需要先执行一些ALU计算然后再去在内存中获取数据。这样一来,wavefront B花费的在执行ALU计算的时钟周期,正好可以隐藏wavefront A为了获取数据而带来的等待,称为隐藏了这个latency。如果有SIMD中有足够多的wavefront交替运行执行ALU计算和内存访问操作,SIMD单元就可以始终有活干,几乎不会空闲,几乎没有算力浪费。
  1. Occupancy
  • latency 的度量指标:Occupancy是已分配的wavefront数量与最大可用slot之间的比率。从RDNA2开始,对于单个SIMD,Occupancy = 已分配的wavefront数量除以16。举个例子,如果一个SIMD中有4个正在运行的wavefront,那么Occupancy就是4 / 16 = 25%。所以Occupancy也可以解释为SIMD隐藏latency 的能力:occupancy越大,隐藏latency 的能力越好:如果occupancy是1 / 16,这意味着如果wavefront必须等待某些内容, latency 将无法被隐藏,因为没有其他wavefront被分配给这个SIMD。如果只看隐藏latency的能力,一个SIMD的occupancy最理想的情况是16 / 16。
  • RGP的相关指标:RGP中可以查看occupancy的理论值以及实际测量值。
    • occupancy的理论值:用于判断occupancy会受到什么资源的限制:比如受VGPR的限制或者LDS的限制。同时RGP也会告诉你需要节约出多少资源才能够多分配一个wave。
    • occupancy的实际测量值:occupancy的理论值是实际测量值的上限,如果实际测量无法达到理论值,则可以判断,要么没有足够的工作来填满所有的slot,要么GPU无法快速启动这些wavefront 。

GPU_104">结语:GPU高效的本质


以上“施工公司模式”的类比中,需要揣摩GPU高并行,或者说RDNA3架构的两大核心思想:

  1. 极致的批量操作(SIMD):同步性换取吞吐量。
  2. 精明的资源复用:通过快速切换Wavefront隐藏延迟。

http://www.ppmy.cn/news/1576770.html

相关文章

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:体质测试数据分析及可视化设计是一个基于Web的在线平台,主要分为前台和后台两大功能模块。前台功能模…

【JMeter】JMeter之MQTT压测

文章目录 MQTT概念Jmeter压测MQTTMQTT服务器下载Jmeter MQTT插件测试MQTT测试思路和解决方法 MQTT概念 MQTT是什么 MQTT是用于物联网(IoT)的OASIS标准消息传递协议。它被设计为一种非常轻量级的发布/订阅消息传输,非常适合使用较少的代码占用…

浅谈开发环境

前言 工欲善其事,必先利其器。工作中经常用到的各种’东西’,如CMake、QMake、Make、MSBuildCLang、GCC、MinGW、MSVC等,有些在命名上有些类似,实际作用却不尽相同。 因此这里换个角度来了解下这些‘东西’的作用,以…

Jasypt 与 Spring Boot 集成文档

Jasypt 与 Spring Boot 集成文档 目录 简介版本说明快速开始 添加依赖配置加密密钥加密配置文件 高级配置 自定义加密算法多环境配置 最佳实践常见问题参考资料 简介 Jasypt 是一个简单易用的 Java 加密库,支持与 Spring Boot 无缝集成。通过 Jasypt,…

【PyQt5项目实战分享】基于YOLOv5的交通道路目标检测和数据分析软件

这是我之前用PyQt5做的一个基于YOLOv5的交通目标检测软件,包括物体检测和相关数据的分析功能,最近将其完善了下并打包,希望对大家有所帮助~ Tips:文末有我放到 github 和 gitee 的项目开源地址哦 文章目录 ⭐项目功能交通物体检测…

利用Python爬取中国气象局天气预报数据

利用Python爬取中国气象局天气预报数据 在这篇博客中,我们将介绍一段使用Python编写的代码,它能够从中国气象局的网站上爬取天气预报数据,并将这些数据存储到数据库中。这段代码不仅展示了如何利用Python进行网页数据抓取,还涉及到数据处理和数据库操作等多方面的知识。 …

微信小程序中配置不同的环境变量,并依据环境变量编写API接口请求文件

在微信小程序中,为了在不同环境(如开发、测试、生产)下使用不同的 API 接口地址,我们可以通过配置环境变量来实现。以下是具体的实现步骤和示例代码: 1. 创建环境配置文件 在项目根目录下创建一个 env.js 文件&#…

Git强制覆盖分支:将任意分支完全恢复为main分支内容

Git强制覆盖分支:将任意分支完全恢复为main分支内容 场景背景完整操作步骤一、前置准备二、操作流程步骤 1:更新本地 main 分支步骤 2:强制重置目标分支步骤 3:强制推送至远程仓库 三、操作示意图 关键风险提示(必读&a…