指令级并行基本概念

  自20世纪80年代中期以来,几乎所有的处理机都利用流水线来使指令重叠并行执行,以达到提高性能目的。这种指令之间存在的潜在并行性成为指令级并行(ILP)。通过利用各种技术,在流水线思想的基础上进一步扩展,开发出更多的指令级并行。
  开发ILP主要分为两类:主要基于硬件的动态开发以及基于软件的静态开发方法。在实际开发中,往往需要两者兼用。特别是,把硬件与软件技术以及动态的方法与静态方法结合起来,才能充分开发程序中潜在的指令级并行。
  流水线处理机的实际CPI等于理想流水线的CPI加上各类停顿的时钟周期:

$$ CPI_{流水线}=CPI_{理想}+停顿_{结构冲突}+停顿_{数据冲突}+停顿_{控制冲突} $$

  其中,是衡量流水线最高性能的一个指标。通过减少该式右边各项,就能减小总的CPI,从而提高IPC(Instructions Per Cycle,每个时钟周期完成的指令条数)。
  相关是程序固有的一种属性,它反映了程序中指令之间的相互依赖关系。而具体的一次相关是否会导致实际冲突的发生以及该冲突会带来多长的停顿,则是流水线的属性。
  主要从以下两个方面解决相关问题:
  (1)保持相关,但避免发生冲突。
  (2)通过代码变换,消除相关。
  指令调度是一种用以避免冲突的主要方法,但它不改变相关。通过动态调度代码的硬件方法,可以消除某些相关。
  由于相关的存在,必须保持程序顺序。程序书序是指,有源程序确定的在完全串行方式下指令的执行顺序。只有在可能影响程序正确性的情况下,才需要保持程序顺序。
  对于正确的执行程序来说,必须保持的最关键的两个属性是:数据流(data flow)和异常行为(exception behavior)。
  保持异常行为是指:无论怎么改变指令的执行顺序,都不能改变程序中异常的发生情况。
  如果能做到保持程序的数据相关和控制相关,就能保持程序的数据流和异常行为。