嗯,这个问题看起来太简单了,但我在看了几个 ppts 后才问。

两种方法都增加了指令吞吐量。超级扩展几乎也总是利用管道。超级缩放有多个执行单元,管道也是如此,还是我错了?

有帮助吗?

解决方案

超标量设计 涉及处理器能够在单个时钟中发出多个指令,并具有执行指令的冗余设施。请注意,我们谈论的是单核内的情况——多核处理是不同的。

流水线 将指令分为步骤,并且由于每个步骤在处理器的不同部分中执行,因此多个指令可以在每个时钟处于不同的“阶段”。

它们几乎总是一起使用。来自维基百科的这张图片显示了正在使用的两个概念,因为这些概念最好以图形方式解释:

Superscalar/pipelining in use

这里,在五级流水线中一次执行两条指令。


根据您最近的编辑,进一步细分:

在上面的示例中,一条指令要经过 5 个阶段才能“执行”。它们是 IF(指令获取)、ID(指令解码)、EX(执行)、MEM(更新内存)、WB(写回高速缓存)。

在一个非常简单的处理器设计中,每个时钟都会完成不同的阶段,因此我们有:

  1. 如果
  2. ID
  3. 前任
  4. MEM
  5. 世界银行

这将在五个时钟内完成一条指令。如果我们添加一个冗余执行单元并引入超标量设计,对于两条指令 A 和 B,我们就会得到这样的结果:

  1. 如果(A) 如果(B)
  2. 识别号(A) 识别号(B)
  3. 前(A) 前(B)
  4. MEM(A) MEM(B)
  5. WB(A) WB(B)

5 个时钟周期内的两条指令——理论上最大增益为 100%。

流水线允许同时执行各个部分,因此我们最终会得到类似的结果(对于十条指令 A 到 J):

  1. 如果(A) 如果(B)
  2. ID(A) ID(B) IF(C) IF(D)
  3. EX(A) EX(B) ID(C) ID(D) IF(E) IF(F)
  4. MEM(A) MEM(B) EX(C) EX(D) ID(E) ID(F) IF(G) IF(H)
  5. WB(A) WB(B) MEM(C) MEM(D) EX(E) EX(F) ID(G) ID(H) IF(I) IF(J)
  6. WB(C) WB(D) MEM(E) MEM(F) EX(G) EX(H) ID(I) ID(J)
  7. WB(E) WB(F) MEM(G) MEM(H) EX(I) EX(J)
  8. WB(G) WB(H) MEM(I) MEM(J)
  9. WB(I) WB(J)

在九个时钟内,我们执行了十条指令——您可以看到流水线真正将事情推进到哪里。这是对示例图形的解释,而不是它在现场的实际实现方式(即 黑魔法).

维基百科文章为 超标量指令流水线 都不错。

其他提示

:一种长的时间前,CPU上执行的只有一个机器在一个时间指令即可。只有当它被完全完成并在CPU取从存储器中的下一指令(或后来的指令高速缓冲存储器)。

最终,有人注意到,这意味着大多数的CPU的什么也没做的大部分时间,由于有几个执行亚基(如指令解码器,整数运算单元,和FP算术单元等),并执行一个指令只有它们中的一个忙保持在时间

因此,“简单的” 流水线诞生了:一旦一个指令做解码,并继续朝着下一个执行亚基,为什么不是已经获取和解码下一条指令?如果你有10个这样的“阶段的”,然后通过有每个阶段的过程不同的指令理论上可以提高指令吞吐量十倍,而完全不增加CPU时钟!当然,这只是完美的作品时,有代码中没有条件跳转(这导致了很多额外的努力特别处理条件跳转)。

后来,随着摩尔定律继续为比预期更长的正确,CPU制造商发现自己越来越多的晶体管来利用,并认为:“为什么只有每次执行亚单位之一吗?”。因此,超标量的CPU是多个执行能够做到的相同的东西并行出生时,和CPU的设计多了,要复杂得多亚基在这些全并行单元分发指令仿佛所述指令已被顺序地执行,同时确保的结果是相同的。

一个类比:洗衣服

