以并行方式执行程序指令的主要动机是为了加快计算。但是现今的大多数程序是无法通过并行来改进性能的,因为它们的编写是假设指令是按序执行的,每次执行一条指令,即是顺序执行的。大多数程序设计语言的语义体现为顺序执行,按这种语义编写的程序通常严重地依赖于这种特征来保证正确性,因而很难有机会实现并行执行。当然,还存在一些机会,例如在计算表达式(a+b)*(c+d)时,假定这些都是简单变量,由于子表达式(a+b)和(c+d)相互独立,因此它们能同时计算。这就是指令级并行(Insruction Level Parallelism,ILP)的例子。 的确,我们继续编写顺序程序的一个理由是因为计算机体系结构师们在开发并行性方面如此成功。他们利用硅工艺的稳定改进,在顺序处理器的设计中采用了多种并行方法,其中包括ILP。首先,体系结构师们为指令和数据提供了分离的路径和高速缓存(cache)。这种分离允许对指令和数据存储器进行并行访问,两者互不干扰。其次,使指令执行流水化,在执行当前指令的同时,对后继的指令进行取指和译码,而前面的指令则正在将结果写回存储器。更进一步,处理器每次可发出(启动)多条指令,预取指令和数据,以猜测方式并行地完成操作,即使不能保证是否真的需要进行这些操作,他们还使用高速并行电路完成基本的算术操作。简言之,现代处理器是高度并行的系统。 对程序员来讲,所有这些并行对顺序程序都是透明可用的。我们称这种并行为隐藏并行(hidden parallelism)。这种并行,加上不断提高的时钟速度,使得新一代的处理器芯片总能以更快的速度执行程序,而同时又保持顺序执行的假象。但是要在维持顺序语义的基础上期望找到应用并行的新机遇是非常有限的。更为严重的是,就功率消耗和性能两者而言,开发ILP的现有技术在很大程度上已经到达了它的收益递减点。因而,就当前的技术而言,顺序程序的执行可能已接近它的最大速度。 要想继续获取显著的性能改进,必须超越现有程序典型的单指令序列的工作方式。我们必须使程序以同时运行多指令流的方式工作。这种工作方式需要使用新的程序设计技术,这就是本书要讨论的主题。