【问题标题】:What is conditional assembly branch instruction duration for different situations in ARM Cortex-M4?ARM Cortex-M4 中不同情况的条件汇编分支指令持续时间是多少?
【发布时间】:2021-11-29 10:46:11
【问题描述】:

我正在尝试确定以下简单延迟循环的时钟周期的确切持续时间:

loop:  subs        r2, r2, 1 
       bne         loop 

Cortex-M4 Technical Reference Manual 表示:1 + P,其中 P 是:

管道重新填充所需的周期数。这个范围从 1 到 3,取决于目标指令的对齐方式和宽度,以及处理器是否设法提前推测地址。

ARM9(5 级流水线)在这种情况下对于 bne 有 3 个周期,对于 subs 有 1 个周期。 Cortex-M4 有一个 3 阶段的流水线,但看起来非常相似,因为前两个阶段是相同的......

所以我的问题是:根据参考手册,它可以是 2 到 4 个周期,对吗?什么时候是2,什么时候是3,什么时候是4?在 3 级流水线中,至少有 3 个周期是合乎逻辑的,但似乎只有 2 个周期是可能的。是否涉及某种分支预测?

【问题讨论】:

  • 这不是确定性的。它可以是可重复的,但是如果您更改代码的对齐方式和其他因素,相同的循环、相同的机器代码将需要不同数量的系统时钟来执行。一些实现在闪存和 CPU 之间有一个缓存,您无法关闭。
  • 你到底想做什么?如果是延迟循环,请使用计时器。您将很难将这样的循环用于固定延迟,您可以使用大于或等于类型的延迟,这非常好。
  • 您使用的是 thumb2 扩展程序还是原始拇指指令?您的处理器是一次取一个字还是一次取一个半字(某些内核具有该选项,这取决于芯片供应商)。你的内存或闪存用完了吗?
  • 笔芯将受芯片(而不是内核)的约束,因此是特定于实现的。我经常使用这个循环来展示同一系统内的广泛性能差异。你现在应该已经看到了吧?
  • 也许我应该改写我的问题 - 根据 refman 它可以是 2 到 4 个周期 - 对吧?什么时候是2,什么时候是3,什么时候是4?在三阶段管道中,至少有 3 个周期是合乎逻辑的,但似乎只有 2 个周期 - 是否涉及某种分支预测?

标签: arm cortex-m


【解决方案1】:

Cortex-M4 没有分支预测功能(至少在实际执行分支之前它不会开始执行分支)。然而,它确实包含一个预取单元 (PFU),它从其 FIFO 中的内存中获取下一个(连续的)指令,因此它们可以由执行单元直接访问。 它还推测性地从分支目标地址预取指令。这意味着如果在第二个流水线阶段已知(条件)分支目标,则该内存地址将被预取。

Cortex-M4 技术参考手册确实说分支指令的时钟周期数是1 + P,其中P 是流水线重新填充所需的周期数。 它还包含一个脚注:

如果分支不被采用,条件分支在一个周期内完成。

所以,这意味着分支指令本身的执行(即检查条件是真还是假)只需要一个时钟周期。如果条件为假,不进行分支,则执行单元可以直接继续执行下一条指令,该指令已经被PFU预取。但是,如果条件为真并且采用了分支,则必须刷新并重新加载部分管道。我无法准确判断这需要 1 个周期或 3 个周期,但如果目标指令是 16 位对齐地址上的 32 位指令,则可能需要额外的内存读取,因为内存总线是 32 位的(因此“取决于目标指令的对齐方式和宽度”)。我不完全确定“以及处理器是否设法提前推测地址”部分。我猜这是因为文档中的P 也用于诸如MOV PC, Rm 之类的指令,其中可能存在数据依赖性,因为该指令没有固定的偏移量(Rm 的值尚不清楚在解码时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2014-05-04
    • 2021-07-23
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多