Hardware Versus Software Speculation
本章中的硬件密集型猜测和附录H的软件方法提供了利用ILP的替代方法。一些权衡和限制在此处列出:
-
要进行广泛的推测,我们必须能够消除内存引用的歧义。对于包含指针的整数程序,在编译时很难实现此功能。 在基于硬件的方案中,使用我们之前在Tomasulo算法中看到的技术来完成内存地址的动态运行时消歧。 这种歧义消除使我们可以在运行时将ld移至存储区之外。对推测性内存引用的支持可以帮助克服编译器的保守性,但是除非仔细使用此类方法,否则恢复机制的开销可能会淹没优点。(硬件中托马索龙算法可以用来ld消歧,软件可以结合推测消歧,但是需要保证推测正确性)
-
当控制流不可预测且基于硬件的分支预测优于在编译时完成的基于软件的分支预测时,基于硬件的推测会更好地工作。 这些属性适用于许多整数程序,其中动态预测变量的错误预测率通常小于静态预测变量的二分之一。 由于预测不正确时推测的指令可能会减慢计算速度,因此这种差异非常明显。 这种差异的结果是,即使是静态调度的处理器也通常会包含动态分支预测变量。(硬件推测优于软件,动态推测优于静态)
-
即使基于推测的指令,基于硬件的推测仍可保持完全精确的异常模型。 最近基于软件的方法也增加了特殊支持,以允许这样做。
-
基于硬件的推测不需要补偿或簿记代码,这是雄心勃勃的软件推测机制所必需的。
-
基于编译器的方法可能会受益于进一步查看代码序列的能力,从而导致比纯硬件驱动的方法更好的代码调度。
-
动态调度的基于硬件的推测不需要不同的代码序列即可为体系结构的不同实现实现良好的性能。 尽管这一优势很难量化,但从长远来看,它可能是最重要的优势。 有趣的是,这是IBM 360/91的动机之一。 另一方面,较新的显式并行体系结构(例如IA-64)增加了灵活性,从而减少了代码序列中固有的硬件依赖性。
支持硬件推测的主要缺点是复杂性和所需的额外硬件资源。 必须针对基于软件方法的编译器的复杂性以及依赖于这种编译器的处理器中简化的数量和实用性,来评估这种硬件成本。
一些设计人员试图将动态方法和基于编译器的方法结合起来,以实现每种方法的最佳效果。 这样的组合可能会引起人们的兴趣和不确定的相互作用。 例如,如果将条件移动与寄存器重命名结合使用,则会出现细微的副作用。 被取消的条件移动必须仍然将值复制到目标寄存器,因为它已在指令流水线中更早地重命名。 这些微妙的相互作用使设计和验证过程复杂化,并且还会降低性能。
英特尔®安腾®处理器是有史以来最雄心勃勃的计算机,它基于对ILP和推测的软件支持而设计。 它没有实现设计者的希望,特别是对于通用,非科学的代码。 鉴于第244页所述的困难减轻了设计人员利用ILP的雄心,大多数体系结构决定采用基于硬件的机制,每个时钟的发出速率为三至四个指令。
Speculative Execution and the Memory System
支持推测执行或条件指令的处理器中固有的一种可能性是,生成无效地址,如果不进行推测执行,该无效地址将不会发生。 如果采取保护异常,这不仅是不正确的行为,而且错误的异常开销也会淹没推测执行的好处。 因此,存储系统必须识别推测执行的指令和有条件执行的指令并抑制相应的异常。
出于类似的原因,我们不能允许此类指令导致高速缓存因未命中而停顿,因为再次,不必要的停顿可能会盖过投机的好处。 因此,这些处理器必须与非阻塞缓存匹配。
实际上,DRAM的未命中的损耗是如此之大,以至仅在下一级是片上高速缓存(L2或L3)时才处理推测的未命中。 第84页上的Figure 2.5显示,对于某些性能良好的科学程序,编译器可以维持多个未解决的L2丢失,从而有效地降低了L2丢失的代价。 为了再次起作用,高速缓存后面的内存系统必须在并行访问内存的次数上符合编译器的目标。