处理器如何执行比其频率更多的IPS?[重复]


14

这是我似乎无法解决的问题。几乎每个现代处理器每秒都能执行比其频率更多的指令。

我能理解为什么低级处理器可以执行比其频率更少的IPS。例如,ATmega328在16 MHZ时执行大约16 MIPS(或者至少是我所说的),而Z80在4 MHz时执行0.5 MIPS。但是Pentium 4 Extreme只能在3.2 GHz上执行超过9 GIPS的性能。每个时钟周期大约需要三个指令!

如何做到这一点,为什么不能在较小的处理器(例如AVR微控制器)中实现呢?

我从这里找到了除ATmega328以外的所有信息。


3
看一下Wikipedia中的流行词,例如管道,超标量架构,乱序执行,同时多线程,多核,向量扩展(SSE,...,AVX),缓存等。总的来说,CPI值可以小于1.0。
Paebbels

7
您的奔腾4的意思是9 GIPS,不是MIPS,不是吗?
Calimo

5
自我提升:CPU如何在每个周期内交付多个指令?在Electrical Engineering Stack Exchange上被问到(我的回答被接受并且可能过高)。
保罗·克莱顿

我一直想知道,如果它已经达到我认为应该的最高水平,我是否应该投票否决?或者,如果我认为职位的努力和质量值得奖赏,还是总是投票赞成?
彼得·科德斯

@PeterCordes有不同的投票方式。有些人声称“有用”是唯一标准,另一些人则认为相对价值(用于回答)。我倾向于考虑绝对投票数(“不错”,“好”,“伟大”的徽章表明应该考虑这样)以及相对投票数(这有助于回答排名)。令人惊讶的是,Meta.SE在该主题上似乎没有太多内容,并且“ 我应该如何投票? ”甚至没有答案!
保罗·克莱顿

Answers:


23

这是由于现代处理器功能的组合。

导致较高IPS的第一件事是,现代处理器具有多个可以独立运行的执行单元。在下图(从Wikipedia:Intel Core Microarchitecture借用)中,您可以在底部看到八个执行单元(以黄色显示)可以同时执行指令。并非所有这些单元都可以确保相同类型的指令,但是它们中至少有5个可以执行ALU操作,并且具有三个具有SSE功能的单元。

在此处输入图片说明

将其与长指令流水线相结合,可以有效地堆叠准备好让这些单元执行指令的指令(如果需要,可以乱序执行),这意味着现代处理器可以在任何给定的时间动态运行大量指令。

每条指令可能需要几个时钟周期来执行,但是如果您可以有效地并行执行它们,那么您可以以处理器复杂性和热量输出为代价,极大地提高IPS的能力。

要使这些大型管线充满指令,还需要一个大型缓存,可以预填充指令和数据。这有助于增加芯片的尺寸以及处理器产生的热量。

在较小的处理器上不执行此操作的原因是,它实质上增加了处理核心周围所需的控制逻辑量,以及所需的空间量和热量。如果您想要一个小巧,低功耗,高响应的处理器,那么您需要一个短的流水线,而不会在实际的功能核心中包含过多的“额外”内容。因此,通常它们将缓存减至最少,将其限制为处理指令所需的每种类型的单元之一,并降低每个部分的复杂性。

他们可以使小型处理器与大型处理器一样复杂,并获得类似的性能,但是随后的功耗和散热要求将成倍增加。


我从来不知道有专门的执行单位,而且其中不止一个。但是,仍然可以拥有一个超标量的Arduino。如果这意味着更高的吞吐量,我不介意电源和散热要求。感谢您的回答。
哈卡

1
如果需要超标量处理器,请使用一个。但是,对于确实关注超标量处理器的电源和散热要求(以及成本和复杂性)的人们来说,Arduino占据着一个小众市场。
David Schwartz


3

比Mokubai的答案更基本:

超标量CPU分析指令流中指令之间的数据(和其他)依赖性。彼此不依赖的指令可以并行运行。

典型的x86台式机CPU每个时钟周期获取16或32B条指令。Intel设计的是Core2,因此每个周期最多可以发布4条指令。(或5,如果有一个可以进行宏融合的比较分支)。

请参阅Mobukai的一个很好的答案,以获取链接和有关CPU在实际中如何与从运行的代码中提取尽可能多的指令级并行性有关的任务的详细信息。

另请参阅http://www.realworldtech.com/sandy-bridge/和其他CPU架构的类似文章,以深入了解其背后的内容。


-2

先前的答案显示了如何获得处理器定义的“指令”执行的更多指令,并且人们想象这实际上是发问者的意图。

但是,它的另一个来源可能是,每个“指令”实际上是处理器视为输入的指令的一定数量的数据。如果他的来源计数只是计算处理器视为指令的计数,则以下内容不添加任何内容。但是,如果他的消息来源计算了人类称之为“指令”的所有内容,那么:再加上,并不是每条指令在物理上都和其他每条指令一样长(一个指令可能是12个字节,另一个可能是56个字节,等等)。因此,如果每个周期将它作为“一条指令”加载64字节的材料(或在达到64字节之前加载尽可能多的完整指令),并且在64字节中有6条指令,那么有6条指令(您和我可能会认为它们)将在该循环中完成。

由于许多非常基本的指令(我们的“明智的”定义)是早期以来剩余的8字节指令长度,并且根据定义,非常基本的指令可能不成比例地使用,因此这将对执行更多的“指令”大有帮助比频率似乎允许的多。


这有点接近CPU的实际工作方式,但是每个周期获取多个机器insns只是超标量CPU工作方式的一部分。(对于x86,平均insns长度更像是4字节。)较深的管道意味着现在正在获取的指令可能无法完成15个周期的执行(或者更长的时间,如果被高速缓存未命中所阻止,但是非相关指令可能继续执行。)您的解释根本没有描述流水线设计。也没有什么你觉得差是8bit 8086之间的明确add al, bl和80386 add eax, ebx
彼得·科德斯

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.