学习啦 > 学习电脑 > 电脑硬件知识 > CPU知识 >

CPU基础知识拓展

时间: 怀健20 分享

CPU 的全称是 Central Processing Unit,它是你的电脑中最硬核的组件,这种说法一点不为过。CPU 是能够让你的计算机叫计算机的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。下面就让小编带你去看看CPU基础知识拓展,希望能帮助到大家!

程序优化:CPU缓存基础知识

CPU缓存

CPU缓存(CPU Cache)的目的是为了提高访问内存(RAM)的效率,这虽然已经涉及到硬件的领域,但它仍然与我们息息相关,了解了它的一些原理,能让我们写出更高效的程序,另外在多线程程序中,一些不可思议的问题也与缓存有关。

现代多核处理器,一个CPU由多个核组成,每个核又可以有多个硬件线程,比如我们说4核8线程,就是指有4个核,每个核2个线程,这在OS看来就像8个并行处理器一样。

CPU缓存有多级缓存,比如L1, L2, L3等:

L1容量最小,速度最快,每个核都有L1缓存,L1又专门针对指令和数据分成L1d(数据缓存),L1i(指令缓存)。

L2容量比L1大,速度比L1慢,每个核都有L2缓存。

L3容量最大,速度最慢,多个核共享一个L3缓存。

有些CPU可能还有L4缓存,不过不常见;此外还有其他类型的缓存,比如TLB(translation lookaside buffer),用于物理地址和虚拟地址转译,这不是我们关心的缓存。

下图展示了缓存和CPU的关系:

Linu__用下面命令可以查看CPU缓存的信息:

$ getconf -a | grep CACHE

LEVEL1_ICACHE_SIZE 32768

LEVEL1_ICACHE_ASSOC 8

LEVEL1_ICACHE_LINESIZE 64

LEVEL1_DCACHE_SIZE 32768

LEVEL1_DCACHE_ASSOC 8

LEVEL1_DCACHE_LINESIZE 64

LEVEL2_CACHE_SIZE 262144

LEVEL2_CACHE_ASSOC 8

LEVEL2_CACHE_LINESIZE 64

LEVEL3_CACHE_SIZE 31457280

LEVEL3_CACHE_ASSOC 20

LEVEL3_CACHE_LINESIZE 64

LEVEL4_CACHE_SIZE 0

LEVEL4_CACHE_ASSOC 0

LEVEL4_CACHE_LINESIZE 0

上面显示CPU只有3级缓存,L4都为0。

L1的数据缓存和指令缓存分别是32KB;L2为256KB;L3为30MB。

在缓存和主存之间,数据是按固定大小的块传输的 该块称为缓存行(cache line),这里显示每行的大小为64Bytes。

ASSOC表示主存地址映射到缓存的策略,这里L1,L2是8路组相联,L3是20路组相联,等一会儿再说是什么意思。

缓存结构

一块CPU缓存可以看成是一个数组,数组元素是缓存项(cache entry),一个缓存项的内容大概是这样的:

+-------------------------------------------+

| tag | data block(cache line) | flag |

+-------------------------------------------+

data block就是从内存中拷贝过来的数据,也就是我们说的cache line,从上面信息可知大小是64字节。

tag 保存了内存地址的一部分,是用来验证是否缓存命中的。

flag 是一些标志位,比如缓存是否失效,写dirty等等。

实际上LEVEL1_ICACHE_SIZE这个数据,是用data block来算的,并不包括tag和flag占用的大小,比如64 __ 512 = 32768,表示LEVEL1_ICACHE_SIZE可以缓存512个cache line。

缓存首先要解决的问题是:怎么映射内存地址和缓存地址?比如CPU要检查一个内存值是否已经缓存,那么它首先要能算出这个内存地址对应的缓存地址,然后才能检查。

为了解决这个问题,缓存将内存地址分成下面几个部分:

+-------------------------------------------+

| tag | inde__ | offset |

+-------------------------------------------+

tag和缓存项中的tag对应,用来验证是否缓存命中的。

inde__ 缓存项数组中的索引。

