PAYATHON 2026

现代多核处理器中的 Line-Fill Buffer 如何工作?

社区小冯

结论

Line-Fill Buffer(LFB,也常称为 fill buffer)用于跟踪尚未完成的缓存行访问,并在数据返回时暂存缓存行内容。它是处理器内部用于处理瞬态请求的资源,不像 L1 那样保存有效缓存行并按替换策略管理。LFB 满时,新请求可能需要等待或受到回压,具体情况取决于处理器实现。

对于 Haswell 之后的 Intel 处理器,公开资料不足以确认所有微架构细节。特定时序下 LFB 如何与一致性状态机交互、共享 L2 如何组织相关请求,都不能仅凭 LFB 的名称推断。

LFB 跟踪什么

缓存未命中时,处理器通常需要访问更低层的缓存或内存。处理器必须记录请求对应的缓存行、请求的来源或类型,以及请求所处的阶段。这样才能把返回的数据交给正确的执行单元,并管理尚未完成的访问。

返回的数据也需要暂存位置。LFB 可以暂存正在填充的缓存行数据,供后续处理使用。在一些处理器中,等待中的加载还可能从相关的未完成填充中取得数据。这些数据只是在途暂存,并不意味着 LFB 是另一级能长期命中的缓存。

因此,LFB 不只是标记“有一个请求正在进行”。不过,条目具体包含哪些字段、数据如何分段暂存,以及哪些情况下可以向加载转发,都属于微架构实现细节。不能据此断言所有 Intel 代际的实现完全相同。

LFB 与缓存一致性

LFB 不是独立的缓存层,也没有一套与 L1、L2 并列的稳定缓存副本和替换规则。它处理的未完成请求仍受处理器缓存一致性机制约束;数据返回和缓存行状态更新都必须与相关一致性事务协调。

例如,核心 A 正在请求某条缓存行时,核心 B 对同一行发出 RFO(Read For Ownership),系统需要协调这两个请求,确保核心获得的数据和所有权符合一致性协议。协调过程可能涉及请求排序、取消或重新发起,以及检查返回数据的状态。仅凭“核心 A 的 LFB 中有数据”,无法判断某个具体实现采用哪种时序,也不能断定核心 B 的 RFO 一定会使 LFB 中的内容失效。

共享 L2 不会自动消除一致性要求。共享缓存会改变缓存层级和请求路径,但同一一致性域内的核心仍须遵守相应协议。不过,仅凭“共享 L2”这一点,无法推断 Gracemont 等具体实现中的目录、代理和请求处理细节。

LFB 与 L1 的区别

两者用途不同:

  • L1 保存可供后续访问命中的缓存行,并按缓存组织方式管理容量和替换。
  • LFB 跟踪尚未完成的缓存行传输并暂存相关数据,条目通常会在请求完成或取消后释放。

因此,LFB 通常不需要像 L1 那样选择一条有效缓存行进行替换。没有空闲条目时,处理器可能对新请求施加回压、让请求等待,或通过内部队列延后分配。具体行为,以及是否会让某类指令停顿,取决于微架构和当时的资源状态。

如何理解具体处理器行为

分析某一代处理器时,应区分公开资料能够确认的缓存层级和一致性行为,以及未公开的 LFB 内部实现。性能计数器、架构手册和优化手册有助于判断未完成缓存访问及资源压力,但通常无法单独证明 LFB 的精确结构、替换方式,或每种 RFO 竞争下的内部时序。

备注:内容仅供参考。