ARM指令流水线的分类与比较(ARM处理器指令系统——指令流水线,中篇)
本文声明内容来源于网络进行整合/再创作部分内容由AI辅助生成。ARM微处理器主要包含3级指令流水线、5级指令流水线、7级指令流水线、8级指令流水线和13级指令流水线这5个流水线。本节着重讲述3级、5级指令流水线。3级指令流水线到ARM7为止的ARM处理器使用简单的3级流水线它包括下列流水线级① 取指令fetch从寄存器装载一条指令。② 译码decode识别被执行的指令并为下一个周期准备数据通路的控制信号。在这一级指令占有译码逻辑不占用数据通路。③ 执行excute处理指令并将结果写回寄存器。3级指令流水线——指令执行过程3级指令流水线——指令执行示意图当处理器执行简单的数据处理指令时流水线使得平均每个时钟周期能完成1条指令。但1条指令需要3个时钟周期来完成因此有3个时钟周期的延时latency但处理器吞吐率throughput是每个周期1条指令。5级指令流水线所有的处理器都要满足对高性能的要求在ARM核中使用的3级流水线的性价比是很高的。但是为了得到更高的性能需要重新考虑处理器的组织结构。有两种方法来提高性能提高时钟频率。时钟频率的提高必然引起指令执行周期的缩短所以要求简化流水线每一级的逻辑流水线的级数就要增加。减少每条指令的平均指令周期CPICycles Per Instruction即通过优化手段降低处理器执行每条指令所需的时钟周期从而提升程序运行效率。在3级流水线ARM中有些复杂指令需要多个时钟周期才能完成会导致指令流水线停顿降拖慢整体执行速度。为此可以改进多周期指令的实现方式让它们占用更少的周期完成或者减少因指令依赖、资源冲突等原因造成的流水线停顿也可以同时采用这两种策略从而更有效地提升效率。3级指令流水线ARM核在每一个时钟周期都访问存储器或取指令拿代码或传输数据读写变量。为了降低 CPI即提升处理速度存储系统必须跟上CPU的节奏不能让CPU干等。这就要求存储器在一个时钟周期内必须能够提供超过1个的数据项即同时满足“取指令”和“传数据”的需求。要实现这个“一周期双输出”的目标主要有两种技术手段加大数据带宽更宽的存储器总线将存储器的数据位宽从32位增加到64/128位。这样一次访存就能取出两条或更多条指令或者一个更大的数据块。采用哈佛架构或分离的存储器接口为指令和数据分别提供独立的缓存、访问通路。这样CPU可以一边从指令区读代码一边在数据区读写变量互不干扰从而提升效率。在ARM9TDMI中使用了典型的5级流水线5级流水线包括下面的流水线级①取指令fetch从存储器中取出指令并将其放入指令流水线。②译码decode指令被译码从寄存器堆中读取寄存器操作数。在寄存器堆中有3个操作数读端口因此大多数ARM指令能在1个周期内读取其操作数。③执行execute将其中1个操作数移位并在ALU中产生结果。如果指令是Load或Store指令则在ALU中计算存储器的地址。④访存)数据/缓冲data/buffer如果需要则访问数据存储器否则ALU只是简单地缓冲1个时钟周期。⑤回写write-back将指令的结果回写到寄存器堆包括任何从寄存器读出的数据。5级指令流水线——执行过程5级指令流水线——指令执行示意图3级与5级指令流水线的比较AArch32执行状态下在程序执行过程中程序计数寄存器ProgramCounterRegisterPC值是基于3级指令流水线操作特性的。在ARM处理器中程序计数器PC的值并不是简单地指向当前正在执行的指令地址而是受到流水线结构的影响。早期的ARM处理器采用3级指令流水线取指 → 译码 → 执行。由于在取指阶段就提前读取下一条指令所以当某条指令在执行时PC实际上已经指向下下条指令了即“当前指令地址 8因为每条ARM指令占4字节8表示跳过了两条指令。因此在3级流水线中软件看到的PC值总是“超前”当前执行指令8个字节PC 8。5级指令流水线取指 → 译码 → 执行 → 访存 → 写回本由于流水线更深PC的“超前量”可能会不同比如变成12。为了保持软件兼容性ARM在设计5级流水线时特意做了处理通过额外的硬件逻辑在取指阶段计算出 PC4即下一条指令的地址并把这个值直接传递到译码阶段跳过中间的流水寄存器延迟。这样一来当指令在译码或执行阶段读取R15时看到的值仍然是“PC 8”和3级流水线的行为完全一致。3级与5级指令流水线的比较然而在 AArch64 状态下ARM 架构师对程序计数器PC进行了彻底的重构以剥离历史包袱并简化处理器架构模型。PC 不再是一个通用寄存器因此软件无法直接通过MOV PC, R0这样的指令修改执行流而必须使用专用的分支指令如B、BR、RET来实现跳转。这一改动简化了流水线的控制逻辑并减少了分支预测错误的风险。此外彻底消除了历史遗留的偏移量——在 AArch64 中当指令读取 PC 时例如通过ADR指令获取当前地址其值指向的是当前正在执行的指令的地址而非像 AArch32 那样超前 8 个字节。这极大简化了位置无关代码PIC的编写开发者可以直接通过ADR X0, 标签获取绝对地址而无需手动计算令人困惑的 8 或 12 补偿。注意硬件自动更新机制依然存在即执行完当前指令后PC 会自动增加 4 字节以指向下一条指令但关键在于 AArch64 的架构手册明确规定了读取 PC 的语义将其从微架构的实现细节中彻底剥离使得程序行为更加直观和可预测。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411180.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!