【问题标题】:Why do memory instructions take 4 cycles in ARM assembly?为什么内存指令在 ARM 汇编中需要 4 个周期?
【发布时间】:2017-05-25 14:39:07
【问题描述】:

在 ARM 汇编中,ldrstrb 等内存指令各需要 4 个周期。

是不是因为每个内存位置都是4字节长?

【问题讨论】:

  • 对 CPU 的依赖很大,一些 ARM 处理器可能在一个周期内可以执行多个 LDR 或 STR 指令。
  • 不,它可能不起作用(读取一个字节/周期,因此需要 4 个周期),它可能只是整个操作的直接延迟。
  • ARM 是流水线架构。每个时钟周期使流水线前进一步。综合来看,它可以在 1 个时钟内执行大部分指令,但每条指令的开始到结束时间更长。请参阅 ARM 的此图:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/…
  • 您对“4 个周期”的参考是什么?
  • @ChrisTang:cycles 标签与时钟周期无关。此外,这个问题是关于特定微体系结构的性能,而不是 ISA,所以instruction-set 也不适合。不过,感谢您在问题正文中添加代码格式。我认为 [performance] 和 [cpu-cycles] 标签更适合。

标签: performance assembly arm cpu-architecture cpu-cycles


【解决方案1】:

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 指令。分支会使事情复杂化。
  • @artlessnoise - 大部分是真的。只有 4 个写入缓冲区不会合并顺序写入。写入缓冲区使用不当(例如,一次写入 1 个字节)也会导致写入时出现额外的停顿。
猜你喜欢
  • 2010-10-16
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2015-02-25
  • 2022-08-11
  • 1970-01-01
相关资源
最近更新 更多