CPU如何在每个周期内交付多个指令?


41

Wikipedia的第二页说明说,i7 3630QM在3.2 GHz的频率下可提供约110,000 MIPS。会是(110 / 3.2条指令)/ 4核=每核每个周期〜8.6条指令吗?一个内核如何在每个周期内交付多个指令?

据我了解,流水线每个时钟只能传送一个结果。

这些是我的想法:

  • 内部频率实际上高于3.2 GHz
  • CPU的某些部分是异步的,就像我这样谦虚的人无法理解
  • 每个核心有多个并发管道
  • 流水线可以提供比每个时钟更多的结果,指令可以跳过流水线阶段,并且有多个预取器可以跟上
  • 我想念一些东西

1
它提供110,000 Dhrystone MIPS,所以我直接看到DMIPS,而不是MIPS-也许这会有所作为吗?参见en.wikipedia.org/wiki/Dhrystone

Answers:


44

首先,正如基兰(Keelan)的评论Turbo J的答案所指出的那样,该度量是113,093 Dhrystone MIPS,而不是本机 MIPS。

i7 3630QM的常春藤微体系结构每个周期只能提交4个融合微指令,尽管每个周期可以执行6个微指令。(代码痕迹中融合的微指令的数量大约等于指令的数量;一些复杂的指令被解码为多个未融合的微指令,并且某些指令对可以融合为一个微指令,例如,立即比较然后有条件的跳转。)

关于如何在单个周期内执行多条指令的两种推测非常有效,并且已在实际处理器中使用。您最初的猜测是,使用了更快的内部时钟,这是在原始Pentium 4的“火球” ALU中使用的。这些ALU的时钟频率是内核其余部分的两倍,而后者已经相当高。

(这是通过使用交错的ALU完成的,其中加法运算的下半部分在一个周期内完成,允许从属运算在下一个循环中使用结果的下半部。对于加法,异或运算或左移运算仅需要操作数的下半部分来产生结果的下半部分,这种交错操作(也称为宽度流水线操作)允许单周期结果延迟以及单周期吞吐量。)

HyperSPARC使用了一种有点相关的技术,即级联ALU。HyperSPARC将两个ALU的结果馈入第三个ALU。这允许在一个周期内执行两个独立的操作和第三个独立的操作。

您猜测“每个内核有多个并发管道”是已使用的另一种技术。这种设计称为超标量,是迄今为止增加单个循环中执行的操作数的最常用方法。

可能还有其他一些指令执行的零散目标。可以在普通执行单元之外更有效地执行某些操作。移动消除技术利用乱序处理器中的寄存器重命名来在寄存器重命名过程中执行移动操作。此举只是将物理寄存器从重命名表(称为寄存器别名表)的一个位置复制到另一位置。这不仅有效地增加了执行宽度,而且还消除了依赖性。这项技术在基于堆栈的x87上很早就使用过,但是现在广泛用于Intel的高性能x86处理器中。(与典型的RISC相比,在x86中使用破坏性的双操作数指令使消除操作更有帮助。)

类似于移动消除的技术是重命名过程中寄存器清零指令的处理。通过提供一个提供零值的寄存器名称,寄存器清除指令(如xor或减法,两个操作数都在同一寄存器中)可以简单地将该名称插入重命名表(RAT)中。

一些x86处理器使用的另一种技术降低了推送和弹出操作的成本。通常,使用堆栈指针的指令必须等待一个完整的周期才能进行上一次压入或弹出操作,以更新堆栈指针的值。通过认识到推入和弹出仅向堆栈指针添加或减去一个小值,可以并行计算多个加法/减法的结果。加法的主要延迟是进位传播,但是值较小时,基值的更高有效位(在这种情况下为堆栈指针)最多只能有一个进位。这允许类似于进位选择加法器的优化被应用于小值的多次加法。另外,由于堆栈指针通常仅由常量更新,

也可以将指令合并为单个更复杂的操作。尽管将指令拆分为多个更简单的操作的逆过程是一种旧技术,但合并指令(Intel称其为宏运算融合)可以使实现支持比指令集中公开的操作更复杂的操作。

从理论上讲,已经提出了其他技术。RAT中可以支持零以外的其他小常数,并且可以尽早处理一些使用或可靠地产生此类小值的简单操作。(“物理寄存器内联”,Mikko H. Lipasti等人,2004年,建议使用RAT作为减少寄存器数量的一种方法,但是该思想可以扩展为支持加载小立即数和对小数进行简单操作。)

