第一章 DRM 子系统概述:1.4命令提交的硬件模型

发布时间:2026/11/6 1:56:28
第一章 DRM 子系统概述:1.4命令提交的硬件模型 1.3 节说明了 GPU 在系统中的位置、内存的访问路径与地址翻译。本节说明命令如何从 CPU 到达 GPU 并概述新一代 GPU 的硬件调度机制不涉及软件以何种方式使用这些机制。内容不针对特定厂商因此不讨论各厂商的寄存器与命令包格式。1. 硬件组成GPU 以异步方式执行命令CPU 将命令写入内存后通知 GPU随即返回继续其他工作GPU 稍后执行并报告完成。CPU 交给 GPU 执行的一个工作单元称为作业job例如一次绘制或一次计算分派其命令存放在一个或多个命令缓冲区中。GPU 内部按功能分为多类执行引擎图形引擎执行绘制计算引擎按指定的线程网格启动计算着色器compute dispatch执行通用计算复制引擎在内存之间搬运数据视频引擎负责编解码。同类引擎可以有多个实例例如多个复制引擎。命令执行涉及的硬件部件及其交互如图 1.4.1 所示。图中实线为一次提交经过的路径以图形引擎为例虚线为管理路径不在每次提交中发生。图 1.4.1 执行引擎与命令处理器的组成与交互每个引擎的前端设有命令处理器Command ProcessorCP它是运行微码的专用处理器本身不执行着色器程序只负责从内存中取出命令、解析后分发给引擎内的执行单元并处理同步、缓存控制与完成通知。这里的命令处理器指逻辑上的取包前端。物理上多个引擎的前端可以集中在同一个硬件块中各自使用独立的微处理器与流水线例如 AMD 的 CP 同时包含服务图形与计算的多个微引擎复制与视频引擎则常带有独立的、较简单的取包前端。CPU 与 CP 之间的通知由另外两个部件承担门铃 BAR 是 GPU 在 PCIe 上暴露的一段地址窗口划分为许多门铃地址CPU 写入其中一个地址即通知 GPU 有新命令待处理中断控制器则将命令完成、缺页、错误等事件以中断形式通知 CPU。前者承载提交方向的通知后者承载完成方向的通知。部分 GPU 还内置一个调度微控制器图中的虚线框运行调度固件例如 Intel GuC、AMD MES 与 Arm CSF 的固件负责决定命令处理器当前服务哪些工作负载。它不参与每一次提交因此图中以虚线表示其管理路径不具备该部件的 GPU 由主机软件在初始化时把队列固定映射到槽位此后不再改变。2. 作业的生命周期CPU 与命令处理器之间经内存中的数据结构传递命令接口有两层命令缓冲区Indirect BufferIB存放一项作业的具体命令如绘制、启动计算着色器、内存复制由 CPU 写入内存。ring 缓冲区一段首尾相接的内存区域存放命令处理器要依次处理的包。ring 中的包多数并不包含作业本身的命令而是指向 IB 的地址与长度以及同步、缓存控制、完成通知等控制命令。CPU 以写指针标记 ring 中写入的末尾命令处理器以读指针标记已经取走的位置并经门铃得知写指针的更新。ring 连同读写指针与门铃构成一个队列Queue这是取包的基本单位队列的完整组成在第 3 节说明。一次命令提交与完成的过程如图 1.4.2 所示。图 1.4.2 命令提交与完成ring、门铃与 fenceCPU 将作业命令写入 IB①。CPU 在 ring 的写指针处写入两个包②一个指向 IB另一个是 fence 包。fence 包要求引擎在此前的命令全部完成、缓存写回之后将一个递增的序号写入指定的 fence 内存并触发中断。CPU 更新写指针并写入门铃③。硬件据此得知队列中有新包无需轮询内存中的写指针。命令处理器在读指针与写指针之间依次取包④引擎按包中的地址读取 IB 并执行⑤。作业完成后引擎将序号写入 fence 内存⑥并产生中断⑦。CPU 的中断处理程序读取 fence 内存中的序号序号不大于该值的作业均已完成。fence 内存不属于队列。fence 写入的地址由 fence 包自身携带同一队列中的不同 fence 包可以指向不同的地址。由于同一 ring 上的包按顺序处理队列上的作业按顺序执行fence 序号单调递增比较序号即可判断任意一项作业是否完成无需逐项查询。不同队列之间的执行顺序则由第 3、4 节所述的槽位仲裁与调度决定。ring 的容量有限写指针追上读指针时 ring 已满新的提交必须等待命令处理器处理完一部分包。作业也可能无法完成着色器陷入死循环、访问非法地址或硬件异常都可能使作业挂起而硬件通常不会主动报告挂起只能由软件在等待超时后判定再复位相应的引擎或整个 GPU。复位会丢失正在执行的作业及其上下文状态。3. 队列与硬件队列槽位第 2 节把 ring、读写指针与门铃合称为队列只考察了单个队列上的作业。本节说明队列的完整组成以及命令处理器如何选择要服务的队列。队列既不是某个单一的硬件部件也不是软件可以自由定义的数据结构而是由硬件规定格式、由软件分配存储的一组对象其组成如表 1.4.1 所示。表 1.4.1 队列的组成组成部分所在位置作用ring内存存放待处理的包写指针内存同时经门铃通知硬件标记 CPU 写入的末尾读指针命令处理器内部并写回内存中的指定位置标记已取走的位置CPU 据此计算 ring 的剩余空间门铃doorbell门铃 BAR 中分配给该队列的一个地址CPU 写入新的写指针通知硬件该队列有新包队列描述符内存按硬件规定的格式记录上述各项的地址、所属地址空间的标识与优先级以及队列离开槽位时的执行状态读写指针之间的包即为已提交、待执行的包。命令只能交给能够执行它的引擎因此每个队列都属于某一类引擎例如计算队列中的命令只由计算引擎执行。表中各项的分工可以从两个方面理解。其一格式由硬件规定。包的编码、读写指针的推进规则、门铃与队列的对应方式以及描述符中每个字段的位置都是命令处理器微码与软件之间的约定软件只能按此填写。其二存储由软件分配。ring、指针与描述符所在的内存由软件申请门铃地址由软件从门铃 BAR 中分配内容也由软件写入。队列的这种性质与 CPU 的页表相同页表由软件在内存中建立格式由处理器规定遍历由硬件完成。队列描述符是把其余各项联系在一起的结构。ring 与指针分散在内存中门铃位于 BAR 中命令处理器本身并不知道它们的存在描述符中的配置装入之后这些对象才构成一个可以取包的队列。描述符装入的位置称为硬件队列槽位。命令处理器能够同时服务的队列数量是固定的它为每个可同时服务的队列设置一组寄存器即一个槽位记录该队列的 ring 基地址与大小、读写指针所在的内存地址、对应的门铃、所属地址空间的标识以及优先级并带有一个激活位。它只从占用槽位且已激活的队列取包一个队列若只存在于内存而未占用槽位即使写入了包、写入了门铃也不会被执行。槽位数量因架构与引擎而异。计算引擎通常有数十个槽位使多个队列的计算任务可以同时占用计算单元图形与复制引擎的槽位较少常见为数个。各厂商的名称不同例如 AMD 的 HQD 寄存器组、Intel 的执行列表端口、Arm 的命令流组槽位作用均与此相当。因此内存中按格式填写完整的队列并不一定处于可执行状态。队列本身位于内存数量不受槽位数量的限制只有占用槽位的那一部分队列才会被执行。本节所说的队列均指这种由硬件定义格式的对象与软件内部用于暂存作业的同名数据结构不同。4. 队列的映射与抢占队列数量可以远多于槽位。决定哪个队列占用槽位的一方称为调度方可以是主机上的驱动由它直接写入槽位寄存器也可以是 GPU 内置的调度微控制器。队列、槽位与调度方之间的关系如图 1.4.3 所示。图 1.4.3 队列、硬件队列槽位与调度方CPU 写入 ring 包并推进写指针①再写入门铃②门铃对应的队列已占用槽位时硬件将通知路由到该槽位③仲裁器按优先级从各激活槽位取包并分发到执行引擎④。队列未占用槽位时门铃通知调度方⑤由调度方选取空闲槽位装入该队列的描述符⑥槽位不足时调度方先抢占某个已映射的队列将其执行状态写回描述符并释放槽位⑦。若调度方在初始化时一次性完成映射且此后不再改变则不发生⑤至⑦。4.1 映射与解除映射队列与槽位之间的关系由映射与解除映射两种操作。映射将队列描述符装入一个空闲槽位并激活CP 随即开始从该队列取包解除映射先抢占队列中正在执行的作业将执行状态写回队列描述符再释放槽位。解除映射后队列及其 ring 仍然存在写入 ring 的包暂不执行。队列的执行状态如读指针与 CP 的内部状态保存在描述符中。重新映射后CP 从保存的状态继续执行所用槽位不必与之前相同。槽位与队列的关系对应于 CPU 上处理器核与进程的关系槽位数量固定队列数量可以远多于槽位队列描述符相当于进程被切换出去时保存的上下文。驱动作为调度方时直接写入槽位寄存器完成映射与解除映射。调度微控制器作为调度方时还接收未占用槽位的队列的门铃通知并在队列之间按优先级与时间片轮换槽位从而把数量众多的队列复用到有限的槽位上。4.2 抢占多个槽位同时激活时命令处理器在它们之间仲裁按槽位的优先级轮流从各队列取包。计算引擎可以让来自不同槽位的作业同时在计算单元上执行图形引擎通常同一时刻只执行一个队列的作业切换队列需要抢占当前作业。解除映射同样以抢占为前提队列中的作业正在执行时必须先使其停下槽位才能释放。抢占使正在执行的作业中途停止并保存继续执行所需的状态。命令处理器的状态写回队列描述符作业在执行单元上的状态则保存在描述符所指向的上下文保存区中作业恢复执行时再从这两处载入。抢占的粒度决定了抢占的延迟与需要保存的状态量。在命令包边界抢占时只需等待当前包执行完毕保存的状态最少但一个耗时很长的绘制或计算命令会使抢占长时间不能完成在着色器指令级抢占时执行单元中各线程的寄存器与局部存储都要写入上下文保存区保存的数据量最大但延迟可控。较新的 GPU 普遍支持指令级抢占使解除映射能在有限时间内完成。5. 作业边界的缓存同步1.3 节已说明CPU 与 GPU 之间的缓存一致性须由软件显式维护。硬件中没有持续追踪主机访问的部件同步只能在已知的时间点触发通常选在作业的边界即作业开始前与作业结束时。同步动作本身由硬件执行触发方式如表 1.4.2 所示。表 1.4.2 缓存同步的触发方式触发方式执行过程典型用途命令流中的缓存控制包命令处理器执行到该包时向各级缓存发出写回或失效请求待全部完成后再处理后续的包作业开始前使 GPU 缓存失效fence 包附带的缓存操作引擎完成此前的全部命令后先写回缓存再写入完成序号保证完成序号可见时结果已到达内存MMIO 寄存器CPU 写入特定寄存器直接触发刷新或失效刷新主机数据通路的写缓冲使其读缓存失效CPU 写入的数据要被引擎读到需依次经过三层同步执行存储屏障指令如 x86 的sfence排空写合并缓冲区刷新主机数据通路再使 GPU 缓存失效。存储屏障须先于门铃写入否则 GPU 可能先收到门铃而数据仍滞留在 CPU 核内。主机数据通路与 GPU 缓存相互独立刷新其中之一不影响另一方因此两侧须分别同步。GPU 缓存在容量不足时虽会被动写回脏数据但时机不确定不能代替显式同步。GPU 内的缓存实例数量众多每个计算单元都有各自的 L1。部分架构为此设有集中的缓存请求控制器将一次写回或失效请求分发到所有实例并在全部完成后统一应答。一项作业从 CPU 准备输入到 CPU 读取结果缓存同步的完整时序如图 1.4.4 所示。图 1.4.4 CPU 与 GPU 之间的缓存同步时序CPU 经显存 BAR 写入输入数据①随后执行存储屏障排空写合并缓冲区②再刷新主机数据通路③使暂存的数据写入 VRAM。CPU 写入 ring 包并敲门铃④。命令处理器在作业开始时先使 GPU 缓存失效⑤避免引擎命中该地址的旧数据。引擎经 GPU 缓存读写数据⑥结果可能长时间停留在缓存中。作业结束时命令处理器写回 GPU 缓存中的脏数据⑦然后写入 fence 序号⑧并触发中断⑨。由于写回先于序号写入CPU 看到序号即可确认结果已到达 VRAM。若主机数据通路带有读缓存CPU 读取前先使其失效⑩再经显存 BAR 读取结果⑪。PCIe 的排序规则是这一时序成立的前提。posted 写按发出顺序到达因此输入数据的写入不会落后于门铃写入读请求的完成报文不能越过此前的 posted 写因此 CPU 读回 GPU 的任一寄存器即可确认此前的写入均已到达 GPU。数据是否已经写入 VRAM则仍取决于主机数据通路的刷新。上述显式同步只在两种情况下可以省略一是 GPU 缓存设计为显存侧缓存主机访问与引擎访问共同经过它二是 CPU 与 GPU 之间采用硬件一致性互连双方可以互相窥探缓存。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询