offset 缓存块(cache line)中的偏移,因为缓存块是64字节,而内存值可能只有4个字节,一个缓存块可以保存多个连续的内存值。这个offset实际上就是指明内存值在cache line中的位置。

直接映射缓存

现在我们举一个具体的例子,说明内存和缓存是如何映射的:

假如缓存的大小是32768B(32KB),缓存块大小是64B,那么缓存项数组就有? 32768?/64=512 个。

CPU要访问一个内存地址0__1CAABBDD?,它首先检查这个内存地址是否在缓存中,检查过程是这样的:

内存地址的二进制形式是(低位在前面):

| tag | inde__ | offset |

0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1

先计算内存在cache line中的偏移,因为缓存块是64字节,那么offset需要占6位(2^6=64),即offset=011101=29。

接着要计算缓存项的索引,因为缓存项数组是512个,所以inde__需要占9位(2^9=512),即inde__=011101111=239。

现在我们通过offset和inde__已经找到缓存块的具体位置了,但是因为内存要远比缓存大很多,所以多个内存块是可以映射到同一个位置的,怎么判断这个缓存块位置存的就是这个内存的值呢?答案就是tag:内存地址去掉inde__和offset的部分,剩下的就是tag=00011100101010101=0__3955。

通过inde__找到缓存项,比较缓存项中的tag是否与内存地址中的tag相同,如果相同表示命中,就直接取缓存块中的值;如果不同表示未命中,CPU需要将内存值拷贝到缓存(替换掉老的)。

这种映射方式就称为直接映射(Direct mapped),它的缺点就是多个内存地址会映射到同一个缓存地址,拿上面的内存地址来看,只要offset和inde__相同的内存地址,就一定会映射到同一个地方,比如:

00011100101010100 011101111 011101

00011100101010110 011101111 011101

00011100101010111 011101111 011101

如果同时访问上面3个地址,就会一直替换缓存的值,也就是一直出现缓存冲突,这可能比没有缓存还要慢,因为除了访问内存外,还多一个拷贝内存值到缓存的操作。

N路组相联

为了解决上面的问题,我试着把缓存项数组分成2个数组(2路),比如分成2个256的数组,如下图所示:

查找过程和上面其实一样的:

先通过inde__找到数组索引,只不过因为是2路,所以存在2个数组。

然后通过内存tag依次比较2个缓存顶的tag,如果其中一个tag相等,说明这个数组缓存命中;如果两个都不相等,说明缓存不命中,CPU会拷贝内存值到缓存中,但是现在有2个位置,要拷贝进哪个呢?我的理解CPU应该是随机选1路拷贝。

offset这个其实无关紧要,因为它是cache line中的偏移。

那这个和直接映射相比,好在哪里呢,因为一个内存值会随机拷贝到2路中的1个,所以缓存冲突(多个内存地址映射到同一个缓存地址)的概率会降低一半;如果把缓存项数组分成4个数组,这就是4路组相联。

上面LEVEL1_ICACHE_ASSOC的值等于8,表明是8路组相联。分组越多,缓存冲突率越低,但是CPU要遍历的数组就越多,这是一个权衡的问题。

通过观察也可以发现,其实直接映射就是1路组相联。如果直接分成512个数组,那每个数组只有1项,这种就是全相联,CPU直接遍历512个数组,判断内存地址在哪1个。

缓存分配策略和更新策略:

当CPU从内存读数据时,如果该数据没有在缓存中(cache miss),CPU会把数据拷贝到缓存。

当CPU往内存写数据时:

如果缓存缺失,CPU会先从内存拷贝数据到缓存,然后再更新缓存的数据。

CPU更新缓存数据,也可能有多个策略:

直接写(write through):更新缓存的数据,同时更新内存的数据。

写回(write back):只更新缓存的数据,同时在缓存项设置一个drity标志位,内存的数据只会在某个时刻更新(比如替换cache line时)。

从上面描述我们知道,当我们向一个内存写数据时,内存中的数据可能不马上被更新,这个新数据可能还在cache line呆着。因为每个核都有自己的缓存,如果CPU不做处理,可以想象一定会出问题的:比如核1改了数据,核2去读同一个数据,此时数据还在核1的缓存中,核2读到的就是老的数据。CPU为了处理多核间的缓存同步,那是相当的复杂。

