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 个周期
我正在阅读 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 个周期