是否与某些预取技术有关? 或者具有DDR访问时序特性?
如果我没记错的话,从 ARMv5TE 开始,写入缓冲区和L1 缓存的路径是 64 位宽,以容纳 LDRD/STRD 指令。这允许 STM 每个周期写入两个寄存器。
您还可以节省一点 L1 指令缓存,并在双核上仅使用一个管道,这也是一项额外的收益。
更多的指令、更多的取指周期以及更多的执行指令,需要更长的时间。
总线是或可以是 64 位宽。对于单个寄存器 stm,没有任何增益,但是对于多个寄存器,可以减少移动数据的总线周期数,并且根据内存系统,如果是 64 位宽,则不需要没有读取-修改-写入,这也很慢。
如果必须对缓存进行读-修改-写操作(通常是直写),则会损失缓存空间以及读取成本。即使它在缓存中命中,读取-修改写入也可能会让您付出代价。
您可以访问 ARM 网站并下载 amba/axi 规范并查看总线事务如何工作。每个事务都涉及多个时钟周期(多个事务可以同时进行,是的)。一旦克服了开销,每 64 位数据就需要一个时钟,因此 128 位比 64 位需要多一个时钟来传输。 32 位和 64 位需要相同数量的时钟来传输(如果对齐)。
我不能代表所有架构,但我相信至少在我看到的一种架构上,每次传输仅读取实际上会执行超过 64 位的操作。写入被分成单独的 64 位传输。我可能记错了。
如果您以未对齐的方式读取或写入四个字的数据,我相信这会变成四次单独的传输,一次用于每个奇数字,一次用于中间对齐的 64 位。所以对齐很重要。
什么时候是真的?
根据这个方便的表格,
STM
指令需要2个周期来存储单个寄存器,或者需要n周期来存储n寄存器(当n> 1时)。
另一方面,
STR
始终需要 1 个周期。
你什么时候发现
STM
比STR
快?
STM
较慢。另一方面,上面的参考是针对ARM9TDMI架构的,ARM有很多。