想象一家干洗店拥有以下设施:用于悬挂脏衣服或干净衣服的架子、洗衣机和烘干机(每台一次只能洗一件衣服)、折叠桌和熨衣板。

负责所有实际洗涤和烘干工作的服务员相当愚蠢,因此接受干洗订单的店主特别小心,非常仔细且明确地写下了每条说明。

在典型的一天中,这些说明可能类似于:

  1. 从架子上取出衬衫
  2. 洗衬衫
  3. 把衬衫晾干
  4. 熨烫衬衫
  5. 把衬衫叠起来
  6. 将衬衫放回架子上
  7. 从架子上取下裤子
  8. 洗裤子
  9. 把裤子晾干
  10. 把裤子折起来
  11. 把裤子放回架子上
  12. 从架子上拿外套
  13. 洗外套
  14. 擦干外套
  15. 熨烫外套
  16. 把外套放回架子上

服务员在发球台上遵循这些说明,非常小心,不要做任何不按顺序进行的事情。可以想象,完成一天的衣服需要很长时间,因为充分洗涤、干燥和折叠每件衣服都需要很长时间,而且必须一次一件完成。

然而,有一天,服务员辞职了,并雇用了一位新的、更聪明的服务员,他注意到大多数设备在一天中的任何给定时间都处于闲置状态。烘干裤子时,熨衣板和洗衣机都没有使用。因此,他决定更好地利用自己的时间。因此,他将执行以下操作,而不是执行上述一系列步骤:

  1. 从架子上取出衬衫
  2. 洗衬衫, 从架子上取下裤子
  3. 将衬衫晾干, 洗裤子
  4. 熨烫衬衫, 把裤子晾干
  5. 把衬衫叠起来, (从架子上拿外套)
  6. 将衬衫放回架子上, 把裤子折起来, (洗外套)
  7. 把裤子放回架子上, (擦干外套)
  8. (熨烫外套)
  9. (把外套放回架子上)

这就是管道化。 对不相关的活动进行排序,以便它们同时使用不同的组件。通过同时保持尽可能多的不同组件处于活动状态,您可以最大限度地提高效率并加快执行时间,在这种情况下,将 16 个“周期”减少到 9 个,加速超过 40%。

现在,这家小干洗店开始赚更多的钱,因为他们可以更快地工作,所以店主额外购买了洗衣机、烘干机、烫衣板、折叠台,甚至还雇用了另一个服务员。现在事情变得更快了,而不是上面的,你有:

  1. 从架子上取出衬衫, 从架子上取下裤子
  2. 洗衬衫, 洗裤子, (从架子上拿外套)
  3. 将衬衫晾干, 把裤子晾干, (洗外套)
  4. 熨烫衬衫, 把裤子折起来, (擦干外套)
  5. 把衬衫叠起来, 把裤子放回架子上, (熨烫外套)
  6. 将衬衫放回架子上, (把外套放回架子上)

这是超标量设计。 多个子组件能够同时执行相同的任务,但由处理器决定如何执行。在这种情况下,速度提升了近 50%(在 18 个“周期”内,新架构可以运行该“程序”的 3 次迭代,而之前的架构只能运行 2 次)。

较旧的处理器(例如 386 或 486)是简单的标量处理器,它们一次完全按照接收指令的顺序执行一条指令。自 PowerPC/Pentium 以来的现代消费处理器都是流水线和超标量的。Core2 CPU 能够运行为 486 编译的相同代码,同时仍然利用指令级并行性,因为它包含自己的内部逻辑,可以分析机器代码并确定如何重新排序和运行它(什么可以并行运行) ,什么不能,等等)这是超标量设计的本质以及它如此实用的原因。

相比之下,向量并行处理器一次对多个数据(向量)执行操作。因此,矢量处理器不是仅仅将 x 和 y 相加,而是将 x0,x1,x2 添加到 y0,y1,y2(结果为 z0,z1,z2)。这种设计的问题在于它与处理器的特定并行度紧密耦合。如果您在向量处理器上运行标量代码(假设可以),您将看不到向量并行化的优势,因为它需要显式使用,类似地,如果您想利用具有更多并行处理单元的较新向量处理器(例如,能够添加 12 个数字的向量,而不是仅 3 个),您需要重新编译代码。矢量处理器设计在最古老的一代超级计算机中很流行,因为它们易于设计,并且科学和工程中存在大量具有大量自然并行性的问题。

