为什么在ARM汇编中内存指令需要4个周期?

4

ARM汇编中的ldr, strb等内存指令每个需要4个时钟周期。

这是因为每个内存位置的长度都是4个字节吗?


很大程度上取决于CPU,一些ARM处理器可能可以在一个周期内执行多个LDR或STR指令。 - Ross Ridge
1
不,它可能不是这样工作的(每个周期读取一个字节,因此需要4个周期),整个操作可能只是纯粹的延迟。 - harold
3
ARM是一种流水线架构。每个时钟周期将流水线推进一步。从总体上看,它可以在1个时钟周期内执行大多数指令,但每条指令的开始到结束时间较长。请参考ARM的这张图表:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/ch01s01s01.html - BitBank
1
你对“4个周期”的参考是什么? - artless noise
2
@ChrisTang:[tag:cycles]标签不是关于时钟周期的。此外,这个问题是关于特定微架构的性能,而不是ISA,所以[tag:instruction-set]也不适合。不过,感谢您在问题正文中添加了代码格式。我认为[performance]和[cpu-cycles]标签更合适。 - Peter Cordes
显示剩余4条评论
1个回答

8
ARM具有流水线架构。每个时钟周期将流水线推进一步(例如获取/解码/执行/读取...)。由于流水线不断被输入,执行每个指令的总时间可以接近1个周期,但从“获取”到完成的每个单独指令的实际时间可能需要3个或更多的周期。关于ARM的这个问题,他们网站上有很好的解释: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/ch01s01s01.html 内存延迟为这个想法增加了另一个层面的复杂性。 ARM采用多级缓存系统,旨在在最少的周期内使最常使用的数据可用。即使从最快的(L0)缓存中读取,也涉及几个周期的延迟。流水线包括设施,以允许读取请求在稍后完成,如果数据不立即使用。通过例子来理解更容易:
LDR R0,[R1]
MOV R2,R3    // Allow time for memory read to occur
ADD R4,R4,#200  // by interleaving other instructions
CMP R0,#0  // before trying to use the value

// By trying to access the data immediately, this will cause a pipeline
// 'stall' and waste time waiting for the data to become available.
LDR R0,[R1]
CMP R0,#0 // Wastes at least 1 cycle due to pipeline not having the data

这个想法是在管道中隐藏固有的延迟,如果可以的话,通过延迟对寄存器的依赖(也称指令交错),进一步隐藏内存访问中的附加延迟。


额外的要点?存储操作没有延迟。同时,使用缓存可以加速代码和数据的访问。代码将与数据访问首先竞争。还有“PLD”指令。分支可能会使情况复杂化。 - artless noise
@artlessnoise - 大部分是正确的。只有四个写缓冲区不会合并连续的写操作。糟糕的写缓冲使用(例如逐字节地写入)也会导致写入时额外的停顿。 - BitBank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接