在本节中,我们关注流水线加载/存储处理的重要性能度量,例如加载-使用延迟。负载使用延迟的值是负载流水线执行的特征属性。较大的负载使用值会严重影响处理器性能,尤其是在超标量处理器中。
负载-使用延迟源于负载-使用依赖性,一种 RAW 依赖性。如果加载指令的结果不能在适当的时间由流水线访问以供后续指令访问,则加载-使用相关性会引起加载-使用延迟。
A Load-use delay can be handled either statistically or dynamically. If the static resolution is used, the compiler tries to insert as many independent instructions as necessary between the load instruction and the consumer instruction to compensate for the load delay.
MIPS computers, such as the R2000 and R3000 are examples of handling load-use delays by static scheduling. Here the compiler is assumed to insert a load delay slot after all load instructions. This slot is filled by the compiler either with an independent instruction or with the NOP.
另一种最常用的处理负载使用延迟的技术是动态调度。在这里,专用硬件负责检测和解决可能损害顺序一致性的危险。通常,负载使用延迟的值取决于缓存的原理布局和实现。
目前大多数处理器的负载使用延迟为一个周期,少数有两个或三个周期,如表所示。有几种处理器消除了负载使用延迟,例如 Intel i486、Pentium、SuperSparc 和 R8000。
当前处理器的负载使用延迟值(以周期为单位)
0 | 负载使用延迟(以周期为单位) 1 | 2 or 3 |
i486 | MIPS X | MC 88100 |
奔腾 | R2000、R3000 | R4000 |
超级Sparc | R6000 | α21064 (3 cycles) |
R8000 | PA 7100、PA 7200 Power1 (RS/6000) PowerPC 601、603 Power2 | α21164(2/3 周期) |
对于传统的标量处理器,一个周期的加载使用延迟是完全可以接受的,因为并行优化的 ILP 编译器会经常找到独立的指令来填充加载后的插槽。
但是,对于指令发布率为 2 或更高的超标量处理器,编译器为每个加载指令找到两个、三个、四个或更多独立指令的可能性要小得多。因此,随着超标量处理器负载使用延迟中的指令发布率的增加,成为瓶颈。
根据这些结果,负载使用延迟从一个周期增加到两个或三个周期将大大降低加速。例如,在问题率为 4 的情况下,与负载使用延迟为 1 相比,负载使用延迟为 2 将阻碍性能约 30%。尽管这些数字仅对某些参数集有效,但一般的这种趋势是可以预料的。