看起来似乎是一个非常简单的问题,但我在查看一些关于两种方法的PPT后还是提出了这个问题。
两种方法都可以增加指令吞吐量。超标量几乎总是利用流水线技术。超标量拥有多个执行单元,而流水线也是如此。或者我理解错了吗?
看起来似乎是一个非常简单的问题,但我在查看一些关于两种方法的PPT后还是提出了这个问题。
两种方法都可以增加指令吞吐量。超标量几乎总是利用流水线技术。超标量拥有多个执行单元,而流水线也是如此。或者我理解错了吗?
这里,在五级流水线中同时执行两个指令。
在九个时钟周期内,我们执行了十条指令——你可以看到流水线确实加速了事情的进展。这是对示例图的解释,而不是它在实际领域中的实现(那是黑魔法)。
维基百科上的Superscalar和Instruction pipeline文章非常好。
As you can see, by taking advantage of the downtime during each step, the new attendant is able to finish all of the laundry much more quickly and efficiently than the old one.
这就是流水线技术。将不相关的活动顺序安排在一起以同时使用不同的组件。通过同时保持尽可能多的不同组件的活跃状态,可以最大程度地提高效率并加快执行时间,在这种情况下可以将16个“循环”缩减为9个,“速度提升超过40��”。
现在,这家小洗衣店开始赚更多的钱,因为他们能够更快地工作,所以老板买了一台额外的洗衣机、烘干机、熨衣板、叠衣站,甚至雇了另一个服务员。现在事情变得更快了,不是以上的步骤,而是:
这就是超标量设计。多个子组件可以同时执行相同任务,但处理器会决定如何执行。在这种情况下,它导致了近50%的速度提升(在18个“循环”内,新结构可以运行3次此“程序”的迭代,而旧结构仅能运行2次)。
旧的处理器(如386或486)是简单的标量处理器,它们按照接收到指令的顺序一个接一个地执行。自PowerPC / Pentium以来的现代消费级处理器是流水线和超标量的。Core2 CPU能够运行为486编译的相同代码,并利用指令级并行性,因为它包含自己的内部逻辑,分析机器代码并确定如何重新排序和运行它(可以并行运行什么,不能并行运行什么等)。这就是超标量设计的精髓,也是为什么它如此实用。
与此相反,向量并行处理器一次对多个数据块(向量)进行操作。因此,向量处理器不仅只是将x和y相加,而是将x0、x1、x2与y0、y1、y2相加(最终得到z0、z1、z2)。但这种设计的问题在于它与处理器的特定并行度紧密耦合。如果在向量处理器上运行标量代码(假设您可以这样做),则无法使用向量并行化的优势,因为需要明确使用,同样,如果您要利用具有更多并行处理单元的新型向量处理器(例如,能够添加12个数字的向量而不仅仅是3个),则需要重新编译代码。向量处理器设计在最早期的超级计算机中很受欢迎,因为它们易于设计,并且科学和工程中有大量具有自然并行性的问题。
超标量处理器也可以具有执行推测的能力。处理器可以猜测分支前面的代码是否已经完成执行,而不是让处理单元空闲等待分支完成执行后再进行分支。当先前的代码执行到分支点时,处理器可以将实际的分支与分支猜测进行比较,如果猜测正确,则继续执行(已经比等待执行更快);或者,如果猜测错误,则无效化推测执行结果并运行正确分支的代码。
多核与这些技术没有任何关系。它基本上是将两个微处理器组合在一起,在单个芯片上实现对称多处理,并仅共享那些有意义的组件(通常是L3缓存和I/O)。然而,英特尔所谓的“超线程”技术是一种试图在单个核心的超标量框架内虚拟实现多核语义的方法。因此,单个微体系结构包含两个(或更多)虚拟核心的寄存器,并从两个(或更多)不同的执行流中提取指令,但从一个公共的超标量系统中执行。这个想法是,因为寄存器不能相互干扰,会倾向于有更多的并行性,从而减少停顿。因此,与其仅以一半的速度执行两个虚拟核心执行流,不如由于总体停顿的减少而更好。这似乎表明英特尔可以增加管道的数量。然而,这种技术在实际实现中被发现有些不足。尽管如此,由于它是超标量技术的一部分,我还是提到了它。
流水线是在同一周期内同时执行多个指令不同阶段的技术。它基于将指令处理分为多个阶段,并为每个阶段提供专门的单元和用于存储中间结果的寄存器。
超标量是将多个指令(或微指令)分派到CPU中的多个执行单元进行执行的技术。因此,它基于CPU中存在冗余单元。
当然,这些方法可以相互补充。