HsaMemFlags 与 HsaMemMapFlags 所反映的 GPU 存储管理硬件技术
本文分析
HsaMemFlags、HsaMemMapFlags以及相关的HSA_SVM_FLAGS每一个标志位背后对应的 GPU / 平台硬件技术,帮助理解 KFD 内存分配、映射与迁移语义与底层硬件能力之间的映射关系。
1. 概述
在深入具体的显存管理 API 之前,有必要先俯瞰整个硬件系统为支持存储管理提供了哪些能力,以及每项能力要解决的问题。HsaMemFlags、HsaMemMapFlags以及 SVM 的相关标志位正是这些硬件能力在软件接口上的直接投影——分配与映射时设置的每一个 bit,几乎都对应一项具体的硬件技术。因此,熟悉这几组标志位的过程,本身就是一次自底向上梳理 GPU 存储管理硬件技术的过程。
HsaMemFlags用于hsaKmtAllocMemory的分配阶段,HsaMemMapFlags用于hsaKmtMapMemoryToGPU的映射阶段,二者的每个 bit 几乎都对应一项具体的 GPU / 互连 / IOMMU / 页表硬件能力。总体上它们覆盖以下几大硬件技术门类:
| 门类 | 关键技术 |
|---|---|
| 内存一致性 | Infinity Fabric、A+A 一致性域、fine/coarse-grain、system-scope atomics |
| 原子操作 | PCIe AtomicOp、IOMMUv2 ATC 路径 |
| 地址转换 / SVM | GPUVM 多级页表、IOMMUv2(ATS/PRI)、统一虚拟地址空间 |
| 显存类型 | HBM/GDDR VRAM 分区、GART/GTT、GDS/LDS/Scratch 片上存储 |
| 缓存策略 | GPUVM PTE MTYPE(Cached/NonCached/WriteCombined/Uncached) |
| 分页 / TLB | 多页大小(4K/64K/2M/1G)、可恢复缺页、HMM 页迁移 |
| 执行 / 调度 | AQL 队列、doorbell、MES 固件、SDMA 拷贝/迁移引擎 |
| 页权限 | NX 执行位、只读位、页锁定(pinned) |
2. HsaMemFlags 逐位分析
2.1 内存一致性(Cache Coherency)
反映 AMDAPU / A+A(CPU+GPU 统一架构)与dGPU的一致性差异。
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
CoarseGrain(0 = FineGrain) | HSA 内存一致性模型。Fine-grain 依赖互连硬件在每次访存时维持一致性;Coarse-grain 只在 dispatch / 同步屏障点由软件强制刷新。对应 GPU L2 cache 的一致性协议行为。 | Coarse-grain 省去逐次一致性开销,让计算 kernel 全速跑、带宽利用率最高;Fine-grain 则换取 CPU/GPU 随时可见同一份数据,免去显式拷贝与同步,简化编程模型。让软件在"吞吐"与"共享便利"之间按需取舍。 |
ExtendedCoherent | 系统级原子一致性(system-scope coherence),原子指令跨 CPU/GPU 全系统范围保持一致,依赖 Infinity Fabric / CXL 类互连的一致性域扩展。 | 使 CPU 与 GPU 能对同一变量做无锁原子协作(生产者/消费者队列、全局计数器、细粒度任务窃取),无需回到 host 端串行同步,大幅降低跨设备协作延迟。 |
Uncached | A+A 平台 fine-grain uncached 访问,绕过 cache,用于 CPU/GPU 频繁读写的共享标志位。对应 GPUVM PTE 的 MTYPE 页属性。 | 消除缓存行乒乓与陈旧数据问题,让 spin flag / 信号量的写入对对端立即可见,是低延迟轮询式同步的关键,避免缓存刷新带来的抖动。 |
CachePolicy(2 bit,见HSA_CACHING_TYPE) | GPUVM PTE MTYPE 缓存策略:Cached / NonCached / WriteCombined,直接映射到页表项缓存位。 | 按访问模式定制缓存行为:只读/复用数据用 Cached 提升命中率,流式写用 WriteCombined 合并突发写以打满带宽,从而针对不同数据流最大化有效带宽。 |
底层实现:GPU 页表项中的MTYPE + coherence bit,以及 CPU 侧 IOMMU / PCIe 一致性能力。
2.1.1 内存一致性与缓存策略的区别
两者常被混淆,但处在不同层面、解决不同问题:缓存策略决定"单个访问者这次访存走不走缓存、怎么走"(本地性能路径);内存一致性决定"我写进缓存后,别的访问者(另一颗芯片)何时能看到"(多方正确性)。
| 维度 | 内存一致性(Coherency) | 缓存策略(Cache Policy / MTYPE) |
|---|---|---|
| 回答的问题 | 多个访问者之间看到的数据是否一致(谁先看到谁的写入) | 单个访问者这块内存要不要 / 怎么进缓存 |
| 作用对象 | CPU↔GPU、GPU↔GPU 等多方之间的可见性 | 一条访存请求本身的缓存行为 |
| 硬件位置 | L2 Cache + 一致性协议引擎 + 互连(Infinity Fabric) | GPUVM 页表项里的 MTYPE 位(UTCL2 施加) |
| 对应标志 | CoarseGrain/FineGrain、ExtendedCoherent | CachePolicy(Cached/NonCached/WriteCombined)、Uncached |
| 语义性质 | 正确性与同步语义 | 性能与访问路径选择 |
两者常配合使用:Uncached(缓存策略)之所以适合 CPU/GPU 共享的 spin flag,正是因为绕过缓存后无需一致性协议介入即可立即互相可见——用"不缓存"规避一致性难题;而 fine-graincoherency走另一条路——允许缓存,靠一致性硬件(Infinity Fabric)保证缓存数据跨芯片同步,用协议换取"既缓存又一致"。一句话概括:缓存策略 = 数据进不进 cache(本地);一致性 = 进了 cache 后跨访问者何时可见(多方)。
2.2 原子操作(Atomics)硬件路径
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
AtomicAccessFull | APU 上 ATC / IOMMUv2 路径的完整原子操作,系统内存经 IOMMUv2 映射,支持全套原子指令。 | 让 GPU 直接对系统内存执行完整原子集(min/max/and/or 等),复杂并发算法(哈希表、并发队列、直方图归约)可原地在共享内存完成,无需搬运回 VRAM 或退化为锁。 |
AtomicAccessPartial | PCIe 原子事务(PCIe Atomics),dGPU 经 PCIe 只支持 SWAP / CAS / FetchAdd 三种硬件原子(PCI Express 规范定义的 AtomicOp)。 | 在纯 PCIe 平台上仍提供硬件级 CAS/FetchAdd,支撑基本的无锁计数与指针交换,避免完全退回到 host 端串行处理;明确其能力边界也帮助运行时选择正确的回退路径。 |
底层依赖:PCIe AtomicOp Completer/Requester 能力、IOMMUv2 ATS/PRI。
2.3 地址转换与虚拟内存(SVM / IOMMU)
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
HostAccess | GPUVM 页表是否对 CPU 侧建立映射,决定 BAR / 系统内存可见性。 | 让 CPU 能直接读写该缓冲(初始化、检查结果、填充参数),省去中转拷贝;关闭它则保护纯设备私有数据、避免误暴露并节省 BAR 空间。 |
NonPaged | 页锁定(page-locked / pinned)内存,避免换页,供 DMA / IOMMU 直接访问。 | 保证物理地址稳定,使 DMA / 迁移引擎无需担心页被换出,获得可预测的低延迟传输,是高吞吐 H2D/D2H 拷贝与 P2P 的前提。 |
FixedAddress | 在调用者指定的虚拟地址处分配(类似mmap的MAP_FIXED):置位时*MemoryAddress传入期望 VA,分配器必须落在该地址,地址不空闲则失败;不置位时由分配器自行选址。属于 GPUVM 虚拟地址空间的放置控制。 | 让调用者精确控制分配落点,用于需要固定/预留布局的场景(如复用同一 VA 重建映射、满足对特定地址区间的约束),或与已有地址空间规划对齐。 |
NoAddress/OnlyAddress | VRAM 分配与 VA 分配解耦,反映 GPUVM 中"物理显存句柄"与"虚拟地址预留"可分离管理(支持稀疏 / 延迟映射)。 | 支持先预留大段虚拟地址、再按需回填物理页,实现稀疏资源与延迟/超额分配,节省显存并支撑大而稀疏的数据结构。 |
NoNUMABind | NUMA 拓扑感知,系统内存是否绑定特定 NUMA 节点,涉及多 socket / 多内存控制器布局。 | 让分配落在离 GPU 最近的内存控制器上,降低跨 socket 访问延迟、提升有效带宽;放开绑定则在均衡场景下获得更灵活的放置。 |
对应能力位HSA_CAPABILITY.HSAMMUPresent/SVMAPISupported,依赖ATS + PRI(IOMMUv2 1.1 规范)。
2.4 显存类型与堆管理(VRAM / GTT / 片上存储)
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
GTTAccess | GART(Graphics Address Remapping Table)/ GTT 映射,供 MES(MicroEngine Scheduler)固件访问。 | 把分散的系统内存页在 GPU 侧重映射为连续地址窗口,使 GPU 无需大 VRAM 即可访问 host 内存,是无 VRAM 驻留大数据集的桥梁。 |
Contiguous | 连续物理 VRAM 分配,用于需要物理连续的场景(某些 DMA 引擎、P2P、显示扫描)。 | 满足显示扫描、P2P、单描述符 DMA 对物理连续的硬性要求,减少 scatter-gather 描述符数量,提升传输效率与兼容性。 |
GDSMemory | GDS(Global Data Share)GPU 片上全局数据共享存储器硬件。 | 提供跨 workgroup 的低延迟片上共享存储,适合全局归约、序号分配、跨组同步等,比走 VRAM 快一个数量级。 |
Scratch | Scratch 显存,线程私有溢出空间,对应 SGPR/VGPR 溢出临时区。 | 为寄存器溢出提供后备空间,使高寄存器压力的复杂 kernel 仍能正确运行,避免因寄存器不足而编译失败或占用率骤降。 |
PageSize(2 bit,见HSA_PAGE_SIZE) | 多级页大小(4KB/64KB/2MB/1GB),对应 GPUVM 大页 / 巨页 TLB,降低 TLB miss。 | 大页显著减少 TLB 项数与 miss、缩短地址翻译路径,对大缓冲区的随机访问带宽提升明显;小页则减少内存碎片浪费。 |
相关:HSA_HEAPTYPE_FRAME_BUFFER_PUBLIC/PRIVATE对应BAR 大小限制 / Resizable BAR (Smart Access Memory)。
2.5 执行 / 调度相关内存
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
AQLQueueMemory | HSA AQL(Architected Queuing Language)队列内存,KFD 保证最优位置与对齐(供 doorbell / HW 调度器访问)。 | 让应用无需内核参与即可通过 doorbell 直接向硬件调度器提交任务,实现低延迟用户态 dispatch,是 GPU 高频提交小任务的性能基础。 |
QueueObject | AQL queue 对象,供 CPU 读取amd_queue_t的 read pointer。 | 使 CPU 能高效轮询队列进度、做流控与回收,无需系统调用即可感知 GPU 消费位置。 |
ExecuteAccess | 页可执行属性(NX / eXecute bit),区分数据页与代码页(着色器指令、队列),影响 PTE 执行权限位。 | 通过 NX 隔离代码与数据,防止数据被当作指令执行,提升安全性并帮助捕获越界跳转等错误。 |
ExecuteBlit | Blit kernel(SDMA / 拷贝内核)对象内存,涉及 SDMA 拷贝引擎。 | 让拷贝/填充卸载到专用 SDMA 引擎,与计算 kernel 并行执行,掩盖数据搬运开销、提升整体吞吐。 |
ReadOnly | 页只读属性(PTE 读写位),也用于允许 migration scale-out。 | 只读语义既防止意外写坏共享数据,又让同一页可安全复制到多个 GPU(scale-out),在多卡只读访问时消除迁移争用。 |
3. HsaMemMapFlags 逐位分析(映射与迁移)
HsaMemMapFlags侧重映射时的迁移语义,反映HMM(Heterogeneous Memory Management)/ 按需分页(Page Migration)硬件链路。
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
Migrate | 页迁移:把系统内存页迁移到被映射 GPU 的本地 VRAM,依赖 GPU page fault(recoverable fault)+ SDMA 迁移引擎。 | 让热数据自动落到 GPU 本地高带宽 VRAM,把远端 PCIe 访问变为本地访问,显著提升访问带宽、降低延迟,且对应用透明。 |
Probe | 预迁移 / 驱逐提示:预告即将映射,触发非必要数据驱逐,降低后续缺页延迟(“cleanup hint”,可被忽略)。 | 提前腾出显存并预热映射,把缺页开销从关键路径移走,平滑迁移抖动、减少首次访问的长尾延迟。 |
ReadOnly | 映射期内存不被修改 → 允许migration scale-out(同一只读页可复制到多 GPU)。 | 只读页可同时复制到多张 GPU 各自的本地 VRAM,多卡并行读取同一数据集时避免相互抢占迁移,提升多卡扩展性。 |
CachePolicy/PageSize/HostAccess | 与HsaMemFlags中同名字段含义一致,作用于映射阶段的 PTE 属性。 | 在映射阶段按目标设备重新定制缓存/页大小/可见性,使同一块内存针对不同 GPU 得到最优 PTE 属性。 |
底层是ZONE_DEVICE + drm_pagemap + SDMA的缺页迁移链路。
4. 相关:HSA_SVM_FLAGS(SVM 层的一致性与迁移控制)
HSA_SVM_FLAGS进一步在 SVM 语义上暴露硬件能力:
| 标志 | 硬件技术 | 带来的益处 / 解决的问题 |
|---|---|---|
HSA_SVM_FLAG_HOST_ACCESS | 保证 CPU 可访问,建立双向映射。 | 让 CPU 与 GPU 共享同一 SVM 指针并双向读写,简化数据准备与结果回读,无需显式 map/unmap。 |
HSA_SVM_FLAG_COHERENT | fine-grained 一致性(所有可访问设备间),依赖一致性互连。 | 跨设备随时看到彼此最新写入,支撑细粒度协作与共享数据结构,免去手动同步刷新。 |
HSA_SVM_FLAG_EXT_COHERENT | device-scope atomics 细粒度一致性,system-scope 原子扩展。 | 把原子一致性扩展到系统范围,使跨设备无锁算法正确成立,是多设备协同的正确性基石。 |
HSA_SVM_FLAG_HIVE_LOCAL | XGMI Hive 拓扑,优先使用同 hive 内 GPU(HsaNodeProperties.HiveID)。 | 将数据放置/迁移限定在高带宽 XGMI 互连的同一 hive 内,避开慢速跨 hive 链路,最大化多卡间传输带宽。 |
HSA_SVM_FLAG_GPU_RO/GPU_READ_MOSTLY | 只读 / 读多优化,允许页复制(replication);写触发缺页。 | 让读多数据在各 GPU 本地各存一份副本,消除重复远程读取与迁移抖动,显著提升只读工作集的多卡吞吐。 |
HSA_SVM_FLAG_GPU_ALWAYS_MAPPED | XNACK disable语义,GPU 映射始终有效,避免可恢复缺页。 | 保证映射常驻、消除运行期缺页停顿,带来确定性延迟,适合对抖动敏感或不支持重放的场景。 |
与迁移相关的枚举(HSA_MIGRATE_TRIGGERS、HSA_SVM_UNMAP_TRIGGERS、HSA_SMI_EVENT)描述了迁移触发源:prefetch、GPU/CPU 缺页、TTM eviction、MMU notifier 等,直接对应 KFD SVM 迁移与驱逐的硬件事件路径。
5. 延伸:平台形态 A+A 与 x86+A 的差异
前面多处标志(如Uncached、AtomicAccessFull、ExtendedCoherent)都特别标注了"A+A 平台"。这里对该术语及其对存储管理能力的影响做一个集中说明。
5.1 术语含义
A+A指AMD CPU + AMD GPU的同构平台组合——CPU 与 GPU 均为 AMD 产品,二者通过Infinity Fabric一致性互连直连。与之相对的是x86+A(如 Intel CPU + AMD GPU),CPU 与 GPU 之间只能通过PCIe连接。最典型的 A+A 产品是MI300A:Zen4 CPU chiplet 与 CDNA3 GPU chiplet 封装在一起、物理共享同一片 HBM,是 fine-grain 一致性与统一内存的极致形态。
5.2 能力差异对照
A+A 平台凭借 Infinity Fabric 一致性互连,获得一批纯 PCIe 连接拿不到的硬件能力:
| 能力 | A+A(Infinity Fabric) | x86+A(PCIe) |
|---|---|---|
| 缓存一致性 | 硬件维护 fine-grain 一致性 | 仅 coarse-grain / 软件刷新 |
| 原子操作 | 全套原子(AtomicAccessFull,走 ATC/IOMMUv2 路径) | 仅 PCIe 三种原子(AtomicAccessPartial:SWAP / CAS / FetchAdd) |
| uncached 共享内存 | 支持(Uncached标志) | 一般不支持 |
| system-scope 原子 | ExtendedCoherent可用 | 受限 |
| 统一内存 | CPU/GPU 共享 HBM(MI300A) | 需经 PCIe 迁移 / 映射 |
5.3 对本文标志位的意义
文档中凡标注"A+A 平台"的标志位(如Uncached、AtomicAccessFull),本质上都是依赖 AMD CPU+GPU 一致性互连才能生效的硬件特性;在纯 PCIe 的 dGPU 场景下,它们要么不可用,要么退化为不同的行为路径(例如原子操作退回到AtomicAccessPartial的 PCIe AtomicOp 子集)。因此运行时在选择这些标志前,仍需结合第 8 节的能力发现流程按节点判断可用性。
6. 各技术所在的硬件与模块(物理落点)
前面按标志位拆解了"是什么技术、有什么益处",这一节回答"这些技术究竟落在哪块硬件、硬件的哪个模块里"。先给出一张分层结构图,再用表格逐项定位。
6.1 硬件分层结构
6.2 技术落点对照表
| 技术 | 所在硬件 | 具体模块 / 单元 | 说明 |
|---|---|---|---|
| MTYPE 缓存策略 / Uncached | GPU ASIC | GPUVM 页表项(PTE)+ UTCL2 | 缓存类型是 PTE 里的 MTYPE 位,由地址转换单元 UTCL2 在翻译时施加。 |
| fine/coarse-grain 一致性 | GPU ASIC | L2 Cache + 一致性协议引擎 | 一致性粒度由 L2 及其 coherence 逻辑决定,dispatch/屏障点触发刷新。 |
| GPU 侧原子 ALU | GPU ASIC | L2 / 原子执行单元 | 完整原子集在 GPU 内部 ALU 实现,跨设备时经互连传播。 |
| 多级页表 / TLB / 多页大小 | GPU ASIC | GPUVM 页表游走器 + TLB(UTCL2) | 4K/64K/2M/1G 大页与 TLB 命中都由该单元处理。 |
| recoverable page fault / XNACK | GPU ASIC | UTCL2 缺页逻辑 + CU 重放(XNACK) | 缺页由页表单元上报、由 CU 的 XNACK 机制重放访存。 |
| GART / GTT | GPU ASIC | GART 重映射表(UTCL2 管辖) | 把分散系统内存页映射为 GPU 侧连续地址窗口。 |
| GDS | GPU ASIC | GDS 片上存储块 | 独立于 L2 的全局数据共享 SRAM。 |
| LDS / Scratch / VGPR·SGPR | GPU ASIC | CU / SIMD 内的片上存储与寻址 | Scratch 是寄存器溢出后备,寻址由 CU 生成。 |
| SDMA 拷贝 / 迁移 | GPU ASIC | SDMA 引擎 | 独立 DMA 引擎,与计算并行搬运数据、执行 HMM 迁移。 |
| AQL 队列 / doorbell / 用户态提交 | GPU ASIC | MES 微引擎 + doorbell aperture | 硬件调度器 MES 消费 AQL 包,doorbell 是寄存器映射窗口。 |
| NX / 只读页权限 | GPU ASIC | GPUVM PTE 权限位 | 执行位与读写位同样落在页表项里。 |
| PCIe AtomicOp(部分原子) | GPU 接口 + 主板 | BIF / PCIe 接口 + Root Complex | SWAP/CAS/FetchAdd 由 PCIe 事务层完成,需 RC 支持 Completer。 |
| Resizable BAR (SAM) | GPU 接口 + 主板 BIOS | BIF BAR 配置 + 主板/BIOS | 决定 CPU 能否一次性映射整块 VRAM。 |
| HBM / GDDR VRAM(含 ECC) | GPU 封装 / 板载 | 显存颗粒 + 显存控制器 | 物理存储介质;ECC 由显存控制器提供。 |
| system-scope 原子 / A+A 一致性 | 互连 | Infinity Fabric 一致性域 | 把 CPU 与 GPU 纳入同一一致性域,是ExtendedCoherent/Uncached的物理基础。 |
| 多 GPU Hive / HIVE_LOCAL | 互连 | XGMI 链路 | 同 hive 内 GPU 走高带宽 XGMI,跨 hive 退化。 |
| P2P DMA | 互连 | PCIe Switch / XGMI | GPU↔GPU 直传,绕开 host 内存。 |
| IOMMUv2(ATS/PRI/ATC) | CPU 芯片 | CPU 侧 IOMMU | 地址转换服务与页请求接口,AtomicAccessFull、SVM 依赖它。 |
| NUMA 亲和 / 系统内存 | CPU 芯片 | 集成内存控制器(IMC)+ DRAM | 分配落在哪个 NUMA 节点由 IMC 拓扑决定。 |
| pinned / page-locked | CPU + OS | 内核内存管理(KFD 固定页) | 阻止换页以保证 DMA 地址稳定。 |
| HMM 页迁移 / ZONE_DEVICE / drm_pagemap | 软件 + GPU | 内核 HMM 框架 + SDMA | 迁移的策略层在内核,搬运动作由 GPU SDMA 执行。 |
记忆线索:“页相关”(PTE/MTYPE/权限/大页/缺页)几乎都在 GPU 的 GPUVM/UTCL2;"搬运"在 SDMA;"提交调度"在 MES/doorbell;"跨芯片一致性与原子"在 Infinity Fabric / PCIe / IOMMU;"存储介质"在 HBM/GDDR 与系统 DRAM。
7. 涉及的硬件技术清单
- 一致性互连:Infinity Fabric、A+A 一致性域、system-scope 原子、GPU L2 一致性协议、XGMI Hive。
- PCIe 特性:PCIe AtomicOp、Resizable BAR (SAM)、P2P DMA。
- 地址转换:IOMMUv2(ATS/PRI)、GPUVM 多级页表、GART/GTT、SVM 统一地址空间。
- TLB / 分页:多页大小(4K/64K/2M/1G)、recoverable page fault、HMM 页迁移、XNACK。
- 片上 / 专用存储:GDS、LDS、Scratch、HBM/GDDR VRAM 分区。
- 缓存策略:MTYPE(Cached/Uncached/WriteCombined)、fine/coarse-grain 粒度。
- 调度硬件:AQL 队列、doorbell、MES 固件、SDMA 拷贝 / 迁移引擎。
- 页权限:NX 执行位、只读位、页锁定(pinned)。
8. 硬件能力发现路径
上述标志的可用性由HsaNodeProperties.Capability(HSA_CAPABILITY)等拓扑属性在运行时决定,关键位包括:HSAMMUPresent(IOMMUv2)、SVMAPISupported、CoherentHostAccess、ASICRevision、Mem_EDCSupport(ECC)等。应用 / 运行时应先查询这些能力位,再选择对应的HsaMemFlags/HsaMemMapFlags组合,以避免在不支持的节点上分配失败。
这一篇涉及整个硬件系统的核心技术,内容很多,一下看不明白也不要紧,后面在分析具体功能流程和API时会细讲,按需学习即可。