AMD RDNA3 GPU架构解析


如果你对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,都是GPU调度和执行的基本单位。每个 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. 资源分类

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

2. SIMD32和VALU的关系

  • 硬件实现:每个SIMD32 对应 32个物理VALU阵列
    • 例如:v_mov_b32 或者v_add_f32 指令会在SIMD32单元内同时修改32个work-item的VGPR
    • 指令举例:
    v_add_f32 v0, v1, v2 // 该指令在32个VALU上并行执行
    
  • VALU是GPU核心计算资源
    • 作用:VALU全程Vector Arithmetic Logic Unit,用来处理每个work-item的独立数据。
    • 典型场景:顶点坐标变换、像素颜色计算、物理模拟中的粒子位置更新。
    • 特点:通过SIMD实现大规模并行。

3. VGPR容量限制

每个SIMD32可驻留的wavefront数量由以下公式决定:
Max Wavefronts/SIMD = ⌊ Total VGPRs VGPRs/Wave × 32 ⌋ \text{Max Wavefronts/SIMD} = \left\lfloor \frac{\text{Total VGPRs}}{\text{VGPRs/Wave} \times 32} \right\rfloor Max Wavefronts/SIMD=VGPRs/Wave×32Total VGPRs 示例

  • 假设Shader需要64 VGPRs/work-item
  • 每个SIMD32的VGPR总量为2,048
  • 则每个SIMD32最多容纳:
    ⌊ 2048 ÷ ( 64 × 32 ) ⌋ = ⌊ 2048 ÷ 2048 ⌋ = 1 \lfloor 2048 ÷ (64×32) \rfloor = \lfloor 2048÷2048 \rfloor = 1 2048÷(64×32)⌋=2048÷2048=1 wavefront

4. LDS容量限制

每个work-group的LDS分配会约束wavefront调度:

// 示例:光线追踪Shader的LDS使用
shared float3 local_positions[256]; // 占用256×12B=3KB

四、优化手段

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的所有指令。

2. 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单元就可以始终有活干,几乎不会空闲,几乎没有算力浪费。

3. 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中查看Occupancy**:RGP中可以查看occupancy的理论值以及实际测量值。
	- occupancy的理论值:用于判断occupancy会受到什么资源的限制:比如受VGPR的限制或者LDS的限制。同时RGP也会告诉你需要节约出多少资源才能够多分配一个wave。
	- occupancy的实际测量值:occupancy的理论值是实际测量值的上限,如果实际测量无法达到理论值,则可以判断,要么没有足够的工作来填满所有的slot,要么GPU无法快速启动这些wavefront 。

结语:GPU高效的本质


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

golang学习笔记——go语言安装及系统环境变量设置

文章目录 go语言安装go envgo getgoproxy测试安装 Go 插件安装 Go 插件依赖工具参考资料用户环境变量和系统环境变量用户环境变量系统环境变量示例设置环境变量的步骤设置用户环境变量设置系统环境变量 验证环境变量总结 2024年最火的5大Go框架1. Gin:高并发接口的“…

Composition API

为什么会产生 Composition API? Vue2 逻辑复用方式 缺点 Mixin (命名空间冲突、逻辑不清晰、不易复用)scoped slot 作用域插槽 (配置项多、代码分裂、性能差)Vue2 对 TS 支持不充分 Composition API 优点 逻辑代码更少, 更集中, 更易扩展更加丰富的 API 集成对 TS 来说,…

DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新

目录 1. DeepSeekR1模型简介2. 歌词创作流程2.1 准备工作2.2 歌词生成技巧 3. 音乐制作环节3.1 主流AI音乐生成平台 4. 歌曲欣赏5. 总结展望 1. DeepSeekR1模型简介 腾讯AI代码助手最新推出的DeepSeekR1模型不仅在代码生成方面表现出色,其强大的自然语言处理能力也…

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

angular+nodejs问卷调查系统

说明&#xff1a;我计划用angularmysqlnodejs&#xff0c;做一套问卷调查系统&#xff0c; 1.先设计数据库表&#xff0c; 2.然后添加模拟数据&#xff0c; 3.然后写几个查询方法 4.然后用nodejs写service服务&#xff0c;查询mysql数据 5.然后写contrller路由&#xff0c;指向…

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…

EasyDSS视频推拉流系统:清理缓存文件时如何确保缓存读写不受影响?

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户咨询&#xff0c;视频推…

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

GPIO的简介

目录 一、GPIO简介 二、GPIO基本结构 三、GPIO位结构 1、整体结构和内部各结构 2、输入部分 1.保护二极管 2.输入模式 3.浮空/上拉/下拉配置 ​编辑 4.模拟输入 5.施密特触发器 3、输出部分 1.输出部分前段 2.输出模式 3.开漏/推挽输出 4.复用开漏/推挽输出 四…

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访…

AI工具:免费-文字转语音TTsmaker

前言&#xff1a; 测试了一款好用的文字转语音工具&#xff0c;简单&#xff0c;个人用免费功能就足够了。 说明&#xff1a; TTSMaker&#xff08;马克配音&#xff09;是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括中…

vue3 vite 两种监听pinia状态变化的方式比较:watch, $subscribe

首先搭建vue3 vite 项目 npm create vue选择pinia 或者自己安装pinia 自己安装需要 npm install pinia并在main.js中挂在上&#xff1a; const pinia createPinia() const app createApp(App) app.use(pinia) app.mount(#app)创建stores文件夹和counter.js文件 counter.j…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

【ThreeJS Basics 1-6】Camera

文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动&#xff08;可以看到后面&#xff09; 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…

Java+SpringBoot+Vue+数据可视化的百草园化妆服务平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 市场需求催生 在当今社会&#xff0c;化妆已经成为人们日常生活和各种重要场合中不可或…

React:Redux

Redux引入 Redux感觉像组件通信的中介 state存放被管理的状态 action是申请改哪些数据&#xff0c;传入什么参数 reducer是怎么修改数据 我的理解更像是action像一个储存方法的对象&#xff0c;reducer是具体的方法的实现&#xff0c;不同的方法实现也不一样 store是个仓库…

【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践

深度神经网络系列文章 【AI深度学习网络】卷积神经网络&#xff08;CNN&#xff09;入门指南&#xff1a;从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN&#xff08;卷积神经网络&#xff09;简单实现&#xff1a;手写数字识别的工程实践 引言 在深度…

学习threejs,使用LineBasicMaterial基础线材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.LineBasicMaterial1.…

【0010】Python流程控制结构-分支结构详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 分支结构是编程中的基本控制结构之一&#xff0c;它允许程序根据条件判断执行不同的代码路径。通过本文&…

python网络爬虫开发实战之基本库使用

目录 第二章 基本库的使用 2.1 urllib的使用 1 发送请求 2 处理异常 3 解析链接 4 分析Robots协议 2.2 requests的使用 1 准备工作 2 实例引入 3 GET请求 4 POST请求 5 响应 6 高级用法 2.3 正则表达式 1 实例引入 2 match 3 search 4 findall 5 sub 6 com…