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

时间:2013-03-19 13:03:38

标签: arm

它与某些预取技术有关吗? 或者具有DDR接入时序特性?

3 个答案:

答案 0 :(得分:6)

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

您还可以节省一些L1指令缓存,并且在双发布内核上只使用一个管道,这也是一个额外的收益。

答案 1 :(得分:4)

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

你可以去武器网站并下载amba / axi规范并查看总线交易是如何工作的,每次交易都涉及多个时钟周期(多次交易可以一次飞行,是的)一旦你得到超过开销,它是每64位数据的时钟,因此128位比传输64位需要多一个时钟。 32位和64位需要相同数量的时钟进行传输(如果对齐)。

我无法代表所有体系结构,但我相信至少有一个我看到每次传输只有读取实际上会超过64位。写入被分解为单独的64位传输。我记得错了。

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

答案 2 :(得分:2)

什么时候是真的?

根据this handy tableSTM指令需要2个周期来存储单个寄存器,或 n 周期来存储 n 寄存器< em> n &gt; 1。

另一方面,STR总是需要1个单循环。

你什么时候得到STMSTR更快?

  • 对于一个注册表,STM较慢。
  • 对于 n 寄存器( n &gt; 1),它们是相同的。

另一方面,上面的参考文献适用于ARM9TDMI架构,并且有许多ARM。