《装机小知识-CPU篇》

首先给大家讲一下,本次内容主要给大家普及一下购机DIY知识,不做深层讲述(讲了小白也不懂),只求做到简单化明了化,给您一个明确的DIY购机思路,选择适合你自己的一台电脑,而不是3000进吧1万带回家用几年却只发挥了2000的性能。

CPU最重要的几个参数,制程,架构,主频,核心,缓存。以及支持几代的内存和是否有核心显卡。支持的内存肯定是越新越好,内存方面的我们在内存一栏详细讲诉

核心显卡这里简单先讲了,目前intel目前最高级别的核心显卡UHD630,水平在独立显卡GT730 的档次(略高一点)。日常办公,平面设计,家庭影音,都没有问题,DNF,梦幻西游,LOL 以及各种网页游戏都能玩。核心显卡在你使用两条内存组双通的情况下性能会有较大提升,所以你想节约预算又只玩小型游戏比如LOL 就可以考虑组个双通内存就可以了,可以做到高特效流畅。 具体表现可以 点击此处 观看测试视频(AMD最新一代核显强于intel核显)

接下来我们就讲CPU最主要的核心参数。

制程:制程越小代表着同一大小芯片上可以做更多晶体管,提高性能降低功耗(功耗越高耗电越多发热量越大,CPU温度上升性能寿命会下降,所以功耗很重要),制程越小每个芯片可以有更多的流水线或者是更多的核心。从第六代酷睿开始 intel就一直使用14nm制程工艺,包括最新的9代酷睿,也是14nm的,而AMD二代锐龙是12nm制程工艺,另外可能大家也看到过华为麒麟980宣传的7nm以及台积电公布的突破5nm量产工艺。为什么intel就一直不更新制程工艺,实际上个人觉得主要有两个方面。

1:intel是自建生产线,只生产自己家产品,如果换制程那么生产线基本要重建,然而14nm的生产线才刚建没几年,实在没想到芯片制程工艺突破如此迅速。因为台积电是代工生产芯片,所以他的核心竞争力就是要更高端精密的制程工艺,才有更多厂家找他代工。

2:intel得益于自身架构的优化以及芯片的稳定性,即便是14nm制程的芯片功耗也不高。尤其是用在台式机上,中低端主流的i3 i5 一般散热器都能压住,至于高端超频系列的CPU,好一点的散热器也没有问题。在2017年以前intel在PC芯片都是出于垄断地位,可能觉得自己不需要这么着急突破,挤挤牙膏就算更新迭代了,所以更新制程带来的低功耗,高性能在当时的intel看来不是那么急切需要提高,殊不知自己的不思进取给了AMD很多的时间来打一个翻身仗。。。又或者intel早已开发7nm级别的PC芯片,只是藏大招没拿出来而已。不过就这次AMD抢走一半市场以后intel的9代处理器还是14nm,还是加核心的手段看起来又不像有大招。哎 神仙打架我们关切个什么呢。总之现在,电脑处理器14nm没有任何问题,不必拿制程说事。

PS:相比PC处理器,手机处理器就需要更小的制程来达到高度集成的效果,降低功耗提升性能,增加续航。所以目前最新制程的处理器都是用在了手机上面。

架构:架构这个属于研发,很复杂,而且对装机没有太多的帮助,因为新的CPU架构都是进一步优化,且产品统一采用的都是新架构,通常都会比原架构更优秀,值得一提的就是intel与AMD 虽然都是基于__86指令集研发的架构,但是intel比AMD更稳定的原因主要就在于架构上的优势(仅限目前,且差距一直在缩小)架构其实是处理器性能非常重要的指标,只是统一性很高,对比又很少所以电脑普通用户没有必要深究。

