对于ARM来说,为什么单个STM指令通常比多个STR指令更快?

问题描述 投票:0回答:3

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

performance assembly arm cpu-architecture
3个回答
7
投票

如果我没记错的话,从 ARMv5TE 开始,写入缓冲区和L1 缓存的路径是 64 位宽,以容纳 LDRD/STRD 指令。这允许 STM 每个周期写入两个寄存器。

您还可以节省一点 L1 指令缓存,并在双核上仅使用一个管道,这也是一项额外的收益。


4
投票

更多的指令、更多的取指周期以及更多的执行指令,需要更长的时间。

总线是或可以是 64 位宽。对于单个寄存器 stm,没有任何增益,但是对于多个寄存器,可以减少移动数据的总线周期数,并且根据内存系统,如果是 64 位宽,则不需要没有读取-修改-写入,这也很慢。

如果必须对缓存进行读-修改-写操作(通常是直写),则会损失缓存空间以及读取成本。即使它在缓存中命中,读取-修改写入也可能会让您付出代价。

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

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

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


2
投票

什么时候是真的?

根据这个方便的表格

STM
指令需要2个周期来存储单个寄存器,或者需要n周期来存储n寄存器(当n> 1时)。

另一方面,

STR
始终需要 1 个周期。

你什么时候发现

STM
STR
快?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.