对于跟踪高速缓存(在控制流的特定假设下存储指令序列),可能有机会合并由分支分隔的操作,并删除在跟踪中产生未使用结果的操作。在跟踪高速缓存中对优化进行高速缓存还可以鼓励执行诸如指令合并之类的优化,如果每次获取指令流时都必须执行这些优化,那么这些优化可能就不值得了。

值预测可用于通过删除依赖项来增加可以并行执行的操作数。基于跨步的值预测器类似于前面提到的专用堆栈引擎的弹出/推入优化。它几乎可以并行计算多个加法,而无需序列化。值预测的一般思想是,有了预测值,相关操作就可以毫无延迟地进行。(分支方向和目标预测实际上只是值预测的一种非常有限的形式,允许提取以下指令,这些指令取决于分支的“值”(是否采用)以及下一条指令地址,即另一个值。)


太棒了!感谢您提供宝贵的信息。您能推荐一本我可以阅读所有这些建筑技术的书吗?
无效的2014年

@workless一旦您了解了流水线和无序超标量执行的基础(大多数计算机体系结构教科书都将涵盖这些基础知识),则最好的信息来源可能是特定处理器微体系结构的描述(例如有关Haswell的文章已链接)。在gnasher729的答案中)和学术论文(ISCA和MICRO [会议]通常都有很好的论文; HPCA,PACT,ASPLOS以及其他一些论文也都有很好的声誉)。Andy Glew(也许最著名的是他在Pentium Pro上的工作)...
Paul A. Clayton 2014年

1
...正在研究CompArch Wiki,该Wiki将提供更高级的概念,但进展缓慢,而且显然是在不久前被黑客入侵的,因此现在仅给出错误消息(semipublic.comp-arch.net/wiki)。他打算使用其他Wiki软件(他正在使用的软件有问题,并以此作为进行改进的机会)来恢复Wiki(原始文本已保留),但是“这还需要一段时间。”
保罗·克莱顿

超标量架构成功的一个很好的例子是英特尔的超线程技术-通过所有这些优化,英特尔工程师发现,大部分时间中大约30%的ALU未被使用,因为内存无法足够快地流入,或者管道填​​充效率不足。HyperThreading使您可以在理想情况下免费获得大量工作。它远比拥有一个单独的新内核要少,但是它也便宜得多(它也可以与多核结合使用)。
a安

@ PaulA.Clayton-该页面的两个截图位于Wayback上。2013年12月20日2014年2月14日。我不知道这些捕获是否早于页面问题。不幸的是,当我尝试在Wayback上访问这些页面时,收到了“ Bummer。提供该文件的计算机已关闭。我们正在处理它。 ”消息,因此我不确定在那些页面上可以看到什么。
凯文·费根

10

现代处理器内部发生了一些不可思议的魔术,但是您的想法绝对正确。

了解现代处理器效率的关键是意识到它们是超标量的。从维基百科(重点是我的):

超标量CPU体系结构在单个处理器中实现了一种称为指令级并行性的并行性形式。因此,与给定时钟速率下的CPU吞吐量相比,它可以提供更快的CPU吞吐量

如您所料,这些现代处理器的每个内核具有多个执行单元。 超线程是一个有趣的考虑因素,流水线的某些部分是重复的,但有些则不是。

乱序执行也很有趣,但并不能直接回答您的问题。但是,它确实减少了“浪费”的CPU周期数。

效率还受到许多其他因素的影响,这些因素可能导致处理器内部停顿,包括(但绝对不限于):

  • 先前说明的结果不可用。
  • 缓存未命中。
  • 代码分支,这将使已获取的指令无效(在此处此处了解有关分支预测的信息)。

现代的编译器试图帮助解决上述许多问题,然后由处理器接管。举一个很好的例子,在Stackexchange的其他地方可以看到这个问题,该问题突出了两个可以做相同事情的指令之间的重要区别(在某些情况下)。但是,由于使用了执行单元,因此在某些处理器上,一个可能比另一个更“快速”。

有关现代CPU管道的易于理解的解释,请参阅《 CPU管道之旅》。有关更多技术说明,请参阅Agner Fog的Microarchitecture文件。