主频(不是越高越好):主频是直接表现CPU性能的参数之一,但是以目前的工艺水平,主频不会有更大突破,上线基本会在4G-5GHz,Intel/AMD两大CPU厂商均将提升性能的手段放在多核心上。主要还是因为CPU频率越高,功耗及发热就会越高,散热就会是个问题,温度过高寿命及稳定性和性能都会大打折扣。频率更能反映单核的性能,目前仍然有很多软件是只支持单线程工作的,所以对于这类用户对频率的选择比重更大,比如现在销量很高的I5 8400主频只有2.8Ghz,如果让它工作只支持单线程的软件,这个时候你会发现,只有1个核心占用,剩下的5个核心占用为0。效果可能还不如i3 8100的3.6Ghz。

有部分机友对于我这个论断不满意,觉得贬低了8400(其实下文也有为8400正名),这里我主要想表达的是频率与单核的关系,当然我自己也忽略了一个问题就是I3 8100没有睿频,所以部分机友就拿8400的睿频来说体验效果是高于8100的,但是兄弟们,你们抓错方向了。

i5 8400 基础2.8G 睿频 1核4G 2核3.9G 3核3.9G 4核3.9G 5核3.8G 6核3.8G

这是理论最高值,条件满足能够达到,也的确是比I3 8100强,两款CPU本来也不是一个档次的,但是注意用词,我说的是可能不如I3 8100,因为睿频不可控,板载平台,供电,散热,CPU体质,实际载荷等等很多都影响着睿频,也有很多人的8400就是到不了3.8 ,只有3.2-3.3,你让他换个主板还是换个电源,而且睿频需要高负载情况下才有,那非高负载的程序呢?这样写的本质是在讲述频率与单核,基础频率一样很重要。请不要忽视。

但是i5 8400是六核六线程的多核处理器,解决支持多核多线程的软件即便主频较低,将处理任务分摊给多个核心来工作,那么单核就不需要那么高的性能也能游刃有余的完成任务。就好比一个人1秒能算10次,2个人每人1秒能算7次,对于支持多线程软件来说,同样给你1s 我两个人可以算14次,而你还是只能10次。如果是只支持单线程的软件的话,来来来,算10次那个人,给你发朵小红花。。

不过虽然8400主频是2.8GHz但毕竟i5,单核性能也不会很差,i5 8400总性高出i3 8100 40%左右。往后发展游戏多核将更为普遍,各类大型软件基本也会往支持多线程开发。购机前请先了解自己常用的软件是否对单核性能有较高的要求比如PS。如果是小型软件这些即便只支持单核也可以忽略掉,现在的CPU处理起来都没有问题。如果你有钱也很任性,选I7 8700K或者I9 9900K 超到5G大小通吃也是可以的。

关于频率选择,常见的以下几种,普通用户就看主频和睿频即可。

主频:CPU工作默认频率。

睿频:CPU高负载运行下,智能调节频率高于基础频率,达到提高CPU性能的目的(智能可控)

超频:玩家自己通过主板BIOS设定CPU频率和电压高于基础频率或者睿频频率,达到提高CPU性能的目的(超频有风险,烧毁无质保,一般超频到5GHz,好一点的水冷能压住。极度超频实用性不大,降温成本太高,不少厂商展示的时候用的都是液氮降温,只有部分CPU支持超频比如intel酷睿尾缀代K和AMD锐龙尾缀带__的。)

核心/线程(不是越多越好):上面讲主频的时候其实就已经讲到核心,总的来说核心要参考单核性能和多核性能,多核虽好,但不一定适合你,还要根据使用需求,平时就上网 看电影 用办公软件啥的买个I7 8700K也没什么用,体验基本和i3 8100一样。如果你喜欢玩大型游戏或者工作上用PS AE PR 分析软件之类的,多核对你来说就很重要了。 核心越多同一时间数据处理能力越强。

超线程:比如8核16线程的I9 9900K相较于8核I7 9700K,前者为拥有超线程技术的CPU。I7 9700K处理任务时,共8核心,一个核心一条线程,如果任务没有占满核心性能,那么这个核心剩余性能就闲置了,如果又来一个任务就只能用第二颗核心或者等任务处理完了再进行下一个任务。I9 9900K处理任务时,一个核心两条线程,如果任务没有占满核心性能,又来一个任务,那么就会用该核心的剩余性能进行处理,而不是用第二颗核心来处理,达到同时处理更多任务的目的,提高效率。

