当前位置:   article > 正文

超标量体系结构_计算机体系结构——以多发射和静态调度来开发ILP

vliw使用了多个相互独立的功能单元。另外,vliw并不是试图向这些单元发出多条独立

本文翻译摘录自“ComputerArchitecture : A Quantitative Approach (6th Edition)”。

前面文章介绍的技术可以用来消除数据与控制停顿,从而使得CPI达到理想1。为了进一步提高性能,我们希望将CPI降低至小于1,但如果每个时钟周期仅发射一条指令,那CPI是不可能降低小于1的。

多发射处理器的目标就是运行在一个时钟周期中发射多条指令。多发射处理器主要有以下3类:

1)静态调度超标量处理器;

2)VLIW(超长指令字)处理器;

3)动态调度超标量处理器。

两种超标量处理器每个时钟周期发射不同数目的指令,如果它们采用静态调度则采用循序执行,如果采用动态调度则采用乱序执行。

与之相对,VLIW处理器每个时钟周期发射固定数目的指令,这些指令可以设置为两种格式之一:一种格式是一个长指令;另一种是一个固定的指令包,指令之间具有一定的并行度,由指令显示表示出来。VLIW处理器由编译器进行静态调度。Intel和HP在创建IA-64体系结构时,它们还将这种体系结构命名为EPIC(显式并行指令计算机)。

尽管静态调度超标量处理器在每个周期内发射的指令数是可变的,而不是固定的,但它们在概念上实际与VLIW更接近一些,这是因为这两种方法都依赖编译器为处理器调度代码。由于静态调度超标量的收益会随着发射带宽的增长而逐渐减少,所有静态调度超标量主要用于发射宽度较窄的情况,通常仅有两条指令。超过这一宽度之后,大多数设计人员选择实现VLIW或动态调度超标量。由于两者的硬件要求和所需要的编译器技术是类似的,所以本文主要介绍VLIW。

下表总结了多发射的基本方法和它们的突出特征,并给出了使用每一方法的处理器。

4b8b40e4a8192e375788ab6839ca1c92.png

VLIW使用多个独立功能单元。VLIW没有尝试向这些单元发射多条独立指令,而是将多个操作包装在一个非常长的指令中,或者要求发射包中的指令满足同样的约束条件。由于这两种方法之间没有本质性的区别,所以假定将多个操作放在一条指令中,原始VLIW方法即是如此。

由于VLIW的收益会随着最大发射功率的增长而增长,所以我们主要关注宽发射处理器。实际上,对于简单的两发射处理器,超标量的开销可能是最低的。许多设计人员可能会说:四发射处理器的开销是可控的,但其实开销的增长是限制宽发射处理器的主要因素。

我们考虑一个VLIW处理器,在上面运行包含5种运算的指令,这5种运算是:一个整数运算(也可以是一个分支)、两个浮点运算和两个存储器引用。这些指令可能拥有与每个功能单元相对应的一组字段,每个单元可能为16~24位,得到的指令长度介于80~120位之间。作为对比,Intel Itanium1和2的每个指令包中包含6个运算(也就是说,它们允许同时发射两个3指令包)。

为使功能单元保持繁忙状态,代码序列必须具有足够的并行度,以填充可用操作Slot。这种并行是通过循环展开和调度单个更大型循环体中的代码而展现的。如果展开过程会生成straight-line代码,则可以使用局部调度技术,它可以对单个基本模块进行操作。如果并行的发现与开发需要在分支之间调度代码,那就必须使用可能更为复杂的全局调度算法。全局调度算法不仅在结构上更为复杂,而且由于在分支之间移动代码的成本很高,所有它们还必须进行非常复杂的优化权衡。

示例:假定有一个VLIW,它可以在每个时钟周期中发射两个存储器引用、两个浮点运算和整数运算或分支。写出针对这样一个处理器展开循环x[i]=x[i]+s的版本。可进行任意次展开,以消除停顿。忽略延迟分支。

下表给出了这一代码。该循环被展开后,形成循环体的7个副本,消除了所有停顿(即全空发射周期),运行9个时钟周期。这一代码的运行速度为9个周期生成7个结果,也就是每个结果需要1.29个周期,与前面文章介绍的使用非展开调度代码的两发射超标量相比,速度差不多是它的两倍。

5da4aecc9800788d8a31dfd18a0c8b0e.png

原始VLIW模块中既存在一些技术问题,也存在一些逻辑问题,从而降低了效率。技术问题包括代码大小的增大和lockstep操作的局限性。有两个不同因素共同造成VLIW代码大小的增大。第一,要在straightline代码段中生成足够操作,需要大量展开循环(如前面的示例所示),从而增大了代码大小。第二,只要指令未被填满,那些没有用到的功能单元就会在指令编码时变为多余的位。

为了应对这种代码大小的增长,有时会使用智能编码。比如,一条指令中可能只有一个很大的立即数字段供所有功能单元使用。另一种技术是在主存储器中压缩指令,然后在到达缓存或进行译码时再展开它们。

早期的VLIW是lock step工作的,根本就没有冒险检测硬件。在这种结构中,由于所有功能单元都必须保持同步,所以任意功能单元流水线中的停顿都必然导致整个处理器停顿。尽管一个编译器也许能够调度起决定性作用的功能单元,以防止停顿,但要想预测哪些数据访问会遭遇缓存停顿,并对它们进行调度,那是非常困难的。因此,应当对缓存进行分块,并能导致所有功能单元停顿。由于发射速度也内存引用数目都变的很大,所以这一同步限制变得不可接受。在最近的处理器中,这些功能单元以更独立的方式工作,在发射时利用编译器来避免冒险,而在发射指令之后,可以通过硬件检查来进行非同步执行。

二进制代码兼容性也是VLIW的主要逻辑问题。在严格的VLIW方法中,代码序列既能利用指令集定义,又要利用具体的流水线结构,包括功能单元及其延迟。因此,当功能单元数目和单元延迟不同时,就需要不同的代码版本。与超标量设计相比,由于这一要求而更难以在先后实施版本之间或者具有不同发射带宽的实施方式之间移植代码。当然,要想通过新的超标量设计而提高性能,可能需要重新编译。不过,能够运行旧版本二进制文件是超标量方法的一个实际优势。

EPIC方法(IA-64体系结构是它的一个主要示例)解决了早期VLIW设计中遇到的许多问题,包括扩展到更积极主动的软件推测与方法,在保证二进制兼容性的前提下克服硬件依赖的局限性。

所有多发射处理器都要面对的重要挑战是尝试开发大量ILP。这种行为是通过展开浮点程序中的简单循环实现的,而原来的循环很可能可以在向量处理器上高效地运行。对于这类应用程序,目前还不清楚多发射处理器是否优于向量处理器;其成本是类似的,向量处理器的速度可能与多发射处理器相同,或者还会更快一些。多发射处理器相对于向量处理器的潜在优势在于它们能够从结构化程度较低的代码中提取某些并行,以及能够很轻松地缓存所有形式的数据。因为这些原因,多发射方法已经成为利用指令级并行的主要方法,而向量主要作为这些处理器的扩展。

~End~


17d17cc237c876d39f965a49b915c3b9.png


ace3bc3a50cb6c7f68aa2aa1506d1783.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/271877
推荐阅读
相关标签
  

闽ICP备14008679号