ARM Cortex-A8 L2 缓存未命中开销

ARM Cortex-A8 L2 cache miss overhead

我正在阅读 ARM Cortex-A8 数据 sheet,在数据 sheet 中,ARM 声明 L2 中丢失的加载数据至少需要 28 个核心周期才能完成,现在我无法想象在这 28 个周期中 CPU 会停止并将气泡放入管道或执行其他指令直到加载完成?如果我们有一个基于这个加载结果的分支怎么办?如果我们在 L2 中再次错过的那条指令之后有另一个加载怎么办?

即使在缓存未命中的情况下,管道也会继续运行,直到 RAW(先写后读)依赖项被咬住。

ldr     r12, [r0], #4
subs    r12, r12, r1
beq     end_loop

由于 RAW 相关性,subs 指令无法与 ldr 同时执行。
由于 CPSR RAW 依赖性,beq 指令无法与 subs 同时执行。

总而言之,上面的序列在最好的情况下需要 6 个周期:三个周期的指令执行加上 3 个周期的 L1 命中延迟,而在最坏的情况下(总缓存未命中)将是 3 + 28 = 31 个周期