超线程是利用特殊的硬件指令一核模拟双核运行,但还是不如双核来的实际有用,核心数量才是性能标杆,超线程仅提高了CPU核心的使用效率,不能直接提升核心性能,也就是说如果数据计算已经吃满所有核心那么超不超线程都没有实际意义。超线程CPU用在仅支持单线程的程序上可能还达不到不带超线程功能的CPU性能,但性能差距也不会太大。超线程会大幅提高跑分数据(跑分没什么卵用)。

低端的超线程U比如G4560 G5400很好用,效果提升显著,因为核心少,超线程的话恰好能满足日常需求,因为现在电脑操作越来越快,同时下达的任务可能会好几个(比如看直播的同时下载电影然后又在挂游戏,微信,QQ在视频语音什么的)。以前低端的双核的CPU现在已经不适用了不能同时处理这么多任务,所以在G4560把超线程用上过后,直接解决了这个问题,性能及体验直逼i3 7100价格却只有其一半,被大家奉为神U。高端的CPU从酷睿八代或者锐龙1代开始核心就已经增多,正常使用情况下6核基本已经足够了,超不超线程的体验差距已经不大,高端超线程U比如I7 8700K 9900K在程序游戏多开的情况下效果比较好(这里多开是指同时开几个大型游戏或者几十个小型游戏或手游挂机这种),或者数据建模,大型工程分析关键,视频渲染也是比较占优势的。

目前大多主流游戏做的都是双核或者四核处理,新一点的游戏有的做到六核处理,如果你买电脑玩游戏,追求八核十六线程也没有用,仅有部分核心能用到。游戏体验和i5没有差别(多开除外)。

缓存(越大越好):缓存是一个很重要的参考指标,缓存分一级缓存 二级缓存 三级缓存,都集成在CPU上,容量都是越大越好,一级缓存级别最高,容量相比最小。CPU缓存相当重要,与CPU同频运行,远高于内存频率,CPU读取数据时一级二级三级依次读取,待三级缓存都没有的数据才从内存中调取,每级缓存命中概率都在80%左右,所以要从内存调用的数据其实是很少的,由于缓存速度远高于内存,所以缓存越大越能在使用过程中存放更多的数据,降低CPU调用数据的时间,提高执行效率,直接反应在使用体验上就是速度快。比如很多朋友升级CPU过后明显觉得速度快了很多,用在单核小程序上也是,以为是处理器性能增加的原因,其实还有很重要的原因是缓存增加了的原因。三级缓存对游戏体验效果比较明显。

这里推荐一下适用于各种需求的CPU

办公 上网 炒股 影音 家用 2D游戏 页游 回合游戏

建议1000-1500预算:G4560 G5400的核显机就已经足够使用了,单条内存4G,配个固态提高效率。如果加独显最高加到1050TI这样级别的显卡,玩LOL DOAT 吃鸡中档特效 及各类大型游戏也没有问题。详细看此测评,视频只看CPU占用,测评的是1030 和1050,并非1050TI,只是给大家看一下G4560这样的CPU玩吃鸡占用也没有占满

如往上升可以加到2000-3000元预算:I3 8100 I5 8400 8500酷睿的核显主机在组双通的内存的情况下可以做到高特效流畅玩LOL。因CPU的性能大幅闲余所以后期升级可以直接加一个高端独立显卡I3+1060,而I5最高建议加到2070,就能玩更高级的游戏开高特效甚至满特效。(如果确定后期要升独显,建议再组核显机的时候就把电源配高一点。)

主玩各类网游及各类单机游戏

建议3000-6000预算:I3 8100 I5 8400 8500 R5 2600(考虑价格,排名为推荐先后),独显选1050TI或1060 6G或同级别A卡。如果对大型游戏特效画质要求较高,显卡可以升到1070TI 或者2070 或者更高,预算在6000以上。

PS AE PR AI或者工程分析软件,建模等需要大量数据运算的工作需求

