HsaCacheProperties描述计算节点的缓存层次结构。CPU 和 GPU 的缓存架构差异显著——CPU 遵循经典 L1/L2/L3 层次,GPU 则有 Vector L1、Scalar L1、L2、Infinity Cache 等多种专用缓存。本文解析结构体字段、GPU 与 CPU 的缓存差异、以及 libhsakmt 如何拼接不同信息源构建完整缓存视图。
缓存层次是影响计算性能的核心因素。在异构系统中,CPU 和 GPU 各自拥有独立且架构迥异的缓存体系:CPU 追求低延迟和强一致性,GPU 追求高聚合带宽和大规模并行下的吞吐。KFD 通过 HsaCacheProperties 将这两种截然不同的缓存体系统一建模——每个节点的 caches/ 子目录列出其所有缓存级别,运行时据此决定数据分块大小、预取策略和 occupancy 权衡。
我在开发中还没有具体涉及这个属性的深入应用,所以下面的记录的内容可能像流水账,先欠着,大家有问题可以提。
1. 结构体定义
typedef struct _HsaCacheProperties {
HSAuint32 ProcessorIdLow; // 关联的处理器 ID
HSAuint32 CacheLevel; // 缓存级别 (1=L1, 2=L2, 3=L3)
HSAuint32 CacheSize; // 缓存大小 (KB)
HSAuint32 CacheLineSize; // 缓存行大小 (bytes)
HSAuint32 CacheLinesPerTag; // 每 tag 对应的行数
HSAuint32 CacheAssociativity; // 组相联度
HSAuint32 CacheLatency; // 访问延迟 (ns, 近似值)
HsaCacheType CacheType; // 缓存类型位域
} HsaCacheProperties;
字段含义速览:
| 字段 | 说明 |
|---|---|
ProcessorIdLow | 共享该缓存的第一个处理器 ID;CPU 节点为核心编号,GPU 节点为 CU 编号起始 |
CacheLevel | 缓存层级:1=L1, 2=L2, 3=L3/Infinity Cache |
CacheSize | 容量(KB);对共享缓存是总容量而非每核分摊 |
CacheLineSize | 缓存行大小(bytes),决定最小访问粒度和预取对齐 |
CacheLinesPerTag | 每个 tag 管理的行数,影响 sectored cache 的行为 |
CacheAssociativity | 组相联度(N-way),0 表示全相联 |
CacheLatency | 访问延迟的近似值(ns);GPU 缓存几乎总是 0(未填充) |
CacheType | 位域,标识该缓存是 Data/Instruction 以及归属 CPU 还是 GPU CU |
2. CacheType 位域
typedef union {
struct {
unsigned int Data : 1; // 数据缓存
unsigned int Instruction : 1; // 指令缓存
unsigned int CPU : 1; // 属于 CPU
unsigned int HSACU : 1; // 属于 GPU CU
unsigned int Reserved : 28;
} ui32;
HSAuint32 Value;
} HsaCacheType;
| Bit | 含义 | 说明 |
|---|---|---|
| 0 | Data | 可缓存数据 |
| 1 | Instruction | 可缓存指令 |
| 2 | CPU | 该缓存属于 CPU 核心 |
| 3 | HSACU | 该缓存属于 GPU Compute Unit |
组合示例:
| CacheType.Value | 含义 |
|---|---|
| 0x05 (Data + CPU) | CPU 数据缓存 (L1d) |
| 0x06 (Instruction + CPU) | CPU 指令缓存 (L1i) |
| 0x07 (Data + Instruction + CPU) | CPU 统一缓存 (L2/L3) |
| 0x09 (Data + HSACU) | GPU 向量数据缓存 |
| 0x0A (Instruction + HSACU) | GPU 指令缓存 |
| 0x0B (Data + Instruction + HSACU) | GPU L2 统一缓存 |
3. CPU 节点的缓存层次
3.1 典型 AMD EPYC 缓存
CPU Node Cache Hierarchy:
├── L1i (per core): 32 KB, 8-way, 64B line CacheType = Instruction|CPU
├── L1d (per core): 32 KB, 8-way, 64B line CacheType = Data|CPU
├── L2 (per core): 512 KB, 8-way, 64B line CacheType = Data|Instruction|CPU
└── L3 (per CCX): 32 MB, 16-way, 64B line CacheType = Data|Instruction|CPU
3.2 sysfs 中的表示
CPU 缓存信息不完全来自 KFD sysfs,而是 libhsakmt 额外解析:
/sys/devices/system/cpu/cpu0/cache/
├── index0/ → L1d
│ ├── level → 1
│ ├── type → Data
│ ├── size → 32K
│ ├── coherency_line_size → 64
│ ├── ways_of_associativity → 8
│ └── number_of_sets → 64
├── index1/ → L1i
├── index2/ → L2
└── index3/ → L3
3.3 ProcessorIdLow 的含义(CPU)
对 CPU 节点,ProcessorIdLow 是 CPU 核心的起始编号:
- L1 缓存:ProcessorIdLow = 该核心的 ID
- L2 缓存:ProcessorIdLow = 该核心的 ID(每核独享 L2)
- L3 缓存:ProcessorIdLow = CCX 中第一个核心的 ID(共享 L3 的核心组)
4. GPU 节点的缓存层次
4.1 AMD CDNA/RDNA 缓存架构
GPU Node Cache Hierarchy (CDNA2, MI200):
├── L1 Vector (per CU): 16 KB, 4-way CacheType = Data|HSACU
├── L1 Scalar (per CU): 16 KB, 4-way CacheType = Data|Instruction|HSACU
├── L1 Instruction (per SQC): 32 KB CacheType = Instruction|HSACU
└── L2 (shared, per GPU): 8 MB, 16-way CacheType = Data|Instruction|HSACU
GPU Node Cache Hierarchy (CDNA3, MI300):
├── L1 Vector (per CU): 32 KB
├── L1 Scalar (per CU): 16 KB
├── L2 (per XCD): 4 MB
└── Infinity Cache (shared): 256 MB # 类 L3
4.2 sysfs 中的表示
GPU 缓存直接在 KFD topology sysfs 中提供:
nodes/1/caches/
├── 0/properties:
│ processor_id_low 0
│ cache_level 1
│ cache_size 16 # KB
│ cache_line_size 64
│ cache_lines_per_tag 4
│ cache_associativity 4
│ cache_latency 0
│ cache_type 9 # Data + HSACU
│
├── 1/properties:
│ cache_level 1
│ cache_size 32
│ cache_type 10 # Instruction + HSACU
│
└── 2/properties:
cache_level 2
cache_size 8192 # 8 MB
cache_type 11 # Data + Instruction + HSACU
4.3 ProcessorIdLow 的含义(GPU)
对 GPU 节点,ProcessorIdLow 对应 SIMD/CU 的编号起始:
- L1 缓存:关联到特定 CU 范围
- L2 缓存:ProcessorIdLow = 0(整个 GPU 共享)
5. GPU 缓存的特殊性
5.1 与 CPU 缓存的关键差异
| 维度 | CPU 缓存 | GPU 缓存 |
|---|---|---|
| 一致性 | 硬件维护 (MOESI/MESI) | 部分软件管理 |
| 粒度 | Per-core 独立 | Per-CU 或 全 GPU 共享 |
| 用途分离 | Unified (L2/L3) | Vector/Scalar/Instruction 分离 |
| 容量 | 大 (32 MB L3) | 小 L1 + 中等 L2 |
| 带宽 | 高 per-core | 极高聚合带宽 |
| 可编程性 | 透明 | 部分可通过指令控制(如 buffer_gl0_inv) |
5.2 缓存一致性对拓扑的影响
GPU L1 缓存通常非一致性:
- 不同 CU 的 L1 之间不保证一致
- Workgroup 内通过 LDS 共享数据(绕过 L1)
- 跨 workgroup 需显式 L1 invalidate
GPU L2 缓存在 GPU 内部一致:
- 同一 GPU 内所有 CU 共享 L2
- 跨 GPU(P2P)需要 L2 flush/invalidate
这与 HsaIoLinkProperties.Flags 中的 Non-Coherent 标志呼应。
5.3 Infinity Cache
MI300 系列引入的大容量片上缓存:
- 在 KFD topology 中表示为 Level=3 的缓存
- 充当 VRAM 的 last-level cache
- 大幅降低 HBM 访问次数
- CacheSize 可达 256 MB
6. CacheLatency 字段
| 缓存级别 | 典型延迟 (cycles) | sysfs 报告 (ns) |
|---|---|---|
| L1 Vector | ~12 cycles | 0 (常未填充) |
| L1 Scalar | ~10 cycles | 0 |
| L2 | ~100 cycles | 0 |
| L3/Infinity Cache | ~200 cycles | 0 |
| CPU L1 | ~4 cycles | ~1 ns |
| CPU L2 | ~12 cycles | ~4 ns |
| CPU L3 | ~40 cycles | ~12 ns |
注意:GPU 缓存的 CacheLatency 在实际实现中几乎总是 0(未填充)。这是因为:
- GPU 缓存延迟以 cycle 为单位更有意义
- 延迟取决于时钟频率,而时钟是动态调整的
- 静态值意义有限
7. 信息源拼接逻辑
7.1 GPU 节点
KFD sysfs: nodes/{id}/caches/*/properties
→ 直接解析为 HsaCacheProperties[]
→ 无需额外信息源
7.2 CPU 节点
KFD sysfs: nodes/{id}/properties
→ 获取 caches_count(可能为 0 或不完整)
/sys/devices/system/cpu/cpu*/cache/index*/
→ 获取完整的 CPU 缓存层次
→ 拼接为 HsaCacheProperties[]
libhsakmt 逻辑:
if (KFD sysfs 有完整缓存信息):
直接使用
else:
解析 /sys/devices/system/cpu/ 补充
设置 CacheType.CPU = 1
7.3 共享缓存的处理
多个核心共享同一缓存(如 L3 共享于一个 CCX)时:
- sysfs 中只记录一次(per-CCX 而非 per-core)
ProcessorIdLow标识共享该缓存的第一个核心- 上层可通过
shared_cpu_map确定完整的共享关系
8. sysfs 字段映射
| sysfs key | HsaCacheProperties 字段 |
|---|---|
processor_id_low | ProcessorIdLow |
cache_level | CacheLevel |
cache_size | CacheSize (KB) |
cache_line_size | CacheLineSize |
cache_lines_per_tag | CacheLinesPerTag |
cache_associativity | CacheAssociativity |
cache_latency | CacheLatency |
cache_type | CacheType.Value |
9. 上层使用场景
| 场景 | 使用的字段 | 决策 |
|---|---|---|
| Kernel occupancy 计算 | L1 CacheSize | LDS vs L1 trade-off |
| 数据分块策略 | L2 CacheSize, CacheLineSize | Tile 大小对齐缓存行 |
| 预取策略 | CacheLineSize | Prefetch 粒度 |
| NUMA 亲和性 | L3 ProcessorIdLow | 将线程绑定到共享 L3 的核心 |
| 性能建模 | 全部字段 | 估算 memory-bound kernel 的实际带宽 |
10. 小结
- CacheType 位域区分用途和归属:Data/Instruction × CPU/GPU 的组合
- GPU 缓存架构独特:Vector/Scalar/Instruction L1 分离,非一致性设计
- CPU 缓存需额外信息源:KFD sysfs 可能不完整,需解析
/sys/devices/system/cpu/ - CacheLatency 常为 0:不可靠,需结合硬件规格推断
- Infinity Cache 是 MI300 的关键特征:表现为 Level=3 的大容量共享缓存
- 缓存信息服务于性能优化:tile 大小、occupancy、预取策略等
1864

被折叠的 条评论
为什么被折叠?



