ACPI HMAT(Heterogeneous Memory Attribute Table,异构内存属性表)
好的,下面详细展开ACPI HMAT(Heterogeneous Memory Attribute Table,异构内存属性表) 在计算机体系结构和 Linux 内核中的含义与用途。
📌 HMAT 是什么
HMAT(Heterogeneous Memory Attribute Table) 是 ACPI 6.2+ 规范中定义的系统固件表(Section 5.2.27),用于向操作系统描述系统中不同类型内存的性能特征,主要包括:
访问延迟(Latency):CPU/设备 → 各内存 Proximity Domain 的读写延迟
带宽(Bandwidth):各访问路径的读/写带宽
内存侧缓存属性(Memory Side Cache):如是否存在 Die 上/片外缓存及其大小、关联方式、写策略等
配合SRAT(System Resource Affinity Table) 使用:
SRAT 告诉 OS "有哪些 CPU / 内存 / 设备在哪个 NUMA Proximity Domain"
HMAT 补充 "从这些 Initiator(CPU/GPU/加速器)到这些 Memory Target 的性能参数是什么"
🎯 为什么需要 HMAT
现代服务器常见异构内存拓扑,例如:
本地 DRAM + 持久内存(Intel Optane PMem / NVDIMM)
DRAM + HBM(High Bandwidth Memory)
DRAM + CXL Type-3 内存扩展设备
传统 NUMA 仅靠 SLIT 表给出"NUMA Distance"(一个粗略的相对值),不足以区分上述不同介质的真实延迟/带宽差异。HMAT 让 OS 和运行时库可以按性能特征做智能内存放置,例如:
Linux 内核据此建立Memory Tier(内存分层),自动将慢速内存(PMem/CXL)标记为较低 tier
配置NUMA 交错权重(Interleave Weight) 偏向高性能节点
libmemkind/numactl等可按延迟或带宽偏好分配页面
🏗️ HMAT 关键结构
HMAT 表包含若干子结构(ACPI Spec 5.2.27):
子结构 | 说明 |
|---|---|
Memory Proximity Domain Attributes | 标记某内存 Proximity Domain 关联的 Initiator(哪个 CPU Socket 可发起访问) |
System Locency Latency and Bandwidth Info (SLLBI) | 矩阵形式记录 Initiator→Target 的读/写延迟(ns)与带宽(MB/s) |
Memory Side Cache Info | 描述内存侧缓存(如 L4/Die-stacked cache)的大小、关联度、写回/写通策略等 |
示例概念(摘自内核文档):
Initiator Proximity Domain: CPU Socket 0 Target Proximity Domain: DRAM Node / CXL Mem Node → Latency: 80ns (DRAM), 100ns (CXL) → Bandwidth: 1200 (DRAM), 200 (CXL)🐧 Linux 中的 HMAT 支持
内核选项:
CONFIG_ACPI_HMAT=y(Linux 5.5+ 正式合入主线)解析路径:
drivers/acpi/hmat/中代码解析 BIOS 提供的 HMAT,向 sysfs 暴露性能信息查看方式:
# 确认 HMAT 表存在 sudo acpidump | grep -i HMAT # 或反汇编查看 sudo acpixtract -a iasl -d HMAT.dat # 查看 NUMA 节点及内存分层(内核 6.x) cat /sys/devices/system/node/node*/distance ls /sys/kernel/mm/memory_tiering/若 HMAT 缺失或数据不完整,Linux 会将所有内存归为同一 tier,不做差异化分层
🔗 与其他 ACPI 表的关系
表 | 作用 |
|---|---|
SRAT | 定义 Proximity Domain ↔ CPU / Memory / Device 亲和关系 |
SLIT | 给出 NUMA Node 间的相对距离(抽象值 10/21/31…) |
HMAT | 补充 SRAT 中内存域的具体延迟/带宽/缓存属性(更精确) |
CEDT | CXL 设备发现(配合 HMAT 描述 CXL 内存性能) |
简单说:HMAT 就是 BIOS/UEFI 告诉操作系统"这块内存快、那块内存慢、差多少 ns 和 MB/s"的一张明细表,是异构内存(PMem、CXL、HBM)在现代 Linux 上被正确分层调度的前提。
