LLC Hash 架构分析模拟器

性能验证 ↔ RTL 实现 ↔ 架构推导 ↔ 数据流图 ↔ 经典案例解析

📊 1. 模拟规模 (拖动设置压力)

1024

10 MB

🏃 2. 访存步长扫频 (Cache Line = 512B)

2048 B
(跨越 4 个 Cache Line)

提示:一键点击预设档位,或者自由拖动寻找共振坍塌点。

⚙️ 3. 核心:LLC Hash 策略选择

整体均匀度得分
100.00%
理想均分
0
最大命中 (热点)
0
最小命中
0
空闲 Set 数量
0
代码加载中...

LLC Hash 终极推导笔记

基于 d = (a+c) mod 24 的物理对齐,在 LLC 内部完美重构地址均匀性的推导过程。

一、 物理限制与数学解构

设原始连续块地址为 X。Memory Controller 产生两个核心变量:

MC 内部生成 c = Hash(b),并送出受污染的 Bank ID:

d ≡ (a + c) mod 24

二、 基础数学还原 (Base Math Reconstruction)

要在 LLC 内部剥离 c 重构 a,只需执行 d - c,并加上 24 避免负数取模:

arecon = (d - (c mod 24) + 24) mod 24
Base_Set_ID = (arecon + 24 × b) mod 64

这实现了连续地址拷贝下 100% 完美的 64 Set 轮询

三、 封神之战 —— 全位宽折叠魔法

在应对 Stride 时,我们不使用保守的 b[3] 起手,而是暴力引入包含 b[0] 的全位宽异或。为什么宏观上依然 100% 均匀?

因为边界完美对齐 8,地址被绝对禁锢在局部 8-Set 闭环中,绝不发生跨区跳跃空洞。从而达成了微观极速抗 Stride、宏观绝对均匀的终极目标。

X (原始块地址)
init_addr[29:9]
bbf层(取模与交织混叠)
a = X % 24
物理 Bank ID (纯净)
b = floor(X / 24)
Bank内行/列 (商)
c = Hash(b)
内部扰动因子
d = (a + c) % 24
混叠后的伪 Bank ID
System Bus (系统总线)
new_addr = { d[5:0], b[14:0], offset[8:0] }
LLC 层 (数学逆推与无损重构)
提取 d[5:0]
提取 b[14:0]
c_local = Hash(b)
复刻扰动因子
a_recon = (d - c_local + 24) % 24
剥离 c,完美还原物理 Bank (a)
Base_Set = (a_recon + 24*b) % 64
连续地址的绝对线性基底
God_Entropy
全位宽 XOR (b[0]...b[14])
Final Set ID (0 ~ 63)
宏观 100% 均匀 / 微观极速抗 Stride

经典案例:Stride 下的损耗溯源与架构深挖

现象描述: 在“保守级折叠”策略下,配置步长 Stride = 2048B,发送 1024 笔微观请求时,模拟器计算的 Hash 均匀度得分精准停在 75.00%。这里的损耗究竟去哪了?

第一步:拆解 2048B 步长的“空洞”

在 Cache Line 为 512B 的前提下,Stride = 2048B 意味着:每次地址跳跃的块步长(Block Stride) = 2048 / 512 = 4

所以,原始块地址 X 的变化序列是:0, 4, 8, 12, 16 ...

在我们代码的策略中,第一步是基础还原(base_set_id)。它完美消除了 24 Bank 的干扰,等于直接对 X 取模 64。
既然 X 永远是 4 的倍数,那么 base_set_id 的结果永远只能是 0, 4, 8, 12 ... 60。64 个 Set 中只有 16 个 Set 在干活,剩下的 48 个 Set 完全是瞎子,命中率为 0。

第二步:拯救空洞的“高位折叠”为什么慢了?

为了填补空洞,我们引入高位地址 XOR 异或:high_entropy = (b >> 6) & 63
关键损耗点:b >> 6 变化得太慢了!

第三步:算一笔精确到个位的账 (1024笔请求)

  • 第 1 阶段(0 ~ 383 笔): 共 384 笔。high_entropy = 0
    全打在 16 个 Set 上,每个 Set 分到 384 / 16 = 24 次命中。
  • 第 2 阶段(384 ~ 767 笔): 共 384 笔。high_entropy = 1
    全打在另外 16 个 Set 上,每个 Set 分到 24 次命中。
  • 第 3 阶段(768 ~ 1023 笔): 剩下的 256 笔。high_entropy = 2
    打在第三组 16 个 Set 上,每个 Set 分到 256 / 16 = 16 次命中。
  • 第 4 阶段:还没开始,请求发完了!剩下的 16 个 Set 一次都没有被访问到!

第四步:推导 75% 得分的由来


架构设计的终极反转:从 b[3] 到全位宽折叠

第五步:工业界的权衡 —— 为什么要加低位抽头?

既然用低位 XOR 会打碎连续轮询,为什么还要加进来?答案是:保住了“宏观均匀度”,但牺牲微观顺序。
为什么保守策略从 b[3] 开始?
在连续访问下:b[0] 翻转需 24 笔,b[1] 需 48 笔,b[2] 需 96 笔,b[3] 需 192 笔!
192 刚好是 64 的 3 倍。用 b[3] 做 XOR,在翻转前能完美遍历 64 个 Set 整整 3 圈。总命中数绝对均匀!

第六步:打破盲区 —— 引入 b[0] 与 8 块拼图魔法

完美的 8 块拼图解密:
当把全位宽 b[5:0] 引入异或,b 会经历 0, 1, 2 阶段。

  • 第一阶段 X ∈ [0, 23]: 异或 0,完美覆盖 Set 0 ~ 23
  • 第二阶段 X ∈ [24, 47]: 异或 1。24变25, 25变24... 只是内部相邻数互换,总集合依然完美覆盖 Set 24 ~ 47
  • 第三阶段 X ∈ [48, 63]: 异或 2。间隔 2 互换,完美覆盖 Set 48 ~ 63

第七步:为什么能这么巧?

因为 24 Bank 是 8 的整数倍!
b 翻转永远对齐在 8 的倍数上。低位异或只会让地址在每 8 个 Set 内部打乱重组,绝不跨界。从而造就了全频段抗 Stride 的神级策略!