【问题标题】:For ARM, why a single STM instruction is generally faster than multiple STR instructions?对于 ARM,为什么单条 STM 指令一般比多条 STR 指令快?
【发布时间】:2013-03-08 04:12:59
【问题描述】:

是否与某些预取技术有关? 还是具有 DDR 访问时序特性?

【问题讨论】:

    标签: performance assembly arm cpu-architecture


    【解决方案1】:

    什么时候是真的?

    根据this handy tableSTM指令需要2个周期来存储单个寄存器,或者n个周期来存储n个寄存器n > 1.

    另一方面,STR 总是需要 1 个单周期。

    你什么时候知道STMSTR 快?

    • 对于一个寄存器,STM 更慢。
    • 对于 n 个寄存器 (n > 1),它们是相同的。

    另一方面,上面的参考是针对ARM9TDMI架构的,ARM有很多。

    【讨论】:

    • +1 表示图表,-1 因为我认为您没有正确阅读图表。数据总线如你所说。 STR[1N] 与 STM[1N + (n-1)S] 的 大假设 内存总线是零/对称等待状态。对于 I 通道,它是 STR[1S] vs STM[1S+(n-1)I]。 “I”表示如果下一条指令不依赖于寄存器,它们可以立即运行。即使是 ARM9TDMI,也有区别。
    • 在最近的一次实践中,我发现当 L1 缓存和 MMU 禁用时,memset(用 STM 实现)比 for 循环赋值要快得多。 @unwind
    【解决方案2】:

    IIRC 从 ARMv5TE 开始,写入缓冲区和 L1 缓存的路径为 64 位宽,以适应 LDRD/STRD 指令。这允许 STM 每个周期写入两个寄存器。

    您还将节省一些 L1 指令缓存,并且在双发内核上仅使用一条管道,这也是一个额外的收获。

    【讨论】:

      【解决方案3】:

      更多的指令,更多的获取周期,更多的指令执行,需要更长的时间。总线是 64 位宽或可以是 64 位宽,对于单个寄存器 stm 没有增益,但如果使用多个寄存器,则可以减少用于移动数据的总线周期数,并且取决于内存系统,如果64 位宽你没有读-修改-写,这也很慢。如果它必须读取-修改-写入到缓存中,通常是写入,您会丢失缓存空间以及读取成本。即使它在缓存中命中,读取-修改写入也可能会花费您。

      您可以访问 arm 站点并下载 amba/axi 规范并查看总线事务如何工作,一旦您获得,每个事务都涉及多个时钟周期(多个事务可以同时进行,是的)除了开销之外,每 64 位数据需要一个时钟,因此 128 位比 64 位需要多一个时钟来传输。 32 位和 64 位传输相同数量的时钟(如果对齐)。

      我不能代表所有架构,但我相信至少在我看到的一种架构中,每次传输实际上只有读取会超过 64 位。写入被分成单独的 64 位传输。我可能记错了。

      如果您移动 4 个字的数据,读取或写入,未对齐,我相信这会变成 4 个单独的传输,一个用于每个奇数字,一个用于中间对齐的 64 位。所以对齐很重要。

      【讨论】:

      • 我认为这与 AXI/AMBA 无关。通常存储会首先访问作为核心的一部分并且不连接到内部总线的写缓冲区。
      • 核心有 l1 缓存,接口不是 amba/axi,当然,但是如果有未命中,它会转到 amba/axi 上的 l2 缓存,然后如果未命中它在另一辆 amba/axi 巴士上行驶。无论哪种方式,更多的指令意味着更多的单独事务,每个事务都有开销。如果有一个 mmu(如果有缓存,通常有一个),我忘了添加 mmu,这进一步增加了每笔交易的间接费用。
      • @dwelch:对于 MMU,只有一个(可能两个)TLB 命中/未命中。在这两种情况下都是一样的(对于数据)。除非你在谈论代码;多个STR fetches 加上多个STR 填充代码缓存会降低效率。
      • 如果它错过了 tlb,它必须进入 ram,它可能会错过 l1 并错过 l2 并进入 ram,它可能至少需要一个或两个额外的时钟,或者很多时钟方式它是多个 strs 和一个 stm 之间可测量的、明显的差异。
      • 是的,但您只是在谈论代码。那是对的吗?无论如何,数据都是一样的。或者我不明白。数据将位于相同的页面中,因此无论在何处完成 TLB 查找都是相同的?
      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2021-11-13
      • 2014-07-28
      相关资源
      最近更新 更多