建议6000-8000预算:R5 2600__ I5 8600K I5 9600K I5 8500 I7 9700K(考虑价格,排名为推荐先后),如若对游戏需求不大 顶多配个1050TI,充一下4G显存,内存16G起,提高你的工作效率。该级别处理器也可用于普通直播及LOL直播。预算充足可往上升R7 2700__ I7 8700K I9 9900K等。

如主要工作是做视频,广告,影视,需频繁长时间渲染高质量长视频,大型模型应力分析软件,大型网游及单机游戏直播。

建议1W-1.5W预算 R7 2700__ I7 8700K I7 8700 I9 9900K(考虑价格,排名为推荐先后)。

若预算充足还可以2W以上预算 升AMD Ryzen ThreadRipper系列或者intel 酷睿I9 __系列甚至双路,因为分析软件的计算需求是没有上线的。

以上为本人收集知识编写推荐,若有不严谨的地方还请各位多多包涵并提出改正。感谢各位观看,有不一样想法的朋友也欢迎留言提出,文明交流。

电脑硬件入门——基础之CPU架构解读

1、9900K整体架构

还是先看图[1]:

9900K整体架构图

9900K大概可以分为5个部分:

CPU核心:图中红框部分为一个核心,9900K一共有8个核心。早期的CPU其实就只有这么一个东西,但现在的CPU逐步发展,把一些周边的部件也集成在同一块半导体晶片上,因此传统的CPU就变成了现代CPU上的核心。此外,为了提高CPU的计算能力,单块CPU中的核心数量越来越多,就消费级市场来说,从2005第一款双核心CPU奔腾D发布到今天的单块CPU晶片有8个核心的i9-9900K。

三级缓存(Level 3 Cache,简写为L3、L3$、L3C、L3 Cache):图中中间8个粉色块组成的三级缓存,用于临时存放内存中的一小部分数据。这里分成8小块,对应8个CPU核心。有时候L3也叫末级缓存(Last Level Cache,LLC),当然,对9900K这样具有三级缓存的CPU,L3才等同于LLC。有的老式CPU有的只有二级缓存,LLC就是L2;某些服务器使用的CPU有四级缓存,LLC则是指L4。

核心显卡:图中左边紫框部分,这个以后的文章中我们再介绍。

系统代理:图中右边绿色部分,这是负责连接CPU与其它部件的多个模块的集合。从上到下分别是:

显示控制器:负责核心显卡输出;

PCI-e控制器:负责CPU与外部IO设备连接,以后的文章我们会另外介绍;

eDRAM控制器:这个其实9900K是没有的,某些定制型号会集成有特殊的内存,称为嵌入式动态随机访问存储(Embedded Dynamic Random-Access Memory, eDRAM)。一般来说eDRAM是作为核心显卡的专用显存使用,这个控制器就是负责从eDRAM读写数据的。

内存控制器:负责CPU与内存连接,从内存中读写数据。

环形总线(RingBus):把上面这些模块连接起来的,上图中标记着Ring的蓝色圈。

2、核心架构图

这张图看起来很复杂是不是?不用担心,我们一个一个说。当然,我们这是入门知识,不会介绍的太细。

我们上一篇文章提到,现代CPU都是改进型哈弗架构;并且举了一个会计做财务报告的例子。这里我们继续使用这个例子来介绍。但之前,我们稍微改一下做财务报告的方式,不是一个人全部做完,我们是一个团队。有的同事根据制作指南列计算步骤,有的同事根据计算步骤在小纸条上列公式,有的同事负责从账本上把数据抄到写好公式的小纸条上,有的同事对着小纸条用计算器算数并且算完了写回小纸条上,有的同事把小纸条上的数抄到最终的财务报表上。CPU里面,小纸条有一个专门的名称,叫寄存器(Register)。

2.1 缓存子系统(Memory Subsystem)

一家规模比较大点的企业,完整的账本很厚。我们做整年的财务报告,通常只需要每个科目的汇总数就可以了,为了方便,我们把每个科目汇总的那几页复印出来放在一起。

完整的财务报告制作指南也很厚,但一个企业可能只有其中很少一部业务。例如一家软件公司,就不涉及原材料进货、仓库存储之类的业务;很多公司也没有贷款、投资之类的业务。所以我们也只把跟公司有相关业务的部分复印出来。

