关于CPU科普,这篇说得最详细( 三 )


回到分支机构,希望您可以开始看到此问题 。如果直到周期10才知道一条指令是分支,那么我们将已经开始执行9条新指令,如果采用该分支,这些指令可能无效 。为了解决这个问题,CPU具有非常复杂的结构,称为分支预测器 。他们使用机器学习中的类似概念来尝试猜测是否将采用分支 。分支预测变量的复杂性远远超出了本文的范围,但是在基本级别上,它们跟踪先前分支的状态,以了解是否可能采用即将到来的分支 。现代分支预测器可以具有95%或更高的准确性 。
一旦确定分支的结果(已完成流水线的该阶段),程序计数器将被更新,CPU将继续执行下一条指令 。如果分支的预测错误,则CPU将在分支错误地开始执行后抛出所有指令,然后从正确的位置重新启动 。
 
乱序执行现在,我们知道如何执行三种最常见的指令类型,让我们看一下CPU的一些更高级的功能 。实际上,所有现代处理器实际上并没有按接收顺序执行指令 。等待执行其他指令时,可以使用称为乱序执行的范例来最大程度地减少停机时间 。
如果CPU知道即将到来的指令,但所需的数据并不能及时准备,这时候它可以在等待时切换指令顺序并从程序的后面引入一条独立的指令 。该指令重新排序是一种功能非常强大的工具,但它远非CPU使用的唯一技巧 。

关于CPU科普,这篇说得最详细

文章插图
另一个提高性能的功能称为预取 。如果您要花时间从头到尾完成一条随机指令需要多长时间,您会发现内存访问大部分时间都用完了 。预取器是CPU中的一个单元,它试图预见将来的指令以及它们将需要什么数据 。如果发现需要CPU尚未缓存的数据,它将到达RAM并将该数据提取到缓存中 。因此它的名称叫做预取 。
 
加速器与未来在CPU中,另一个正在增加的主要功能是对于特定任务的加速 。这些电路的全部工作是尽可能快地完成一项小任务 。这可能包括加密,媒体编码或机器学习 。
CPU可以自己完成这些事情,但是拥有专用于它们的单元会大大提高效率 。专用GPU就是一个很好的例子 。CPU当然可以执行图形处理所需的计算,但是为它们配备专用单元可以提供更好的性能数量级 。随着加速器的兴起,CPU的实际核心可能只占芯片的一小部分 。
下图显示了几年前的Intel CPU 。大部分空间被内核和缓存占用 。下面的第二张图片是新的AMD芯片 。那里的大部分空间都由核心以外的组件占用 。
关于CPU科普,这篇说得最详细

文章插图
关于CPU科普,这篇说得最详细

文章插图
 
走向多核最后要介绍的主要功能是如何将一堆单独的CPU连接在一起以形成多核CPU 。这不只是简单地放入我们之前讨论的单核设计的多个副本那样简单 。就像没有简单的方法将单线程程序转换为多线程程序一样,相同的概念也适用于硬件 。问题来自核心之间的依赖性 。
例如,对于4核设计,CPU需要能够以4倍的速度发出指令 。它还需要四个单独的内存接口 。由于多个实体可能会处理相同的数据,因此必须解决诸如一致性和非一致性之类的问题 。如果两个内核都使用相同的数据来处理指令,那么他们如何知道谁拥有正确的价值?如果一个内核修改了数据但又没有及时到达另一个内核执行该怎么办?由于它们具有可存储重叠数据的单独缓存,因此必须使用复杂的算法和控制器来消除这些冲突 。
随着CPU中内核数量的增加,正确的分支预测也非常重要 。内核一次执行的指令越多,其中一个处理分支指令的可能性就越高 。这意味着指令流可能随时更改 。
通常,单独的内核将处理来自不同线程的指令流 。这有助于减少内核之间的依赖性 。这就是为什么如果您检查“任务管理器”,您会经常看到一个核心在努力工作,而其他核心却在工作 。许多程序不是为多线程设计的 。在某些情况下,让一个核心来完成工作比支付试图分工的开销要高得多 。
 
物理设计本文的大部分内容都集中在CPU的体系结构设计上,因为这是大多数复杂性所在 。但是,所有这些都需要在现实世界中创建,这又增加了另一层次的复杂性 。
为了使整个处理器中的所有组件同步,使用了时钟信号 。现代处理器通常在3.0GHz和5.0GHz之间运行,并且在过去十年中似乎没有改变 。在每个周期中,芯片内部数十亿个晶体管处于导通和截止状态 。


推荐阅读