# llc-bench **Repository Path**: robinadc/llc-bench ## Basic Information - **Project Name**: llc-bench - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-02 - **Last Updated**: 2026-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LLC Contention Benchmark 单体重放程序,用于复现 **同一 cluster 绑核 vs 跨 cluster 绑核** 的 LLC 命中率与吞吐差距。 ## 原理 程序启动 N 个 worker 协程(polling mode,100% CPU),每个协程每次操作访问三类数据: | 数据集 | 读写属性 | 访问模式 | 大小 | 目标 | |--------|----------|----------|------|------| | **L1 local** | 本地私有 | 指针追踪(依赖链) | 32KB(L1d 内) | L1/L2 bound | | **RO set** (`--ro-mb`) | 只读共享 | 随机访问,无时间局部性 | 远大于 LLC | L3/DRAM bound(冷基线) | | **RW set** (`--rw-mb`) | 读写共享 | 顺序访问,有时间局部性 | 小于 LLC | L3 hit(同 LLC 高 / 跨 LLC 低) | **每次操作**:4 次 L1 依赖链 load + 16 次 RO 随机 load + 6 次 RW 顺序 read + 3 次 RW 散点 write + 448 次 PRNG **LLC 命中率模型**(仅计 L3 read): - RO ~0% 命中(冷基线,两种配置相同) - RW 同 LLC ~100% 命中;跨 LLC ~33%(一致性失效) - 每次 op 的 L3 read:16 冷 + 7 热(6 buf + 1 header)= 23 次 - 同 LLC:7/23 = **~30%** - 跨 LLC:~2.3/23 = **~10%** **Top-Down 稳定性设计**: - 6 次 RW read 独立发射(非依赖链),填满 LSQ → 跨 LLC 时一致性 stall 被归类为 Memory Bound 而非 Core Bound - 16 次 RO read 提供稳定的 DRAM-bound 流量(两种配置相同),锚定 Memory Bound 基线 - 448 次 PRNG 平衡 Core Bound,使 Core/Memory ≈ 44/46 ## 编译 ```bash # 在 Linux/ARM64 上直接编译 go build -o llc-bench . # 交叉编译(在其他平台上) GOOS=linux GOARCH=arm64 go build -o llc-bench . ``` ## 运行 ```bash # 同 cluster(16 核在同一 LLC 域内),默认无限期运行,Ctrl+C 停止 taskset -c 0-15 ./llc-bench # 跨 cluster(8+8 分布在两个 LLC 域) taskset -c 0-7,32-39 ./llc-bench # 指定运行时长 taskset -c 0-15 ./llc-bench --duration 30s # 对比吞吐 # 跑两次,比较 throughput (Mops/s) 即可 ``` ## 测量 LLC 命中率 ```bash perf stat -e LLC-loads,LLC-load-misses taskset -c 0-15 ./llc-bench perf stat -e LLC-loads,LLC-load-misses taskset -c 0-7,32-39 ./llc-bench ``` ## Flag 说明 | Flag | 默认值 | 说明 | |------|--------|------| | `--workers` | 16 | worker 协程数,需与 taskset 绑定核数一致 | | `--ro-mb` | 88 | 只读共享集大小(MB)。远大于 LLC,随机访问 → ~0% 命中。增大→L3/DRAM bound 升高、命中率降低 | | `--rw-mb` | 4 | 读写共享集大小(MB)。**必须小于 LLC**,顺序访问 → 高命中。增大→命中率差距增大(但超过 LLC 后命中率反而趋同) | | `--compute` | 448 | 每次操作的 PRNG 迭代数。增大→core bound 升高,减小→memory bound 升高 | | `--duration` | 0 | 测量时长。0 = 无限期运行,按 Ctrl+C 停止 | ## 调参指南 ### Top-Down 微架构指标调优 | 指标 | 调节旋钮 | 方向 | |------|----------|------| | **Core Bound** | `--compute` | 增大→升高,减小→降低 | | **L3/DRAM Bound** | `--ro-mb` | 增大→升高,减小→降低 | | **L1/L2 Bound** | — | 固定(32KB 指针追踪,4 次依赖链 load) | **目标**:Core Bound ~44%,Memory Bound ~46%(两种绑核配置均稳定) - Core Bound 太高 → 减小 `--compute` - L3/DRAM Bound 太高 → 减小 `--ro-mb` - Core Bound 太低 → 增大 `--compute` - L3/DRAM Bound 太低 → 增大 `--ro-mb` - 跨 cluster 时 Core Bound 异常升高 → 增大 `--rw-mb`(更多 RW load 填满 LSQ,使一致性 stall 归入 Memory Bound) ### LLC 命中率调优 | 目标 | 调节旋钮 | 方向 | |------|----------|------| | 整体命中率偏高 | 增大 `--ro-mb` | RO 冷基线占比更大 | | 整体命中率偏低 | 减小 `--ro-mb` | RO 冷基线占比更小 | | 同/跨差距太小 | 增大 `--rw-mb` | 更多热负载受一致性影响(但不超过 LLC) | | 同/跨差距太大 | 减小 `--rw-mb` | 减少一致性敏感的负载占比 | **注意**:`--rw-mb` 必须小于 LLC 大小。超过 LLC 后 RW 失去时间局部性,同/跨命中率趋同,差距消失。 ### 吞吐差距 - `--compute` 小 → memory-bound → LLC miss 代价充分暴露 → 吞吐差距大(接近 40%) - `--compute` 大 → core-bound → 内存延迟被计算掩盖 → 吞吐差距小 ## 输出示例 ``` === LLC Contention Benchmark === workers: 16 RO set: 128 MB (2097152 entries, 16 loads/op) RW set: 4 MB (2048 entries, 2048B buf, 6 reads + 3 writes/op) L1 local: 32 KB (4 dependent loads/op) total shared: 132 MB compute: 448 duration: until Ctrl+C --- Measuring... ^C --- throughput: 42.18 Mops/s ```