【问题标题】:ARM Cortex-A8 L2 cache miss overheadARM Cortex-A8 L2 缓存未命中开销
【发布时间】:2019-08-12 23:11:07
【问题描述】:

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

【问题讨论】:

  • 这就是缓存的原因。如果您使用 dram 运行,28 似乎很小,但引用说“至少”。当然,很大程度上取决于您的系统。当然,如果处理器向前移动所需的指令或数据被这些缓存未命中所阻碍,它将(最终)停止管道。
  • 很可能在 L1/L2 中连续出现一个、两个、许多未命中,这会导致每个时钟数十个。如果缓存中只有可用的脏行并且您必须等待写回 dram 发生在读取发生之前,情况会变得更糟。你也可以很幸运,让一个操作导致驱逐,但该操作的结果需要刚刚被驱逐的东西。这就是计算机现在的工作方式,处理器本身并不决定性能。
  • dram 通常不在 arm 域内,因此 arm 只能记录它们的部分。芯片供应商选择 DRAM 技术和 IP,电路板供应商选择 DRAM 部件,并且在某个地方,有人在该 DRAM 的选择范围内选择速度。这些选择被添加到 arm 记录的数字中。

标签: arm cpu pipeline cpu-cache cortex-a


【解决方案1】:

即使在缓存未命中的情况下,管道也会继续运行,直到 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 个周期(总缓存未命中)

【讨论】:

  • 谢谢,我还有一个问题。 Cortex-a8 是一个有序处理器,如果 Cortex-a8 是一个无序处理器,这种行为会如何改变?另外我认为,在您的示例中,分支预测单元将预测分支后的程序流并推测性地执行一些指令,如果在这个推测性执行期间我们有另一个 L2 缓存未命中然后 cpu 发现它有错误的推测,它将取消第二个 L2 缓存错过并且没有在缓存中加载第二个数据??
  • @alirezasadeghpour rob(重新排序缓冲区)的大小和循环大小对无序内核很重要。如果rob 对给定循环足够大,则根本不会有延迟,所有执行管道都将被填满,从而获得最佳性能。如果循环包含太多的指令,如果指令序列有太多的依赖关系等,就会有这里和那里的延迟。您无法确定,可能影响性能的因素太多了。只要保持循环大小和依赖关系,并希望最好。
  • @alirezasadeghpour 请记住,无序核心的大小和价格至少是有序核心的三倍,并且消耗的功率也比有序核心多得多,因此,总会有 -为big.LITTLE 配置甚至独立架构订购新架构的版本。始终为有序版本尽力而为,并将无序的好处视为额外的性能提升。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2011-07-27
  • 2015-08-17
  • 2020-05-19
  • 2019-12-14
相关资源
最近更新 更多