在计算机体系结构中,负载-使用延迟的性能如何?
在本节中,我们关注流水线加载/存储处理的重要性能指标,例如负载-使用延迟。负载-使用延迟的值是加载流水线执行的特征属性。较大的负载-使用值会严重影响处理器性能,尤其是在超标量处理器中。
负载-使用延迟源于负载-使用依赖性,一种RAW依赖性。如果加载指令的结果不能及时地被流水线用于后续指令,则负载-使用依赖性会导致负载-使用延迟。
负载-使用延迟可以通过静态或动态方式处理。如果使用静态解析,编译器会尝试在加载指令和使用者指令之间插入尽可能多的独立指令以补偿负载延迟。
MIPS 计算机(例如 R2000 和 R3000)是通过静态调度处理负载-使用延迟的示例。这里假设编译器在所有加载指令之后插入一个负载延迟槽。此槽由编译器使用独立指令或 NOP 填充。
处理负载-使用延迟的另一种最常用的技术是动态调度。这里,专用硬件负责检测和解决可能损害顺序一致性的危险。通常,负载-使用延迟的值取决于缓存的主要布局和实现。
大多数当前处理器具有一个周期的负载-使用延迟,而少数处理器具有两个或三个周期,如表中所示。一些处理器消除了负载-使用延迟,例如 Intel i486、奔腾、SuperSparc 和 R8000。
当前处理器的负载-使用延迟值(以周期为单位)
0 | 负载-使用延迟(以周期为单位) 1 | 2 或 3 |
i486 | MIPS X | MC 88100 |
奔腾 | R2000、R3000 | R4000 |
SuperSparc | R6000 | α21064(3 个周期) |
R8000 | PA 7100、PA 7200 Power1(RS/6000)PowerPC 601、603 Power2 | α21164(2/3 个周期) |
对于传统的标量处理器,一个周期的负载-使用延迟是可以接受的,因为并行优化的 ILP 编译器通常会找到独立指令来填充加载后的槽。
然而,对于指令发出率为 2 或更高的超标量处理器,编译器为每个加载指令找到两个、三个、四个或更多独立指令的可能性要小得多。因此,随着超标量处理器中指令发出率的增加,负载-使用延迟成为瓶颈。
根据这些结果,负载-使用延迟从一个周期增加到两个或三个周期会大大降低加速效果。例如,在 4 的发出率下,与 1 的负载-使用延迟相比,2 的负载-使用延迟会使性能降低约 30%。尽管这些数字仅对某些参数集有效,但可以预期这种一般的趋势。