Offset Based Pointer Prefetcher(Arm US10445241B2)[2019]: Prefetching using offset data to access a pointer within a current data element for use in prefetching a subsequent data element
| Title | Patent Number | Inc. | Year | Source | Filing Date | Status |
|---|---|---|---|---|---|---|
| Prefetching using offset data to access a pointer within a current data element for use in prefetching a subsequent data element | US10445241B2 | ARM Ltd | 2019 | https://patents.google.com/patent/US10445241B2/en | 2018-03-06 | Grant |
这件专利保护的是一种“结构感知”的硬件预取器:从程序迭代访问的数据元素中学习 memory address relationship,把关系编码为 offset data,并在当前元素被访问时提前推出下一元素地址
TLDR:
- 面向 linked-list 场景:offset data 表示“当前 data element 内部指针字段相对 data element/trigger address 的位置”,预取器用它读出当前元素中的指针,再据此预取 subsequent data element
- 专利还覆盖 array-of-pointers:Offset 1 是相邻 pointer slot 的距离,Offset 2 是 pointer target/reference address 到真正 trigger access 的距离;lookup 时先找下一 pointer,再用 Offset 2 定位下一元素的触发访问位置
- 与 Apple DMP/IMA 的关系:二者都属于“硬件根据数据值/指针值触发间接预取”的范畴;本专利更强调 PC/history/structure table 学习到的稳定数据结构,而 Apple DMP/IMA 通常被观察为数据值驱动、更容易把 pointer-looking data 当作地址的间接预取行为
背景和动机
专利的背景很直接:处理器执行循环时,连续迭代会访问一组 data elements;如果能够在当前迭代访问当前元素时提前取回下一迭代要用的元素,就可以隐藏 cache miss 和内存延迟。传统 stride/table 预取容易覆盖相邻数组或固定步长结构,但对链表、对象图、指针数组这类“下一地址需要先读一个指针才能知道”的访问不够有效。
这件专利的动机是把“数据结构关系”显式学习并缓存下来。预取器不是只看地址流是否等差,而是维护 data element structure memory / data structure table,记录 trigger PC、触发地址、关系类型、Offset 1、Offset 2 等字段。这样它可以对 table、linked list、array of pointers 以及多级指针组合使用不同的地址推导方式
Insight
核心洞察是:很多非规则访问并非完全随机,而是“当前元素内的固定字段”或“指针数组中的固定步长 slot”在表达下一元素地址。只要硬件能把这些字段位置学成 offset data,就可以把一次本来串行的 pointer chasing 拆成可提前执行的微流程
专利里 offset data 有几种含义:
- Table/array-of-structs:Offset 1 是连续 data element 的 trigger address 之间的位移,例如 B-A。预取器在 A 触发后直接预取 A+Offset 1。
- Linked list:Offset 1 是当前元素 trigger access 到该元素内 pointer 字段的距离;Offset 2 是 pointer 指向的 reference address 到下一元素 trigger access 的距离。预取器在当前元素触发后读
current + Offset1处的 pointer,再计算pointer_target + Offset2 - Array of pointers:Offset 1 是当前 pointer slot 到下一 pointer slot 的距离;Offset 2 是 pointer target/reference address 到目标 data element trigger access 的距离。预取器用
current_pointer_location + Offset1找下一指针,再用返回的 pointer target 加 Offset 2 得到下一 trigger address。
与 Apple DMP/IMA 的关系
共同点:都落在 indirect / data-dependent prefetch 方向:硬件观察到某个数据值像地址,就可能据此发起下一层内存访问。尤其是专利中的 pointer detector 会扫描 cache line 中的 word,用地址高位匹配和对齐位判断它是否可能是 pointer;这与 Apple CDP 的 “pointer-looking value 触发预取”的外在行为很接近
差异在于:
- 触发条件:本专利以 trigger PC、迭代历史和已学习结构关系为入口;Apple DMP/IMA 更常被描述为对 load data value 的自动地址解释。
- 地址公式:本专利有明确公式,例如
current + Offset1 -> pointer -> pointer + Offset2或pointer_slot + Offset1 -> pointer -> pointer + Offset2;Apple CDP 的公开观察重点通常是“load 值被当作地址预取”,不一定暴露这种结构表和 Offset 1/2 模型 - 安全含义:二者都会制造数据依赖的 cache footprint。本专利若实现得激进,也可能把秘密数据中碰巧像指针的 word 送入 pointer cache 并造成可观测预取;但专利文本给出的阈值、PC history、MSB/LSB 检查和结构学习会限制其触发范围
核心设计
专利提出的整体结构由处理器、cache/memory system、prefetcher、structure memory 和 detector 组成。
- detector 在学习路径上从历史访问、pointer-looking values 和触发 PC 中识别结构关系
- prefetcher 在 lookup 路径上用 structure memory 中的关系推出 subsequent data element 并发起预取

