【发布时间】:2013-03-08 04:12:59
【问题描述】:
是否与某些预取技术有关? 还是具有 DDR 访问时序特性?
【问题讨论】:
标签: performance assembly arm cpu-architecture
是否与某些预取技术有关? 还是具有 DDR 访问时序特性?
【问题讨论】:
标签: performance assembly arm cpu-architecture
什么时候是真的?
根据this handy table,STM指令需要2个周期来存储单个寄存器,或者n个周期来存储n个寄存器n > 1.
另一方面,STR 总是需要 1 个单周期。
你什么时候知道STM 比STR 快?
STM 更慢。另一方面,上面的参考是针对ARM9TDMI架构的,ARM有很多。
【讨论】:
IIRC 从 ARMv5TE 开始,写入缓冲区和 L1 缓存的路径为 64 位宽,以适应 LDRD/STRD 指令。这允许 STM 每个周期写入两个寄存器。
您还将节省一些 L1 指令缓存,并且在双发内核上仅使用一条管道,这也是一个额外的收获。
【讨论】:
更多的指令,更多的获取周期,更多的指令执行,需要更长的时间。总线是 64 位宽或可以是 64 位宽,对于单个寄存器 stm 没有增益,但如果使用多个寄存器,则可以减少用于移动数据的总线周期数,并且取决于内存系统,如果64 位宽你没有读-修改-写,这也很慢。如果它必须读取-修改-写入到缓存中,通常是写入,您会丢失缓存空间以及读取成本。即使它在缓存中命中,读取-修改写入也可能会花费您。
您可以访问 arm 站点并下载 amba/axi 规范并查看总线事务如何工作,一旦您获得,每个事务都涉及多个时钟周期(多个事务可以同时进行,是的)除了开销之外,每 64 位数据需要一个时钟,因此 128 位比 64 位需要多一个时钟来传输。 32 位和 64 位传输相同数量的时钟(如果对齐)。
我不能代表所有架构,但我相信至少在我看到的一种架构中,每次传输实际上只有读取会超过 64 位。写入被分成单独的 64 位传输。我可能记错了。
如果您移动 4 个字的数据,读取或写入,未对齐,我相信这会变成 4 个单独的传输,一个用于每个奇数字,一个用于中间对齐的 64 位。所以对齐很重要。
【讨论】:
STR fetches 加上多个STR 填充代码缓存会降低效率。