分支延迟槽

分支延迟槽

1. 概述

分支延迟槽 (Branch delay slot),简单地说就是位于分支指令后面的一条指令,不管分支发生与否其总是被执行,而且位于分支延迟槽中的指令先于分支指令提交 (commit)。

看这个代码片段 (MIPS Linux kernel 2.6.17):

801ea9d4:     02202021     move   a0,s1
801ea9d8:     27a50014     addiu   a1,sp,20
801ea9dc:     0c0ce551     jal   80339544 <pcibios_resource_to_bus>
801ea9e0:     02403021     move   a2,s2
801ea9e4:     8e240010     lw     a0,16(s1)
...

MIPS ABI 规定,a0, a1, a2, a3 用于过程调用的前四个参数,则 move a2, s2 是置第 3 个参数,但是其位于函数调用指令 jal 80339544(分支指令)之后,这个 move a2, s2 所在地即为一个分支延迟槽。

分支延迟槽在 DSP 和历史较悠久的 RISC 上比较常见,如 MIPS,  SPARC 等。PowerPC 和 ARM 上则没有这个概念。x86 亦没有。


2. 缘起

引入分支延迟槽的目的主要是为了提高流水线的效率。

流水线中,分支指令执行时因为确定下一条指令的目标地址(紧随其后 or 跳转目标处?)一般要到第 2 级以后,在目标确定前流水线的取指级是不能工作的,即整个流水线就“浪费”(阻塞)了一个时间片,为了利用这个时间片,在体系结构的层面上规定跳转指令后面的一个时间片为分支延迟槽(branch delay slot)。位于分支延迟槽中的指令总是被执行,与分支发生与否没有关系。这样就有效利用了一个时间片,消除了流水线的一个“气泡”。

这种技术手段主要用在早期没有分支预测的流水线 RISC 上,现代 RISC 实现早就可以在流水线的第 2 级利用分支预测确定跳转的目标,分支延迟槽也就失去了原来的价值,但为了软件上的兼容性 MIPS 和 SPARC 还是作了保留。
### 关于计算机系统结构中延迟槽的概念和工作原理 #### 定义与概念 延迟槽(Delay Slot)是指某些精简指令集计算架构(RISC)处理器在分支指令之后预留的一个或多个指令位置。这些位置上的指令会在分支条件评估期间被执行,从而提高CPU利用率并减少因等待分支结果而产生的停顿时间[^1]。 #### 工作原理 当一条无条件跳转或者有条件转移的指令被取出时,在这条指令后面的下一条指令的位置即为延迟槽。即使该次跳跃确实发生了改变程序计数器PC指向的情况,位于延迟槽内的那条指令仍然会被执行。这种设计允许编译器优化代码布局,使得原本可能浪费掉的时间片得以利用起来完成有用的工作[^2]。 对于现代高性能处理器而言,为了进一步提升性能,可能会存在多周期延迟槽的情形;也就是说,在一个复杂的控制流变化发生之前的一系列固定数量的指令都会作为延迟槽处理,并全部得到执行。这要求程序员以及编译工具链特别注意如何安排这段区域里的操作以确保逻辑正确性和效率最大化[^3]。 值得注意的是,不同类型的处理器对延迟槽数量和支持方式有所差异,因此编写跨平台兼容性强的应用程序时需谨慎对待这一特性[^4]。 ```assembly ; 示例伪代码展示了一个简单的延迟槽场景 branch target_address ; 分支到目标地址 nop ; 这里是一个典型的NOP填充延迟槽的例子 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值