超标量处理器还具有执行推测执行的能力。处理器不是让处理单元空闲并在分支之前等待代码路径完成执行,而是可以做出最佳猜测并在先前代码完成处理之前开始执行经过分支的代码。当先前代码的执行赶上分支点时,处理器可以将实际分支与分支猜测进行比较,如果猜测正确则继续(已经远远领先于仅等待的位置),或者可以使推测执行的结果无效并运行正确分支的代码。

流水线是一家汽车公司确实在制造自己的汽车是什么。他们打破汽车放在一起进入阶段的过程中,沿着不同的人做了一个组装线进行在不同点的不同阶段。净结果是,该车在单独的最慢阶段的准确的速度制造。

在CPU的流水线过程是完全相同的。的“指令”被分解成执行,通常是像1的各个阶段取出指令,2.取操作数(即读寄存器或存储器中的值),2.执行计算,3.写结果(到存储器或寄存器) 。最慢的,这可能是,所述计算部分,在这种情况下,通过这条管道的说明总体吞吐量速度计算部分的刚速度(如同其他部分是“免费”。)

超级标量微处理器中是指从单个执行流在一次并行地运行几个指令的能力。所以,如果一家汽车公司跑了两条装配线那么很明显,他们可能会产生两倍多的汽车。但是,如果把一个序列号上车的过程是在最后阶段,不得不由一个人来完成,那么他们将有两条管线之间交替,并保证他们可以得到在一半的时间每完成最慢的阶段,以避免成为最慢的阶段本身。

超级标量微处理器中是类似的,但通常有多得多的限制。所以取指令过程中的阶段阶段通常会产生一个以上的指令 - 这是什么使微处理器可能超标量。那么就会有两个取阶段,两个执行阶段,两个写阶段。这显然可以推广到不止两条管道。

这是所有罚款和花花公子,但是从声音执行的角度来看,如果一味地做这两种技术可能导致的问题。用于程序的正确执行,假定指令被完全执行一个接一个井然有序。如果两个顺序指令有相互依存的计算或使用相同的寄存器则有可能是一个问题,后来的指令需要等待前面的指令完成回写,然后才能执行取操作数阶段。因此,你需要通过两个阶段执行它之前,它违背了什么摆在首位获得通过这些技术的目的来搪塞第二指令。

有许多技术用来减少需要的问题失速被有点复杂来描述,但我将列出它们:1.寄存器转发,(也存储加载转发)2.寄存器重命名,3.记分登机,4.乱序执行。 5.回滚(和退休)预测执行所有现代的CPU使用几乎所有这些技术来实现超标量和流水线。然而,这些技术往往具有边际报酬递减相对于在处理器管线的数量摊位成为必然了。在实践中没有的CPU制造商使得超过4条管线在单个核心。

多核无关与任何这些技术。这基本上是冲压两个微处理器一起实现在单个芯片上的对称多处理和共享只有那些有意义的共享组件(通常L3高速缓存和I / O)。然而,英特尔称之为“超线程”技术是试图实现实质上的单核的超标量框架内多核的语义的方法。因此单个微架构包含两个(或更多个)虚拟核的寄存器和从两个(或更多)不同的执行流取出指令,而是从一个共同的超标量系统中执行。这个想法是因为寄存器不能互相干扰,将有往往是更多的并行导致更少的摊位。因此,而不是简单地以一半的速度运行两个虚拟核心的执行流,这是由于摊位总量减少更好。这似乎表明,英特尔可能增加管线的数量。然而,这种技术已被发现在实际实施中有所欠缺。因为它是不可或缺的超标量技术,虽然,我已经反正提到。

流水线是在相同周期的多个指令的不同阶段同时执行。它是基于分割指令处理为多个阶段,并具有用于存储中间结果的每个阶段专门单位和寄存器。

Superscaling正在调度多个指令(或微指令)向存在于CPU多个正在执行单元。它在CPU冗余单元从而基于

当然,这个方法可以互相补充。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top