AMD GPU 硬件架构从 GCN 演进为RDNA游戏 / 图形与CDNAHPC/AI两大分支Linux amdgpu 驱动是基于 DRM 的统一内核驱动覆盖全系列 AMD GPU。硬件架构总览1. 演进路线GCNGraphics Core Next2012–2019Vega 等统一图形 / 计算VLIWSIMT异步计算HBM 引入RDNARadeon DNA2019–至今游戏 / 图形优化Navi 系列能效比大幅提升CDNACompute DNA2020–至今数据中心 / HPC/AIMI 系列矩阵核心、HBM、Infinity FabricAMD2. RDNA 架构游戏 / 图形核心模块Compute UnitCU计算单元每个 CU 含64 个流处理器SP支持Wave32/Wave64双模式RDNA 2/3双发射、Infinity Cache片上大缓存降低显存延迟RDNA 2Ray Accelerator光追核心、AI 加速指令图形流水线几何引擎、光栅器、渲染后端、显示引擎DCN显存 / 互联GDDR6/GDDR6X、Infinity Cache、PCIe 4.0/5.0RDNA 3Chiplet 小芯片GCDMCD、5nm/6nm 混合工艺AMD代际要点RDNA 1Navi 10RX 5000 系列能效比 50%RDNA 2Navi 20RX 6000、PS5/Xbox Series X/S硬件光追、Infinity CacheRDNA 3Navi 30RX 7000Chiplet、光追 / AI 增强、能效 54%AMDRDNA 4Navi 404nm更强 AI / 光追、FSR 优化3. CDNA 架构HPC/AI核心模块CU Matrix Core矩阵核心强化 FP16/FP8/INT4 矩阵运算适配 AI 训练 / 推理全 HBM 显存高带宽、低延迟适配大规模计算Infinity Fabric多 GPU 高速互联、多节点扩展AMD无图形渲染单元专注计算无光栅 / 显示硬件AMD代际要点CDNA 1MI100首代 CDNAMatrix CoreHBM2eAMDCDNA 2MI250X双芯、HBM2e、更高算力CDNA 3MI3003D 小芯片、HBM3、统一内存、AI 性能大幅提升Linux amdgpu 驱动架构1. 整体堆栈用户空间应用 → Mesaradeonsi/Vulkan/ROCm → libdrm 内核空间DRM 框架 → amdgpu.ko核心 KFD.ko计算 硬件GPU IP 块GFX/SDMA/DMA/MM/Video/Display 固件2. 内核驱动核心组件amdgpu.koDRM 基础基于 DRM 框架提供 GEM/TTM 内存管理、KMS 显示、调度器IP 块管理GCGFX/Compute图形 / 计算引擎、命令处理器、MES 调度SDMA系统 DMA数据搬移MM显存管理、地址翻译、HBM 控制VCN视频编解码DCN显示控制DC 模块电源 / 时钟PPLibPowerPlay、动态调频、功耗控制中断 / 异常GPU 中断处理、错误恢复固件加载从/lib/firmware/amdgpu/加载微码如 navi31_gpu_info.bin3. 计算子系统KFD与 amdgpu 深度协同提供HSA/ROCm运行时支持SVM共享虚拟内存、多进程 / 多设备计算、IPC 通信4. 支持范围覆盖GCN 1.0、RDNA 1–4、CDNA 1–3全系列 AMD GPU开源、内核主线、随内核版本迭代更新核心概念对比维度RDNA游戏CDNA计算定位图形渲染、游戏、内容创作HPC、AI 训练 / 推理、科学计算核心单元CU Ray AcceleratorCU Matrix Core显存GDDR6/X Infinity CacheHBM2e/HBM3互联PCIe Infinity CachePCIe Infinity Fabric图形单元完整光栅 / 渲染 / 显示无代表产品RX 5000/6000/7000MI100/MI250/MI300amdgpu 驱动核心以 amdgpu_device 为根以 TTM 管理显存以 ring/IB 提交命令以硬件 IP 模块化控制 GPU通过 DRM 向用户态暴露统一接口。amdgpu 是基于 DRM/KMS TTM/GEM的完整 GPU 驱动核心可以拆成 4 大块设备抽象层核心对象命令提交 GPU 调度最关键执行路径内存管理TTM GEM VRAM/GTTIP 块硬件管理GFX/SDMA/VCN/DCN 等核心对象结构驱动 “骨架”amdgpu_device整个 GPU 的根对象包含所有硬件 IP、调度器、内存管理器、电源管理等。从 PCI probe 初始化管理所有 IP 实例gfx、sdma、uvd、vcn、dcn、psp等持有drm_device、ttm_device、amdgpu_ip_blocks[]amdgpu_bo(Buffer Object)GPU 可见的显存 / 系统内存缓冲区基于 TTM 封装。对应 VRAM 或 GTT可映射到 CPU用于纹理、命令缓冲、顶点、计算缓冲区amdgpu_ring/amdgpu_hw_schedGPU 命令通道环形缓冲区与硬件调度器。每个引擎GFX/SDMA/COMPUTE都有独立的 ring。命令提交流程驱动真正干活的核心前置概念IB (Indirect Buffer)用户态构建的 PM4 / AQL 命令包RingGPU 硬件环形命令缓冲区Job内核包装的一次提交任务FenceGPU 执行完成同步信号VMGPU 虚拟地址空间这是 amdgpu最核心执行路径几乎所有 3D / 计算都走这里用户态Mesa/ROCm构建IBIndirect Buffer命令流通过 DRM_IOCTL_AMDGPU_GEM_SUBMIT 进入内核内核分配amdgpu_job做 BO 依赖、同步、 fence 管理把 IB 写入对应amdgpu_ring触发 GPU 取指执行GPU 执行完成 → 发中断 → fence 信号量唤醒等待进程核心函数amdgpu_job_submit()amdgpu_sched_process_job()amdgpu_ring_emit_ib()用户态 → 内核入口用户态Mesa/ROCm/libdrm调用ioctl(DRM_IOCTL_AMDGPU_CS)进入内核amdgpu_cs_ioctl(amdgpu_cs.c)作用解析用户传入的 IB、资源、同步、队列信息做权限、VM、BO 合法性检查构建任务 amdgpu_jobamdgpu_cs_create_job(amdgpu_cs.c) └─ amdgpu_job_alloc(amdgpu_job.c)分配struct amdgpu_job关联 IB、BO 依赖、fence、VM、ring处理依赖与同步amdgpu_job_dependency(amdgpu_job.c)检查所有 BO 是否就绪等待前序 fence 完成处理同步对象syncobj、semaphore进入 DRM 通用调度器drm_sched_job_arm(drm_sched.c)将 job 提交到调度队列由调度线程drm_sched_main统一调度。向 Ring 写入 IB 命令amdgpu_ring_emit_ib(amdgpu_ring.c)内核向 GPU 的 ring 写入IB 的 GPU 虚拟地址IB 长度同步条件触发执行GPU 硬件开始取指执行命令流。GPU 执行完成 → 发中断GPU 执行完 IB → 写中断状态寄存器内核中断处理amdgpu_irq_handler(amdgpu_irq.c) └─ amdgpu_fence_process(amdgpu_fence.c)标记 fence 为signaled唤醒用户态等待的进程 /poll用户态感知完成用户态通过amdgpu_cs_waitpoll / epollsyncobj等待 fence 完成然后读取结果。极简总流程用户态构建IB → ioctl进入amdgpu_cs_ioctl → 创建amdgpu_job → 处理依赖 → 进入drm调度器 → 写入GPU ring → GPU执行 → 中断→fence信号→用户态唤醒内存管理核心TTM amdgpu 封装amdgpu 不直接用 DRM GEM而是基于TTMTranslation Table Manager。三类内存VRAM本地显存最快GTT通过 IOMMU/GART 映射的系统内存USWC / WC写合并内存适合高速上传核心结构ttm_buffer_object→ 被amdgpu_bo包装amdgpu_vmGPU 虚存管理支持 GPUVAamdgpu_ptGPU 页表对 RDNA2/3 还支持Infinity Cache 管理FB 显存压缩多进程共享虚存SVMIP 块硬件核心GPU 功能模块化amdgpu 驱动最大特点按硬件 IP 模块化。核心 IPGCGFX/Compute图形 计算引擎核心中的核心SDMA数据搬移 DMACPU ↔ GPU、GPU ↔ GPUDCNDisplay Core Next显示输出KMSVCN视频编解码DIDT / DFM监测、测温、功耗PSP安全处理器、固件加载、认证SMU系统管理单元负责电压 / 频率 / 功耗每个 IP 都有统一生命周期init→sw_init→start→suspend→resume调度器核心amdgpu_sched现代 amdgpu 使用硬件调度 软件调度混合多进程、多队列公平调度GFX/Compute/SDMA 优先级隔离支持抢占、复位、GPU hang 恢复核心结构amdgpu_schedamdgpu_sched_entitydrm_sched_job电源管理核心PPLib / PMFWSMU 固件负责动态调频DPM驱动通过 mailbox 与 SMU 通信功耗限制、温度控制、性能档位amdgpu 内核调用流程图设备初始化主线PCI Probe → 设备就绪内核PCI子系统 ↓ 匹配PCI ID amdgpu_pci_probe [amdgpu_drv.c] ↓ amdgpu_driver_load_kms [amdgpu_drv.c] ↓ drm_dev_alloc → 分配 drm_device ↓ amdgpu_device_init [amdgpu_device.c] ├─ amdgpu_device_ip_early_init → 早期IP初始化PSP/SMU ├─ amdgpu_discovery_set_ip_blocks → 枚举硬件IPGFX/SDMA/VCN/DCN ├─ amdgpu_irq_init → 中断初始化 ├─ amdgpu_mman_init → TTM/GEM内存管理初始化 └─ amdgpu_device_ip_init → 全IP初始化GFX/SDMA/DCN等 ↓ amdgpu_device_init_schedulers [amdgpu_sched.c] ├─ amdgpu_ring_init → 为每个引擎GFX/COMPUTE/SDMA创建ring buffer └─ drm_sched_init → 初始化硬件调度器创建调度线程drm_sched_main ↓ drm_dev_register → 注册DRM设备创建 /dev/dri/cardX ↓ kgd2kfd_probe → 通知KFD计算子系统初始化 ↓ 设备就绪可响应用户态IOCTL内存分配主线GEM Create → VRAM/GTT 分配用户态Mesa/ROCm ↓ ioctl(DRM_IOCTL_AMDGPU_GEM_CREATE) [libdrm] ↓ 进入内核 amdgpu_gem_create_ioctl [amdgpu_gem.c] ↓ amdgpu_bo_create [amdgpu_object.c] ↓ 设置内存域VRAM优先 → GTT ttm_bo_init_reserved [ttm_bo.c] ↓ ttm_bo_mem_space [ttm_bo.c] ↓ 选择内存管理器 amdgpu_vram_mgr_new [amdgpu_vram_mgr.c]VRAM 或 amdgpu_gtt_mgr_new [amdgpu_gtt_mgr.c]GTT ↓ drm_buddy_alloc_blocks [drm_buddy.c] → Buddy算法分配物理块 ↓ amdgpu_bo → 生成GPU可见Buffer Object ↓ 返回用户态BO句柄命令提交主线最核心执行路径用户态Mesa/ROCm ├─ 构建PM4/AQL命令流 → 写入IBIndirect Buffer也是一个BO └─ 调用 amdgpu_cs_submit → ioctl(DRM_IOCTL_AMDGPU_CS) ↓ 内核amdgpu_cs_ioctl [amdgpu_cs.c] ↓ amdgpu_job_create → 创建 amdgpu_job ↓ amdgpu_job_dependency → 处理BO依赖、fence同步 ↓ drm_sched_job_arm → 加入调度队列 ↓ drm_sched_main [调度线程] → 取出Job ↓ amdgpu_sched_process_job [amdgpu_sched.c] ↓ amdgpu_ring_emit_ib [amdgpu_ring.c] ├─ 将IB地址/长度写入GPU寄存器 └─ 触发GPU取指执行 ↓ GPU硬件执行IB命令流GFX/SDMA/COMPUTE引擎命令完成与中断主线GPU执行完成 ↓ 发中断到CPUGPU中断 ↓ amdgpu_irq_handler [amdgpu_irq.c] ↓ amdgpu_fence_process → 标记fence为完成状态 ↓ 唤醒用户态等待进程poll/wait ↓ 用户态收到完成信号可读取结果核心数据结构关系drm_device ↓ 包含 amdgpu_device ├─ amdgpu_mman → TTM内存管理器 ├─ amdgpu_irq → 中断管理 ├─ amdgpu_sched[] → 各引擎调度器 ├─ amdgpu_ring[] → 命令环形缓冲区 └─ amdgpu_ip_block[] → 硬件IP实例GFX/SDMA/DCN等 amdgpu_bo ↓ 封装 ttm_buffer_object → 物理内存管理 amdgpu_job ↓ 关联 drm_sched_job → 调度框架 amdgpu_ring → 命令通道 amdgpu_fence → 同步信号