同样的,内存中的数据很多,CPU只需要把计算用到的指令、数据放到缓存中——也就是图中的紫色块的缓存子系统。

2.2 前端(Front End)

CPU的前端其实就是我们上篇文章中的控制单元,负责对指令进行预处理。指令预处理大体上分为取指、预解码、融合、解码、分支预测、重排等操作。

取指(Fetch)

我们制作财务报表,第一步就是把制作指南拿出来。CPU也一样,先把指令载入进来。

预解码(PreDecode)

制作指南是一整页的,我们要分解出第一步算哪个数据,第二步又是算哪个数据,在小纸条上把公式列出来,一张小纸条一个公式。CPU也一样,要把程序中一整批的指令数据,拆分出来第一条是什么指令,第二条是什么指令;可能还需要对指令进行分类标志。预解码后的指令放在指令队列(Instruction Queue)里面。

解码(Decode),又称为译码

小纸条上的公式写着:利润=收入-支出,查帐本的同事就需要先把收入和支出数据从账本中找出来,抄到小纸条上。同样的,CPU碰到类似把内存中两个数加起来这样的指令,需要分解成:

从内存载入第一个数字;

从内存载入第二个数字;

两个数字相加

这样三个指令。一般来说,我们把原始的指令称为宏操作(Macro-Operations),分解后的指令称为微操作(Micro-Operations, μops)。

指令融合(Micro-Fusion/Macro-Fusion)

假设指南中有一个数据是算平均数的,某个按计算器的同事手上整好有一个可以直接算平均数的统计用计算器。那么,当我们在指南中看到一条类似

这样的公式的时候,我们可以直接列算这几个数的平均数公式,注明给这位同事算。CPU也一样,某些指令是可以融合起来执行的,例如:

比较A和B的大小;

如果A不等于B,跳转到标志__的指令。

可以用一条指令JNE A,B,__来代替,这样的处理称之为指令融合。指令解码前的宏操作融合,称为Macro-Fusion,解码后的微操作融合,称为Micro-Fusion。

分支预测(Branch Prediction)

理论上,制作指南中列出的所有步骤,我们都要完成上面的这些处理。但假设制作指南中说,盈利的话要算某几个数据,亏损的话这几个数不用算,要另外算其它几个数据。当我们计算过第一季度的数据知道企业第一季度是盈利的,我们算第二季度的数据时,想偷懒就直接跳过亏损要算的那几个数据的处理了。CPU处理指令也是一样的,负责预测的模块叫分支预测器(Branch Predictor)

当然,如果算下来我们发现第二季度亏损了,还是要重新处理指南上的这些计算步骤。CPU也一样。

指令重排,或者叫乱序执行(Out-Of-Order,OOO),或者动态执行(Dynamic E__ecution)

事实上,我们不一定要完全按照指南上的步骤第一步算什么,第二步算什么这样算。只要公式列出来,数据抄出来了,就可以直接交给按计算器的同事去算。所以可能第一步要用的数据不太好找,按计算器的同事就先把第二步算出来了。

当然,这里有一个前提,就是算第二步的时候,不需要用到第一步的计算结果。

2.3 执行单元(E__ecution Engine)

执行单元也就是上一篇文章提到的运算单元了。也就是我们这个团队里抄数据、按计算器的各位同事了。其中,按计算器的同事中,有的用的计算器简单点,只能做四则计算,还只能算整数;有的用高级点的计算器,可以算小数;有的用统计专用的计算器;有的用更高级的可以算很多函数的计算器。当然,有这么多不同的计算器,什么样的小纸条给哪位同事用,我们也需要有一个人来做分配小纸条这件事情。

数据存取单元(Load Data/Store Data)

CPU里面也一样,有负责从缓存子系统中载入数据的Load Data单元;有把计算结果写回去缓存子系统的Store Data单元。

计算单元

CPU里面负责具体计算的,根据计算类型、计算的数据不同,有多种计算单元:

