2026 ASPLOS: PF-LLM: Large Language Model Hinted Hardware Prefetching
这篇论文提出了一种新的职责分配方式:把原本必须在运行时,极短时延内完成的预取决策,转移到离线的大模型静态分析里;运行时硬件只负责极轻量地执行这些 hints
背景问题
论文聚焦 硬件数据预取(hardware data prefetching)
已有方案主要有两类:
- 单一专用预取器
- 问题: 现实程序的访存模式是分阶段变化的,一个程序内部往往同时混有多种模式,所以单一预取器很难全覆盖
- prefetcher ensemble(预取器集成): 把多个预取器拼在一起,然后再用一个在线策略决定:
- 某个 demand request 要喂给哪个子预取器训练
- 某个子预取器发出的 prefetch request 是否真的需要发出
问题:这类在线管理策略通常依赖运行时试错和学习,适应慢,而且受芯片面积, 功耗, 时序约束,策略一般比较简单
论文的观察是:对很多 load 指令来说,最佳预取策略其实能从静态代码上下文里看出来
作者的思路是:用LLM 来自动做这个判断
- LLM 能做“代码语义级”理解
- 传统硬件预取器观测的是地址流
- 编译器启发式往往也只是局部模式匹配
- LLM 可以从代码上下文中推断更高层语义
- LLM 可以自动学习启发式,而不是手工写规则
- 比 PGO 更泛化
- PGO 是“这个程序在这些输入下 profiling ,再总结最佳策略”
- PF-LLM 是“从很多程序的整体经验里,学出一般规律,再去推断新程序”
- 直接工作在 assembly 上
- 即使是闭源二进制,只要能静态反汇编,就能分析
核心思想
这篇论文提出两部分组成的框架:
- PF-LLM:离线分析 assembly 上下文,为每条 load 指令生成预取 hints
- LMHint Prefetcher:运行时硬件预取框架,消费这些 hints,驱动一个预取器 ensemble
不是让 LLM 直接在线控制硬件;而是:
- 离线:LLM 读代码,预测“这条 load 应该用什么预取器, 预取激进程度, 是否该屏蔽某些子预取器的训练输入”
- 在线:硬件用一个很小的查表结构按 PC 取 hint,然后按照 hint 预取
PF-LLM
Input
输入: 反汇编后的 assembly (主要时为了针对闭源二进制)
目标 load 周围的 257 行 assembly (目标 load 前 128 行 + 后 128 行)
Output
PF-LLM 针对每个 load instruction 输出三类 hint:
- Prefetcher Selection:这条 load 最适合哪一个子预取器
- Prefetch Degree:该预取得保守, 中等还是激进
- Demand Request Filtering:这条 load 的 demand request 不要输入到哪个子预取器训练,以避免污染它的内部状态
没有试图让 LLM 直接预测具体预取地址,而是预测 policy-level control signal (更容易嵌入现有硬件)
Model
模型: Qwen-2.5-Coder-0.5B-Instruct
原因很直接:
- 任务高度专门化;
- 不需要特别大的通用推理能力
- 小模型训练和推理便宜
- 更适合未来离线批量部署
输入输出约束成 JSON:
- 训练和推理都通过 instruction-tuned 格式包装
- 要求模型输出结构化 JSON,其中包含
"PF Sel","PF Degree","Filter" - 用
<load>...</load>专门标出目标 load 的位置,并把这两个 tag 作为特殊 token 加进 embedding table
训练数据: 怎么构造 ground truth
- 先选定一个预取器集合和各自可选 degree
- 对 benchmark 程序做大量 ChampSim 仿真
- 对每条 load PC,记录在每种预取策略下的 AMAT
- 选 AMAT 最小的配置作为这条 load 的最优策略标签
- 选表现最差的预取器,作为可过滤对象的候选
标签不是人工语义标签,而是“通过架构仿真得到的性能最优标签”
将问题从自然语言/代码理解,转成了一个 静态代码 → 微结构最优决策 的监督学习问题
运行时硬件 LMHint Prefetcher
两级结构:
- PHT(Prefetch Hint Table):主存里的大表,按 load 的虚拟 PC 索引
- 预取 hint 是静态的,适合按 PC 建表
- PHB(Prefetch Hint Buffer):片上的小 buffer,类似 TLB,缓存最近使用的 hints
运行时流程:
- load 发射
- 用 PC 查 PHB
- 取出 8-bit hint
- 控制 ensemble
每条 hint 为 8 bit:
- 4 bit:prefetcher selection 决定允许哪个子预取器给这条 load 发 prefetch
- 2 bit:degree 决定它的 aggressiveness
- 2 bit:filtering policy 决定某个子预取器是否不该接收这条 demand request 作为训练输入
Demand Filtering
传统 ensemble 的一个问题在于:
- 有些高级 spatial prefetcher 不是按单个 PC 索引的,而是跟踪更大区域、更复杂的访问关系
- 如果用简单的 PC-centric 选择逻辑作为开关预取器的输入,可能会污染它的状态,反而让它失效
作者认为 demand filtering 能帮助 ensemble:
- 让某个子预取器只训练它擅长的那部分访存
- 避免不相关 load 破坏其模式检测
作者承认: 不是所有预取器都适合做 filtering
对于 Pythia, Bingo, DSPatch, Sandbox, SMS 这类复杂预取器,他们明确限制 不对其进行 demand filtering,因为这类组件对输入状态很脆弱
实验
Setup
作者在 ChampSim 上做实验,核心配置接近 Arm Neoverse N2 风格的单核系统
训练集使用 SPEC 2006 memory-intensive benchmarks,测试集使用 SPEC 2017 memory-intensive benchmarks,刻意避免数据泄漏
训练方面:
- 基模:Qwen-2.5-Coder-Instruct
- 8 张 NVIDIA H20
- BF16
- lr = 1e-5
- effective batch size = 64
- 2 epochs
loss 只算在模型输出的 JSON token 上,不算输入 assembly 和 prompt
(目的是使模型专注于学 hint 预测,而不是记输入文本)
1. 模型精度
PF-LLM 在 held-out test set 上达到 95.0% 的策略预测准确率
错误预测往往不是随机乱选,而是接近 second-best option,因此性能损失有限。
2. SPEC 2017 上的性能
最完整配置 LMHint-SDF 相比:
- 最强单一预取器 Sandbox:平均 IPC 提升 9.8%
- 最强已有 ensemble 方法 Alecto:平均 IPC 提升 18.9%
3. 消融实验
作者定义了几种配置:
- LMHint-S:只用 selection
- LMHint-SD:selection + degree
- LMHint-SDF:selection + degree + filtering
- LMHint-SDFR:只保留最常用的四个子预取器的低成本版本
结果显示:
- selection 是最大头的收益来源;
- degree 在其上再加约 0.3% IPC
- filtering 再加约 0.3% IPC。
Reduced-cost 版本的意义:(LMHint-SDFR)
- 平均性能甚至比完整 SDF 高 0.01%
- 说明:不一定需要把 11 个预取器全都做进硬件里,做一个更小但被 LLM 强约束过的 ensemble,也可能够用
4. 真实 Web 服务负载上的结果
作者还测了真实应用:
- Apache HTTP Server
- MySQL
- RocksDB
- Xapian
并且把主存延迟提高 2×,模拟数据中心拥挤环境
结果显示 LMHint 仍优于所有单一预取器和 ensemble baseline
但这些 workload 的提升比 SPEC 温和,原因主要有两个:
- 这些应用更偏 I/O-bound,而不是纯 CPU/memory-bound
- 这些应用被人工优化得很充分,自带缓存/预取机制,增益空间较小
5. 开销分析
5.1 离线推理成本
- 在 1 张 NVIDIA H20 上,吞吐可到 234 req/s
- 对整个 SPEC 2017 套件生成 hints,总共要 38.5 分钟
- 在 16 核机器上编译整个套件约 25.4 分钟
结论:一次性离线开销,在开发部署流程里是可以接受的
5.2 存储成本
PHT(主存中) 中每条 entry 存:(合计 56 bit,即 7 byte / load)
- 48-bit virtual PC
- 8-bit hint
作者统计 SPEC 2017 后得出:
- 平均每 MB 可执行代码约有 10.62K 个 load instructions
- PHT 开销约 74.34 KB / MB binary,相当于 7.26% 静态程序体积增加。
Limits and Futurn Work
- 工程落地问题
- toolchain 与 binary distribution 流程集成
- OS/loader 配合: OS loader 可能需要针对 ASLR 做相应的处理
- ISA/平台迁移
- 多核共享 cache/带宽干扰
- 不同输入下同一 PC 策略漂移
- 安全与可验证性
- 训练的 loss 函数取决于:在作者给定的子预取器集合, degree 离散方式, 仿真环境下,哪种策略最优
- 但它不是对“真实世界最优预取行为”的完全逼近
- 标签生成使用的是逐 load 的局部最优启发式
- 作者按 load PC 选择最小 AMAT 的配置作为 ground truth
- 不同 load 之间会通过 cache, 带宽, MSHR, prefetch queue 相互影响
- 静态上下文不能覆盖动态 phase 行为
- 数据依赖驱动的路径变化
- 相同 PC 在不同输入上表现为不同模式
- 复杂 aliasing
- 多态/间接调用引起的控制流不确定性
- 同一 PC 在不同 phase 中访存局部性不同
- 只在单核, L1D, x86-64 静态二进制上验证
- 不支持 JIT / bytecode 程序