设计点 1: 用 offset data 表达数据结构关系

针对的问题:普通地址流预取只能很好地覆盖线性/规则地址,无法表达“下一元素地址藏在当前元素的某个字段里”。
解决的思路:把访问关系抽象为结构类型和 offset data,而不是只保存下一地址。结构表至少能表达 table、linked list、pointer table/array-of-pointers,以及更复杂的多级组合
设计:
- 学习阶段比较连续 trigger addresses;如果差值小于阈值,可记录为 table 的 Offset 1
- 对 pointer table,比较连续 parent/pointer addresses;如果差值小于阈值,可记录 pointer slot 之间的 Offset 1
- 对 linked list,比较 pointer target/reference address 与当前/下一 trigger address 的关系,得到当前元素内 pointer 字段位置和 Offset 2
设计点 2: pointer within current data element

- subsequent data element 的内存位置由 current data element 内某个 pointer 字段指向;
- memory address relationship 里的 offset data 表示该 pointer location 相对 data element 的位置
- 预取器对当前元素应用这个 offset,访问当前元素内部的 pointer,然后用 pointer value 预取下一元素。
1 | current element |
这个机制本质上是在硬件里提前执行一段简化的链表遍历:当前迭代刚碰到当前元素时,prefetcher 通过 Offset 1 找到下一节点指针;pointer 返回后,再用 Offset 2 定位下一迭代的触发访问位置。
专利还提到可以继续递归:预取 subsequent data element 后,再检测其中指向 further data element 的 pointer,形成多步预取
设计点 3: linked-list 与 array-of-pointers 的统一处理

Linked-list 场景:
- Offset 1:当前元素 trigger access 到当前元素内 next pointer 字段的距离。
- Offset 2:next pointer 指向的 reference address 到下一元素 trigger access 的距离。
- lookup:读
A + Offset1,得到 pointer target;再预取pointer target + Offset2附近的 cache line。
Array-of-pointers 场景:
- 当前访问位置可能是指针数组中的某个 pointer slot。
- Offset 1:相邻 pointer slot 的地址间隔。
- Offset 2:pointer target/reference address 到目标元素 trigger access 的偏移。
- lookup:读
current_pointer_slot + Offset1得到下一元素指针,再预取next_pointer_target + Offset2。
1 | array of pointers: P[i] ----> element i reference ----> trigger i |
统一性:
- linked list 的 Offset 1 是“元素内字段位置”
- pointer array 的 Offset 1 是“指针槽之间的步长”
但二者都被存入结构表,并且都需要等待一个间接读返回后才能加 Offset 2 完成下一 trigger address 计算
设计点 4: detector、pointer cache、history buffer 和 pending table

- History buffer 保存触发访问的 PC,用当前 PC 命中历史项来启动 lookup
- Pointer cache 在 cache line fill 时扫描每个 word
- 64-bit 架构下要求若干 MSB 与 trigger address 匹配且低 3 位为 0;
- 32-bit 架构下低 2 位为 0
- hit 则被当作 potential pointer,记录 location 和 target
- Global history buffer 汇总 trigger address、parent/pointer address、Offset 2 等信息,用于识别 table、pointer table、linked list。
- Data structure table 记录 triggering history index、triggered history index、relationship type、Offset 1、Offset 2。
- Pending table 在 linked list / array-of-pointers lookup 中保存 Offset 2 和 SMS pattern,因为预取器需要先发起一次读 pointer 的请求,等 pointer data 返回后才能计算下一 trigger address
1 | update path: |
设计点 5: 与 Spatial Memory Streaming 的组合

专利明确说该技术可与 Spatial Memory Streaming 共存。这里的分工是:
- 本专利负责跨 data element 找到“下一元素的 trigger access”
- SMS 负责在一个 data element 内,根据相对 trigger access 的多个稳定访问位置,预取同一元素内部的其他 cache lines
因此结构表查到下一 trigger address 后,可以连同 SMS history buffer 中的相对访问模式一起发起预取:先到下一元素,再取下一元素内部预计会被访问的多个位置