感谢您的解释和非常有趣的链接。值得注意的是,Cell看起来非常有趣,我期待更多地研究cpu架构^ _ ^。“” x86使用如上所述的“超级管道”。Cell系列使用“协同”方法,涉及九个微型CPU。的确,每个mini-cpu遵循一条基本按顺序排列的管道,mini-cpus具有多个并行的超标量管道,而不是单个管道。“”“
无效,2014年

3

您认为发生了什么事:英特尔,AMD和IBM的所有工程师都读到,一条流水线只能在每个周期内提供一个结果,他们说:“哦,就是这样,不能再使这些处理器变快了”。还是他们读了这句话说:“每个周期不能提供一个以上的结果?我们会看看的!”。

例如,要获得有关Haswell架构的良好介绍,您可以单击以下链接http://www.realworldtech.com/haswell-cpu/,或者直接访问Intel网站,并在那里找到一些文档。

Haswell处理器的每个核心都有大量执行单元,它们可以彼此独立地执行操作,因此可以并行执行多个操作。接下来,Haswell处理器具有多个执行单元,可处理最大为256位的向量运算。向量运算可以例如在一个向量运算中执行四个双精度浮点运算或八个单精度浮点运算。最后,Haswell处理器支持“融合乘法加法”,这意味着计算时间b加c只是一个操作。

由于Haswell具有两个能够进行融合乘法加法运算的单位,因此理论上的最大值是每个周期两个融合乘法加法运算,每个运算执行8个单精度乘法加法或32个单精度浮点运算。

3630处理器不在Intel最新价格表中,但有些型号具有3740QM(具有四个内核)。因此,每个时钟周期可以获得32个浮点运算,而不是32个。这是理论上的最大值。在现实生活中实现一半的挑战是一个挑战,但对于合适的任务并非不可能。还有其他可用的处理器,最多具有15个内核(即使最狂热的游戏狂热者也不会支付的价格)。

因此,您有几个乘数的组合:

  1. 每个处理器多个内核。
  2. (以前没有提到的超线程技术使您更接近理论极限)
  3. 融合乘法加法运算执行两个算术运算,仅算作一个。
  4. 进行8次运算的256位向量仅计为1。
  5. 两个向量执行单元能够处理融合乘加。

每个周期8.6个操作并不是很难实现。每个内核每个周期甚至8.6次操作也不太困难。


我不知道设计具有一些运行x86的内核和一些针对超标量行为进行了优化的指令集的CPU是可行还是有利。我知道英特尔和AMD在解决x86指令集的局限性方面做了一些非常了不起的事情,但是在某些情况下,我认为了解当前指令集无法表达的一些内容会有所帮助。例如,ADD基于溢出是不受影响还是应该在溢出发生时设置(如果没有发生则设置)的不同版本的指令。
2014年

1
我发现自己很伤心,在当今时代,许多语言默认不检查溢出。我知道Java在很大程度上受语义要求的限制,但是在C#之类的语言中同时包含陷阱和非陷阱算术运算符的情况下,我看到不陷阱溢出的唯一好理由是因为它需要包装行为。目前,溢出检查可能会严重影响速度,但是如果围绕某种语言设计机器语言,那就是不需要精确捕获溢出陷阱,只要代码可以确保在操作之前没有发生溢出...
supercat

...达到某些临界点,应该有可能将溢出陷阱开销减少到几乎为零。如果代码执行了一个计算,然后将一个值存储到一个位置,如果第一个计算溢出,该值将被放弃,那么就没有必要将存储延迟到处理器知道第一个计算是否成功,但是处理器目前无法解决。知道这一点。如果代码可以简单地执行所有可以安全执行的操作(无论是否发生溢出),然后检查其中是否有任何不正确的溢出...
supercat

...这似乎应该有助于减少执行依赖性。
supercat

2

Drystone基准测试始于1984年,而相应的标称1 MIPS VAX机器在现代意义上并不是很有效。甚至Cortex M3都可提供1,25 DMPIS / MHz。

英特尔酷睿架构处理器的确可以在单个内核中并行运行多个指令,因为存在多个计算单元。


1

我从Ars Technica的Jon“ Hannibal” Stokes中学到了很多关于微处理器体系结构的优秀文章。文章有些过时(它们似乎来自2004年左右),但仍然非常相关。

文章m-下半部分的某些链接已断开,但是您似乎可以通过仔细比较第一部分的URL和下一页的断开URL(例如,在URL中添加somwehere)自行修复它们。

(是的,这是一个仅链接的美化回答,对不起;文章太好了,更不用说了)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.