超级密码和流水线有什么区别?

Ale*_*der 39 processor pipelining

看起来太简单了一个问题,但我在经历了几个ppts之后问了一下.

两种方法都增加了指令吞吐 而Superscaling几乎总是使用流水线技术.超级密码有多个执行单元,流水线也是如此,或者我错了吗?

Jed*_*ith 59

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

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

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

使用超标量/流水线

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


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

在上面的示例中,指令经历了5个阶段以"执行".这些是IF(指令获取),ID(指令解码),EX(执行),MEM(更新存储器),WB(写回缓存).

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

  1. 如果
  2. ID
  3. EX
  4. MEM
  5. WB

哪个会在五个时钟内执行一条指令.如果我们再添加一个冗余执行单元并引入超标量设计,我们就会有两个指令A和B:

  1. 如果(A)IF(B)
  2. ID(A)ID(B)
  3. EX(A)EX(B)
  4. MEM(A)MEM(B)
  5. WB(A)WB(B)

五个时钟中的两个指令 - 理论最大增益为100%.

流水线操作允许部件同时执行,因此我们最终会得到类似的东西(对于十个指令A到J):

  1. 如果(A)IF(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)

在九个时钟中,我们已经执行了十条指令 - 您可以看到流水线真正移动的地方.这是对示例图形的解释,而不是它在现场如何实现(这是黑魔法).

维基百科关于超标量指令管道的文章相当不错.

  • 它们一起使用主要是因为这两种技术都是可用的,两者都是好主意,而现代流程制造技术使它成为可能.流水线但不是超标量的着名芯片包括Intel i486和一些早期的ARM,MIPS CPU以及第一款Alpha处理器. (4认同)
  • 第一个"执行"应该是"问题",然后您可以使用"执行"而不是"执行".这就是Henessy&Patterson一书中调用这个阶段的方式. (2认同)

Mic*_*rdt 33

很久以前,CPU 一次执行一条机器指令.只有当它完全完成时,CPU才会从内存(或稍后的指令缓存)中获取下一条指令.

最终,有人注意到这意味着大多数CPU大多数时间都没有做任何事情,因为有几个执行子单元(例如指令解码器,整数算术单元和FP算术单元等)并执行保持的指令其中只有一个人一次忙.

因此," 简单 "的流水线技术诞生了:一旦一条指令完成解码并继续执行下一个执行子单元,为什么不能获取并解码下一条指令?如果您有10个这样的" 阶段 ",那么通过让每个阶段处理不同的指令,理论上可以将指令吞吐量增加十倍而不会增加CPU时钟!当然,只有当代码中没有条件跳转时,这才能完美地工作(这导致了很多额外的努力来特别处理条件跳转).

后来,随着摩尔定律的持续时间长于预期,CPU制造商发现自己有越来越多的晶体管可以利用并思考"为什么每个执行子单元只有一个?".因此,具有多个执行子单元的超标量 CPU 能够并行执行相同的操作,并且CPU设计变得更加复杂,在这些完全并行的单元上分发指令同时确保结果与指令执行时的结果相同顺序.

  • 它的答案应该结束关于SO上这些问题的价值的争论. (7认同)
  • 很久以前,在远方,远方的死亡? (2认同)

Wed*_*dge 11

打个比方:洗衣服

想象一下干洗店有以下设施:用于悬挂脏衣服或干净衣服的架子,洗衣机和烘干机(每个可以一次洗一件衣服),折叠桌和熨衣板.

所有实际洗涤和干燥的服务员都是相当笨拙的,所以采取干洗订单的店主特别小心地明确地写出每条指令.

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

  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和ya,矢量处理器将添加例如x0,x1,x2到y0,y1,y2(导致z0,z1,z2).这种设计的问题在于它与处理器的特定并行度紧密耦合.如果你在矢量处理器上运行标量代码(假设你可以),你会发现矢量并行化没有优势,因为它需要明确使用,类似的话,如果你想利用具有更多并行处理单元的更新的矢量处理器(例如能够添加12个数字而不是3个数字的向量,您需要重新编译代码.矢量处理器设计在最老一代的超级计算机中很流行,因为它们易于设计,并且在科学和工程方面存在大量的问题,具有大量的自然并行性.

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


Pau*_*ieh 6

流水线是汽车公司在制造汽车时所做的事情.他们打破了将汽车分成几个阶段并在不同人员完成的装配线上的不同点执行不同阶段的过程.最终的结果是,汽车的制造速度恰好是最慢的阶段.

在CPU中,流水线处理过程完全相同."指令"分解为执行的各个阶段,通常类似于1.获取指令,2.获取操作数(读取的寄存器或存储器值),2.执行计算,3.写入结果(到存储器或寄存器) .最慢的可能是计算部分,在这种情况下,通过此管道的指令的总吞吐速度只是计算部分的速度(就好像其他部分是"空闲的").

微处理器中的超标量指的是同时从单个执行流中并行运行多个指令的能力.因此,如果一家汽车公司运行两条装配线,那么显然它们可以生产两倍的汽车.但是,如果将序列号放在车上的过程是在最后阶段并且必须由一个人完成,那么他们将不得不在两个管道之间交替并保证他们可以在一半的时间内完成每个管道.最慢的阶段,以避免自己成为最慢的阶段.

微处理器中的超标量类似,但通常具有更多限制.因此,指令获取阶段通常会在其阶段产生多个指令 - 这使得微处理器中的超标量成为可能.然后将有两个获取阶段,两个执行阶段和两个写回阶段.这显然不仅仅是两条流水线.

这一切都很好而且花花公子但是从声音执行的角度来看,如果盲目地完成这两种技术都可能导致问题.为了正确执行程序,假设指令按顺序一个接一个地执行.如果两个顺序指令具有相互依赖的计算或使用相同的寄存器,则可能存在问题,后一条指令需要等待前一条指令的写回完成才能执行操作数获取阶段.因此,您需要在执行之前将第二条指令拖延两个阶段,这首先会破坏这些技术所获得的目的.

有很多技术可以用来减少需要停顿的问题,但是我会列出它们:1.寄存器转发,(也存储到加载转发)2.注册重命名,3.记分,4无序执行.5.使用回滚(和退役)的推测执行所有现代CPU都使用几乎所有这些技术来实现超标量和流水线.然而,在停顿变得不可避免之前,这些技术相对于处理器中的管道数量往往具有递减的回报.实际上,没有CPU制造商在单个核心中制造超过4个管道.

多核与任何这些技术无关.这基本上是将两个微处理器组合在一起,在单个芯片上实现对称多处理,并且只共享那些有意义共享的组件(通常是L3缓存和I/O).然而,英特尔称之为"超线程"的技术是一种尝试在单核的超标量框架内虚拟实现多核语义的方法.因此,单个微架构包含两个(或更多)虚拟内核的寄存器,并从两个(或更多个)不同的执行流中获取指令,但是从公共超标量系统执行.这个想法是因为寄存器不能相互干扰,所以往往会有更多的并行性导致更少的停顿.因此,不是简单地以一半的速度执行两个虚拟核心执行流,而是由于停顿的整体减少而更好.这似乎表明英特尔可以增加管道数量.然而,已经发现该技术在实际实现中有些缺乏.然而,由于它是超标量技术的组成部分,我无论如何都提到过它.