« 上一篇下一篇 »

指令级并行性

如果一个程序中的所有运算之间都是高度依赖的,那么再多的硬件采用并行化技术无法使这个程序快速并行执行。关于并行化的限制方面已经有了很多研究。典型的非数值应用有很多固有的依赖性。比如,这些程序具有很多依赖于数据的分支,使得哪怕预测一下下面将执行哪条指令都变得很困难,更不要说去决定哪些运算可以并行执行了。因此,这个领域中的研究工作集中在放松调度约束的技术,包括引人新的体系结构特性,而不是调度技术本身。
每一个现代高性能处理器都能够在一个时钟周期内执行多条指令。在一个具有指令级并行机制的处理器上一个程序能够以多快的速度运行?这可是一个“价值十亿美元的问题”。对这个问题的回答要考虑下列因素:

1)该程序中潜在的并行性。

2)该处理器上可用的并行性。

3)从原来的顺序程序中抽取并行性的能力。

4)在给定的指令调度约束之下找到最好的并行调度方案的能力。

如果一个程序中的所有运算之间都是高度依赖的,那么再多的硬件或采用并行化技术都无法使这个程序快速并行执行。关于并行化的限制方面已经有了很多研究。典型的非数值应用有很多固有的依赖性。比如,这些程序具有很多依赖于数据的分支,使得哪怕预测一下下面将执行哪条指令都变得很困难,更不要说去决定哪些运算可以并行执行了。因此,这个领域中的研究工作集中在放松调度约束的技术,包括引人新的体系结构特性,而不是调度技术本身。

数值应用(比如科学计算和信号处理)往往具有更好的并行性。这些应用处理大型的聚合数据结构。在该结构的不同元素上的运算通常是相互独立的,可以并行地执行。在高性能通用机器和数字信号处理器中都提供了附加的硬件资源来利用这些并行性。这些程序通常具有简单的控制结构和规则的数据访问模式。已经有一些静态技术可以用来从这些程序中抽取出可用的并行性。这类应用的代码调度很有意思也很重要,因为它们允许大量的独立运算被映射到大量的资源上运行。

并行性抽取和并行执行的调度可以通过软件静态完成,也可以通过硬件动态进行。实际上,即使是具有硬件调度机制的机器也可以辅以软件调度。本章将首先解释使用指令级并行性的一些基本问题。不管是硬件管理的并行性还是软件管理的并行性,这些问题都是一样的。然后我们给出并行性抽取所需的基本数据依赖性分析。这些分析也可用于指令级并行性之外的其他优化。我们将在第11章中看到这些分析技术的其他应用。

最后,我们给出代码调度中的基本思想。我们将描述一个用于基本块调度的技术,并给出一个方法来处理通用程序中高度数据依赖的控制流,最后给出一个称为“软件流水线化”的技术。软件流水线化技术主要用于数值计算程序的调度。

« 上一篇下一篇 »