当前位置: 首页 > news >正文

AMD RDNA3 GPU架构解析


本文会通过把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

    • 如果施工小分队只有一个任务,那当这个任务中发生等待材料送达、等待水泥这些情况的时候,就会浪费时间。所以施工队会做多个 任务。(任务相当于RDNA3的wavefront 的概念,wavefront 类似于 NVIDIA 的 warp,都是调度和执行的基本单位。每个 wavefront 包含多个线程,通常是32个。这些线程在同一个指令下同步执行,换句话说,同一个 wavefront 中的线程会执行相同的指令,但处理不同的数据。
    • 每个施工队会做多少个任务要看资源的情况,最多做16个任务(因为RDNA 3则每个SIMD有16个slot)。
    • 同一时刻一个施工小分队只能执行一个任务(一个SIMD上一次只能执行一个wavefront)。
    • 任务不必按顺序执行,也不需要连续地执行完一个任务中的所有步骤。(分配的这些wavefront不必按顺序执行,也不需要连续地执行完一个wavefront的所有指令)

二、任务分配的核心逻辑

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

  • 顶点/像素处理:当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超额分配提示)。

结语:GPU高效的本质

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

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

相关文章:

AMD RDNA3 GPU架构解析

本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式,深入理解GPU如何高效处理顶点着色、像素计算等任务。 一、施工公司的组织架构 1. 施工公司(WGP)与施工队(CU) WGP(Work Group Processor&…...

docker关闭mysql端口映射的使用

需求 项目中的数据库为mysql,如果将端口映射到宿主机上,容易被工具扫描出,且随着国产化的进程推进,mysql将不被允许。为了提高安全性与满足项目需求,这里采用隐藏mysql端口方式,不映射宿主机端口&#xff…...

关于对机器中的人工智能进行基准测试

大家读完觉得有帮助记得及时关注和点赞!!! 抽象 最近的基准研究声称,AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而,本立场文件认为,当前的 AI 评估范式不足以评估类似人类的认知能力。我…...

CSS - 妙用Sass

官方文档:https://www.sass.hk/docs/ 1.例1: each $theme in $themeList {$themeKey: map-get($theme, key);media screen and (weex-theme: $themeKey) {.btnText {max-width: 150px;include font(map-get($theme, medFont),map-get($theme, subFontS…...

MS模块创新

1. 动态分支权重融合 创新思路:引入通道注意力机制,自动学习高频/低频分支的融合权重 class DynamicMS(nn.Module):def __init__(self, in_channels1):super().__init__()# 原高频/低频分支保持不变self.high_freq ... # 与原MS模块相同self.low_freq…...

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片) windows部署ollama Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计 下载ollama 下载地址(…...

MFC中CMutex类和CSingleLock类,配合使用疑惑

在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…...

残差收缩模块

1. 多尺度阈值生成 创新思路:融合不同尺度的统计信息(如平均池化最大池化)生成更鲁棒的阈值。 class MultiScaleShrinkage(nn.Module):def __init__(self, channel, reduction4):super().__init__()# 多尺度池化分支self.avg_pool nn.Adap…...

HOW - 在Windows浏览器中模拟MacOS的滚动条

目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、Antd table中的滚动条场景三、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果(细窄、圆角、隐藏默认轨道)。 可以使用以下几种方案: 一…...

Unity 打包后EXE运行出现Field to Load il2cpp的一种情况

Unity版本2021.3.13f1c1 #if DEVELOPMENT_BUILDA1 A1 10600;#else#endif 使用 #if DEVELOPMENT_BUILD然后在下面面板使用Development Build。打包后会运行游戏EXE出现Field to Load il2cpp。 解决办法是换成IF ELSE,自己代码设置个开关、 文心一言: …...

Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建

Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建 目录 安装 Nginx 和 PHP配置 Nginx配置 PHP启动服务ThinkPHP 配置常见问题排查 1. 安装 Nginx 和 PHP 安装 Nginx 访问 Nginx 官网 下载 Windows 版本解压到指定目录,如 C:\nginx 安装 PHP 访问 PHP 官网…...

Redis100道高频面试题

一、Redis基础 Redis是什么?主要应用场景有哪些? Redis 是一个开源的、基于内存的数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合等),可以用作数据库、缓存和消息中间件。 主要应用场景&…...

登录服务器后如何找到对应的drupal所在的文件夹

在服务器上找不到 Drupal 安装目录的原因可能有以下几种: 多站点配置: Drupal 支持多站点设置,即在同一安装中托管多个网站。在这种配置下,每个站点都有自己的设置和文件夹,通常位于 sites 目录下。例如,站…...

win32汇编环境,窗口程序中使控件子类化的示例一

;运行效果 ;win32汇编环境,窗口程序中使编辑框控件子类化的示例一 ;窗口子类化,就是把某种控件,自已再打造一遍,加入自已的功能。比如弄个特殊形状的按钮,或只能输入特殊字符的编辑框 ;当然,一般来说,这都是…...

专业工具,杜绝一切垃圾残留!

在安装大多数软件时均会在系统注册表中创建相应的条目。如果卸载后仍然存在注册表残留,可能会导致再次安装时出现失败,同时也会对系统性能和存储空间产生负面影响。常见的卸载残留包括注册表项、程序文件夹、用户数据文件夹、临时文件以及相关插件等。 …...

java 实现简易基于Dledger 的选举

java 实现简易基于Dledger 的选举 1. 定义 Dledger 节点类,包含节点的状态、日志存储、选举和日志复制逻辑 import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.S…...

大数据“调味“ ,智慧“添香“,看永洪科技助力绝味食品数字化新征程

近年来,随着国家数字化政策不断出台、新兴技术不断进步、企业内生需求持续释放,数字化转型逐步成为企业实现高质量发展的必由之路,成为企业实现可持续发展乃至弯道超车的重要途径。 在全国数字化浪潮驱动下,以人工智能、互联网、…...

【嵌入式】MQTT

MQTT 文章目录 MQTT安装简介MQTT客户端代码 安装 安装Paho MQTT C库: sudo apt-get install libpaho-mqtt3-dev头文件包含: #include "MQTTClient.h"编译选项: gcc -o $ $^ -lpaho-mqtt3c简介 MQTT协议全称是(Message Queuing…...

vue原理面试题

以下是一些关于Vue原理的面试题: 一、虚拟DOM与响应式系统 Vue中的虚拟DOM是如何工作的? 答案: 当Vue组件的数据发生变化时,Vue首先会在虚拟DOM中构建一个新的虚拟DOM树来表示更新后的组件结构。然后,Vue会将新的虚拟DOM树与旧的虚拟DOM树进行比较(这个过程称为Diff算法…...

office集成deepseek插件,office集成deepseek教程(附安装包)

文章目录 前言一、下载与安装OfficeAI 助手二、获取 DeepSeek 的 API key三、在 OfficeAI 助手中配置 DeepSeek API key四、使用 OfficeAI 助手功能 前言 本教程将为你详细讲解 Office 集成 DeepSeek 的安装步骤和使用方法,助你轻松拥抱智能办公新时代,…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...