整数算术逻辑单元(Integer Arithmetic Logic Unit,Int ALU),算整数加减法/二进制运算;需要说明一下的,电脑里面很多小数计算也是通过移位操作处理后,用整数单元计算后再数小数位这样的方式来处理的。

整数乘法器(Integer Multiplier,Int MUL),专门负责整数乘法的;

整数除法器(Integer Divider,Int DIV),专门负责整数除法的;

分支处理(Branch),负责各种跳转指令的;

地址生成器(Address Generation Unit,AGU),这个稍微解释一下,例如制作指南中说,总收入要和上一年度的总收入对比算增长率,那么就需要翻译成“现在做2018年的年报,上一年度就是2017年度总收入”。CPU也是一样,有的指令是把内存地址A1的数和A1后面第五个地址的数相加,那么要先算出来A1后面五个地址A2到底是哪个地址。

整数向量ALU(Int Vect ALU),向量是指类似空间坐标+值(__,y,z, value)这样的一组数据,其中__、y、z和value都是整数。类似整数,除了算加减法/二进制的整数向量ALU,还有整数向量乘法器、除法器(Int Vect MUL,Int Vect DIV)。

浮点向量加乘融合单元(Fused multiply–add,FP FMA),这个也要解释一下。我们知道,105可以写成

这样的形式,这种形式在计算机中称为浮点数。上面提到向量中,如果(__,y,z,value)中的一个或者多个都是浮点,就是浮点向量。而加乘融合,是指

这样的计算,当然,可以算加乘融合的,自然也可以用来算加减法和乘法:A=0就是乘法,C=1就是加减法。

浮点除法单元(FP DIV):算浮点除法的,也可以算一些常用函数例如开方、对数等。

其它:例如加密用的AES,字符串处理的Vect String,位查找的bit Scan(对一个二进制数据按照多种方法数0)

调度器(Scheduler)

有这么多不同的计算单元,CPU需要一个把不同的计算指令分配给对应计算单元的调度器。

不过呢,我们这个财务部比较特殊,分了几个小办公室,某几个同事在一个办公室里面,另外几个同事又在另一个办公室里面,而每次我们只能传一张小纸条到一个办公室。

在9900K里面,从图中可以看到,不同的计算单元在不同的端口(Port)下,就是类似的情况。

寄存器文件(Register File)

计算财务数据的时候,很多数据的计算是需要多步计算的,具体到每一步的计算,可能要分给不同的同事来算。如果每一步列一张小纸条,等某位同事算完第一个数,再抄到第二张小纸条给另外一位同事,这显然很慢很麻烦——直接列在一张小纸条上就好了嘛。

另外,我们有这么多同事,分配小纸条的同事每次传小纸条可以一次分配好多张——当然,前提是分给不同的同事。

因为可能一张纸条要算好几次,又有这么多纸条传来传去,因此为了不出错,我们需要标明这张小纸条给谁算,算完了,负责分配小纸条的同事根据下一步要算的,把标注的名字改一下给另外一位同事去算。

CPU中的寄存器也一样,一个数据可能需要不同的计算单元多次处理,又有那么多的计算单元分成了好几组。所以我们需要多个寄存器,这些寄存器的组合称之为寄存器文件。每个计算单元只能处理特定名称的寄存器里面的数据,因此调度器经常需要对寄存器进行分配、重命名、退出等操作


CPU基础知识拓展相关文章:

【电脑小知识知多少】:CPU四核和两核的区别在于哪里呢?

电脑知识大全菜鸟必备

电脑入门基本知识大全

电脑入门基本知识有哪些

电脑入门操作大全

cpu酷睿i5是多少核的

小学三年级语文课外知识竞赛拓展题

邯郸学步知识拓展

惠普战66二代AMD版评测!

速读训练方法有哪些


CPU基础知识拓展相关文章:

【电脑小知识知多少】:CPU四核和两核的区别在于哪里呢?

电脑知识大全菜鸟必备

电脑入门基本知识大全

电脑入门基本知识有哪些

电脑入门操作大全

cpu酷睿i5是多少核的

小学三年级语文课外知识竞赛拓展题

邯郸学步知识拓展

惠普战66二代AMD版评测!

速读训练方法有哪些

737014