栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

九、高级CPU设计

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

九、高级CPU设计

早期的CPU一秒只有一赫兹,到了现如今的CPU几亿甚至几兆赫兹的量级。
早起计算机的提速方式:减少晶体管的切换时间,但是这种提速方法会遇到瓶颈。之后厂商不断发明更加高新的技术提升计算机的运行速度、并且让计算机能够执行更加复杂的运算。
以前的CPU设计除法的时候,是单纯地让被除数累减除数直到结果为0或者负数是停下。现在的CPU专门设计了除法的模块加入进ALU中,让ALU变得更大更复杂。复杂度与速度之间的制衡是一个长久的命题,现代CPU中大大部分操作如加密文档、解码压缩视频、图形操作都有专门的模块处理,这些行为按照标准操作是需要耗费大量时间的。
随着每一代CPU对指令集的扩展,现代的CPU有着数千条指令以及执行指令的复杂电路;CPU的超高时钟速度带来了另外一个问题——如何能尽可能快地将数据交给CPU,这也就涉及到RAM的设计了。RAM是独立于CPU之外的组件,RAM与CPU之间的数据传递使用总线(BUS)实现。一个CPU一秒钟执行上亿条指令,小小的延迟也会造成问题。RAM需要时间寻找地址、读取数据、配置、输入数据等等,所以一条“从内存读取数据”的指令可能要多个时钟周期。如何解决这种延迟呢?一种方法是给CPU加一点RAM,叫做缓存(cache)。有了缓存之后,RAM向CPU传输数据可以不用只传一个,而是传一整批。加入CPU要获取地址为100的数据,RAM不会只传100的数据给CPU而是直接传100-200的数据给到CPU内部的缓存中。当CPU需要地址为101的数据时,就不用再到RAM获取,而是直接到缓存中获取。因为缓存离CPU近,一个时钟周期就能给数据,所以CPU不用空等。如果想要的数据已经存在于缓存就叫做“缓存命中”,如果不在缓存中就叫做“缓存未命中”。缓存还可以作为临时空间,存一些中间值,适合长/复杂的运算。假如CPU将RAM中地址100-200的数值相加并将结果存入150,数据不是存入RAM,而是存入缓存中,不但存入更快,而且这样未来就可以继续从缓存中这个结果并进行进一步运算时也是更快的。不过这里造成了一个有趣的问题:缓存和RAM不一致了——因此我们必须将这种不一致记录下来用于未来进行同步。因此缓存中每一块空间都有一个特殊标记,叫做“脏位(dirty bit)”,脏位用于记录缓存中与RAM不一致的位置。同步一般发生在当缓存满了而CPU又要在缓存中存入数据时,在清理缓存前会先检查脏位,如果脏位是“脏”的,那么在加载新内容之前会把数据从缓存写回RAM。
除了缓存,另外一种提升性能的方法叫做“指令流水线”,执行一条指令的步骤是“取指令——解码——执行”,这样一条指令的执行就需要3个时钟周期。但是因为每个步骤使用CPU的不同部分,因此可以进行并行处理:在执行一条指令的时候可以解码下一条指令并且读取下下一条指令。这样我们就使用了流水线的方式将不同重叠进行的任务并行执行。通过流水线方式执行指令,吞吐量变为原来的3倍。

但是这种流水线也会存在隐患,第一个问题是指令之间的依赖关系,如果并行的指令需要对同一位置的数据进行操作,就会出现冲突。比如一条指令是LOAD指令,在取指令阶段尝试获取地址A的值,恰好流水线上与它并行执行的另一条指令是STORE指令,在执行阶段要将值存入地址A,那么LOAD指令取得的究竟是A的新值还是旧值呢?这就是不确定的。因此这样就出现了冲突。因此流水线处理器要先弄清楚流水线上各个数据的依赖关系,必要时要停止流水线( 停工 stall),避免出现问题。有些高端CPU还可以动态地排序有数据依赖关系的指令、最小化流水线的停工时间,这就叫做“乱序执行”。

流水线的第二个问题就是条件跳转,比如jump negative。程序的每一条指令虽然可能是按照地址从上到下顺序存入的,但是程序在执行时可能并不是真正地按照地址的累加一条条地执行所有指令,因为会有条件跳转语句,可能会让你从位置x直接跳到位置y来执行新的指令循环,而不是执行位置x+1的语句。因此程序的执行流会改变。简单的流水线处理jump指令一般都是直接停工直到条件值能够确定下来。一旦JUMP的结果确定了,就继续处理流水线。高级CPU为了避免停工的延迟,会采取“推测执行”,假设JUMP是个岔路口,那么CPU会猜测JUMP指令指向哪条路的可能性更大一些,并提前将指令放进流水线,这就叫“推测执行”。如果CPU猜测正确,就可以马上执行流水线而不用停工;如果猜测错误,就需要清空流水线,为了尽可能减少清空流水线的次数,CPU厂商开发了复杂的方法来猜测那条分支更有可能,叫做“分支预测”。现代CPU的正确率可以做到90%.
理想情况下CPU一个时钟周期可以处理一条指令,“超标量处理器”可以在一个时钟周期完成多条指令。即使有流水线设计,在指令执行阶段,处理器内有些区域可能还是空闲的。比如执行一个指令需要从RAM中取值,ALU是会在指令循环期间闲置的。所以一次性处理多条指令(取指令+解码),然后择机执行指令会更好。如果多条指令需要CPU的不同部分,那就多条指令同时执行。在超标量处理器的基础上我们还可以更进一步,加多几个相同的电路来执行出现频次很高的指令,比如一个CPU有4个或者8个完全相同的ALU,这样就可以同时执行多个数学运算。

向上述说的方法(流水线、超标量处理器以及超标量处理器加强版)都是针对一条指令流的优化,另一个提升性能的方法就是运行多条指令流,也就是“多核处理器”。也就是一个CPU芯片里有多个独立的处理单元,如下图所示。每个核像一个独立的CPU,但是他们也有共享的资源,例如缓存,使得多核之间可以合作运算。

如果多核不够时,我们还可以让一台电脑里安装多个CPU,例如提供播放视频服务的网站的服务器。常见的为2个或者4个CPU。但是人们还想要更高性能的计算机,所以创造了超级计算机,一般拥有着上万个CPU,每个CPU有着上百个核心,每个核心的频率达到GHz。每秒可以进行亿亿次量级的运算。例如无锡的神威超级计算机每秒可以进行9.3亿亿次浮点运算,这也称为每秒浮点运算次数(FLOPS)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331971.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号