CPU基礎(chǔ)知識(shí)拓展
CPU 的全稱是 Central Processing Unit,它是你的電腦中最硬核的組件,這種說法一點(diǎn)不為過。CPU 是能夠讓你的計(jì)算機(jī)叫計(jì)算機(jī)的核心組件,但是它卻不能代表你的電腦,CPU 與計(jì)算機(jī)的關(guān)系就相當(dāng)于大腦和人的關(guān)系。下面就讓小編帶你去看看CPU基礎(chǔ)知識(shí)拓展,希望能幫助到大家!
程序優(yōu)化:CPU緩存基礎(chǔ)知識(shí)
CPU緩存
CPU緩存(CPU Cache)的目的是為了提高訪問內(nèi)存(RAM)的效率,這雖然已經(jīng)涉及到硬件的領(lǐng)域,但它仍然與我們息息相關(guān),了解了它的一些原理,能讓我們寫出更高效的程序,另外在多線程程序中,一些不可思議的問題也與緩存有關(guān)。
現(xiàn)代多核處理器,一個(gè)CPU由多個(gè)核組成,每個(gè)核又可以有多個(gè)硬件線程,比如我們說4核8線程,就是指有4個(gè)核,每個(gè)核2個(gè)線程,這在OS看來就像8個(gè)并行處理器一樣。
CPU緩存有多級(jí)緩存,比如L1, L2, L3等:
L1容量最小,速度最快,每個(gè)核都有L1緩存,L1又專門針對(duì)指令和數(shù)據(jù)分成L1d(數(shù)據(jù)緩存),L1i(指令緩存)。
L2容量比L1大,速度比L1慢,每個(gè)核都有L2緩存。
L3容量最大,速度最慢,多個(gè)核共享一個(gè)L3緩存。
有些CPU可能還有L4緩存,不過不常見;此外還有其他類型的緩存,比如TLB(translation lookaside buffer),用于物理地址和虛擬地址轉(zhuǎn)譯,這不是我們關(guān)心的緩存。
下圖展示了緩存和CPU的關(guān)系:
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級(jí)緩存,L4都為0。
L1的數(shù)據(jù)緩存和指令緩存分別是32KB;L2為256KB;L3為30MB。
在緩存和主存之間,數(shù)據(jù)是按固定大小的塊傳輸?shù)?該塊稱為緩存行(cache line),這里顯示每行的大小為64Bytes。
ASSOC表示主存地址映射到緩存的策略,這里L(fēng)1,L2是8路組相聯(lián),L3是20路組相聯(lián),等一會(huì)兒再說是什么意思。
緩存結(jié)構(gòu)
一塊CPU緩存可以看成是一個(gè)數(shù)組,數(shù)組元素是緩存項(xiàng)(cache entry),一個(gè)緩存項(xiàng)的內(nèi)容大概是這樣的:
+-------------------------------------------+
| tag | data block(cache line) | flag |
+-------------------------------------------+
data block就是從內(nèi)存中拷貝過來的數(shù)據(jù),也就是我們說的cache line,從上面信息可知大小是64字節(jié)。
tag 保存了內(nèi)存地址的一部分,是用來驗(yàn)證是否緩存命中的。
flag 是一些標(biāo)志位,比如緩存是否失效,寫dirty等等。
實(shí)際上LEVEL1_ICACHE_SIZE這個(gè)數(shù)據(jù),是用data block來算的,并不包括tag和flag占用的大小,比如64 __ 512 = 32768,表示LEVEL1_ICACHE_SIZE可以緩存512個(gè)cache line。
緩存首先要解決的問題是:怎么映射內(nèi)存地址和緩存地址?比如CPU要檢查一個(gè)內(nèi)存值是否已經(jīng)緩存,那么它首先要能算出這個(gè)內(nèi)存地址對(duì)應(yīng)的緩存地址,然后才能檢查。
為了解決這個(gè)問題,緩存將內(nèi)存地址分成下面幾個(gè)部分:
+-------------------------------------------+
| tag | inde__ | offset |
+-------------------------------------------+
tag和緩存項(xiàng)中的tag對(duì)應(yīng),用來驗(yàn)證是否緩存命中的。
inde__ 緩存項(xiàng)數(shù)組中的索引。
offset 緩存塊(cache line)中的偏移,因?yàn)榫彺鎵K是64字節(jié),而內(nèi)存值可能只有4個(gè)字節(jié),一個(gè)緩存塊可以保存多個(gè)連續(xù)的內(nèi)存值。這個(gè)offset實(shí)際上就是指明內(nèi)存值在cache line中的位置。
直接映射緩存
現(xiàn)在我們舉一個(gè)具體的例子,說明內(nèi)存和緩存是如何映射的:
假如緩存的大小是32768B(32KB),緩存塊大小是64B,那么緩存項(xiàng)數(shù)組就有? 32768?/64=512 個(gè)。
CPU要訪問一個(gè)內(nèi)存地址0__1CAABBDD?,它首先檢查這個(gè)內(nèi)存地址是否在緩存中,檢查過程是這樣的:
內(nèi)存地址的二進(jìn)制形式是(低位在前面):
| 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
先計(jì)算內(nèi)存在cache line中的偏移,因?yàn)榫彺鎵K是64字節(jié),那么offset需要占6位(2^6=64),即offset=011101=29。
接著要計(jì)算緩存項(xiàng)的索引,因?yàn)榫彺骓?xiàng)數(shù)組是512個(gè),所以inde__需要占9位(2^9=512),即inde__=011101111=239。
現(xiàn)在我們通過offset和inde__已經(jīng)找到緩存塊的具體位置了,但是因?yàn)閮?nèi)存要遠(yuǎn)比緩存大很多,所以多個(gè)內(nèi)存塊是可以映射到同一個(gè)位置的,怎么判斷這個(gè)緩存塊位置存的就是這個(gè)內(nèi)存的值呢?答案就是tag:內(nèi)存地址去掉inde__和offset的部分,剩下的就是tag=00011100101010101=0__3955。
通過inde__找到緩存項(xiàng),比較緩存項(xiàng)中的tag是否與內(nèi)存地址中的tag相同,如果相同表示命中,就直接取緩存塊中的值;如果不同表示未命中,CPU需要將內(nèi)存值拷貝到緩存(替換掉老的)。
這種映射方式就稱為直接映射(Direct mapped),它的缺點(diǎn)就是多個(gè)內(nèi)存地址會(huì)映射到同一個(gè)緩存地址,拿上面的內(nèi)存地址來看,只要offset和inde__相同的內(nèi)存地址,就一定會(huì)映射到同一個(gè)地方,比如:
00011100101010100 011101111 011101
00011100101010110 011101111 011101
00011100101010111 011101111 011101
如果同時(shí)訪問上面3個(gè)地址,就會(huì)一直替換緩存的值,也就是一直出現(xiàn)緩存沖突,這可能比沒有緩存還要慢,因?yàn)槌嗽L問內(nèi)存外,還多一個(gè)拷貝內(nèi)存值到緩存的操作。
N路組相聯(lián)
為了解決上面的問題,我試著把緩存項(xiàng)數(shù)組分成2個(gè)數(shù)組(2路),比如分成2個(gè)256的數(shù)組,如下圖所示:
查找過程和上面其實(shí)一樣的:
先通過inde__找到數(shù)組索引,只不過因?yàn)槭?路,所以存在2個(gè)數(shù)組。
然后通過內(nèi)存tag依次比較2個(gè)緩存頂?shù)膖ag,如果其中一個(gè)tag相等,說明這個(gè)數(shù)組緩存命中;如果兩個(gè)都不相等,說明緩存不命中,CPU會(huì)拷貝內(nèi)存值到緩存中,但是現(xiàn)在有2個(gè)位置,要拷貝進(jìn)哪個(gè)呢?我的理解CPU應(yīng)該是隨機(jī)選1路拷貝。
offset這個(gè)其實(shí)無關(guān)緊要,因?yàn)樗莄ache line中的偏移。
那這個(gè)和直接映射相比,好在哪里呢,因?yàn)橐粋€(gè)內(nèi)存值會(huì)隨機(jī)拷貝到2路中的1個(gè),所以緩存沖突(多個(gè)內(nèi)存地址映射到同一個(gè)緩存地址)的概率會(huì)降低一半;如果把緩存項(xiàng)數(shù)組分成4個(gè)數(shù)組,這就是4路組相聯(lián)。
上面LEVEL1_ICACHE_ASSOC的值等于8,表明是8路組相聯(lián)。分組越多,緩存沖突率越低,但是CPU要遍歷的數(shù)組就越多,這是一個(gè)權(quán)衡的問題。
通過觀察也可以發(fā)現(xiàn),其實(shí)直接映射就是1路組相聯(lián)。如果直接分成512個(gè)數(shù)組,那每個(gè)數(shù)組只有1項(xiàng),這種就是全相聯(lián),CPU直接遍歷512個(gè)數(shù)組,判斷內(nèi)存地址在哪1個(gè)。
緩存分配策略和更新策略:
當(dāng)CPU從內(nèi)存讀數(shù)據(jù)時(shí),如果該數(shù)據(jù)沒有在緩存中(cache miss),CPU會(huì)把數(shù)據(jù)拷貝到緩存。
當(dāng)CPU往內(nèi)存寫數(shù)據(jù)時(shí):
如果緩存缺失,CPU會(huì)先從內(nèi)存拷貝數(shù)據(jù)到緩存,然后再更新緩存的數(shù)據(jù)。
CPU更新緩存數(shù)據(jù),也可能有多個(gè)策略:
直接寫(write through):更新緩存的數(shù)據(jù),同時(shí)更新內(nèi)存的數(shù)據(jù)。
寫回(write back):只更新緩存的數(shù)據(jù),同時(shí)在緩存項(xiàng)設(shè)置一個(gè)drity標(biāo)志位,內(nèi)存的數(shù)據(jù)只會(huì)在某個(gè)時(shí)刻更新(比如替換cache line時(shí))。
從上面描述我們知道,當(dāng)我們向一個(gè)內(nèi)存寫數(shù)據(jù)時(shí),內(nèi)存中的數(shù)據(jù)可能不馬上被更新,這個(gè)新數(shù)據(jù)可能還在cache line呆著。因?yàn)槊總€(gè)核都有自己的緩存,如果CPU不做處理,可以想象一定會(huì)出問題的:比如核1改了數(shù)據(jù),核2去讀同一個(gè)數(shù)據(jù),此時(shí)數(shù)據(jù)還在核1的緩存中,核2讀到的就是老的數(shù)據(jù)。CPU為了處理多核間的緩存同步,那是相當(dāng)?shù)膹?fù)雜。
《裝機(jī)小知識(shí)-CPU篇》
首先給大家講一下,本次內(nèi)容主要給大家普及一下購(gòu)機(jī)DIY知識(shí),不做深層講述(講了小白也不懂),只求做到簡(jiǎn)單化明了化,給您一個(gè)明確的DIY購(gòu)機(jī)思路,選擇適合你自己的一臺(tái)電腦,而不是3000進(jìn)吧1萬帶回家用幾年卻只發(fā)揮了2000的性能。
CPU最重要的幾個(gè)參數(shù),制程,架構(gòu),主頻,核心,緩存。以及支持幾代的內(nèi)存和是否有核心顯卡。支持的內(nèi)存肯定是越新越好,內(nèi)存方面的我們?cè)趦?nèi)存一欄詳細(xì)講訴
核心顯卡這里簡(jiǎn)單先講了,目前intel目前最高級(jí)別的核心顯卡UHD630,水平在獨(dú)立顯卡GT730 的檔次(略高一點(diǎn))。日常辦公,平面設(shè)計(jì),家庭影音,都沒有問題,DNF,夢(mèng)幻西游,LOL 以及各種網(wǎng)頁游戲都能玩。核心顯卡在你使用兩條內(nèi)存組雙通的情況下性能會(huì)有較大提升,所以你想節(jié)約預(yù)算又只玩小型游戲比如LOL 就可以考慮組個(gè)雙通內(nèi)存就可以了,可以做到高特效流暢。 具體表現(xiàn)可以 點(diǎn)擊此處 觀看測(cè)試視頻(AMD最新一代核顯強(qiáng)于intel核顯)
接下來我們就講CPU最主要的核心參數(shù)。
制程:制程越小代表著同一大小芯片上可以做更多晶體管,提高性能降低功耗(功耗越高耗電越多發(fā)熱量越大,CPU溫度上升性能壽命會(huì)下降,所以功耗很重要),制程越小每個(gè)芯片可以有更多的流水線或者是更多的核心。從第六代酷睿開始 intel就一直使用14nm制程工藝,包括最新的9代酷睿,也是14nm的,而AMD二代銳龍是12nm制程工藝,另外可能大家也看到過華為麒麟980宣傳的7nm以及臺(tái)積電公布的突破5nm量產(chǎn)工藝。為什么intel就一直不更新制程工藝,實(shí)際上個(gè)人覺得主要有兩個(gè)方面。
1:intel是自建生產(chǎn)線,只生產(chǎn)自己家產(chǎn)品,如果換制程那么生產(chǎn)線基本要重建,然而14nm的生產(chǎn)線才剛建沒幾年,實(shí)在沒想到芯片制程工藝突破如此迅速。因?yàn)榕_(tái)積電是代工生產(chǎn)芯片,所以他的核心競(jìng)爭(zhēng)力就是要更高端精密的制程工藝,才有更多廠家找他代工。
2:intel得益于自身架構(gòu)的優(yōu)化以及芯片的穩(wěn)定性,即便是14nm制程的芯片功耗也不高。尤其是用在臺(tái)式機(jī)上,中低端主流的i3 i5 一般散熱器都能壓住,至于高端超頻系列的CPU,好一點(diǎn)的散熱器也沒有問題。在2017年以前intel在PC芯片都是出于壟斷地位,可能覺得自己不需要這么著急突破,擠擠牙膏就算更新迭代了,所以更新制程帶來的低功耗,高性能在當(dāng)時(shí)的intel看來不是那么急切需要提高,殊不知自己的不思進(jìn)取給了AMD很多的時(shí)間來打一個(gè)翻身仗。。。又或者intel早已開發(fā)7nm級(jí)別的PC芯片,只是藏大招沒拿出來而已。不過就這次AMD搶走一半市場(chǎng)以后intel的9代處理器還是14nm,還是加核心的手段看起來又不像有大招。哎 神仙打架我們關(guān)切個(gè)什么呢。總之現(xiàn)在,電腦處理器14nm沒有任何問題,不必拿制程說事。
PS:相比PC處理器,手機(jī)處理器就需要更小的制程來達(dá)到高度集成的效果,降低功耗提升性能,增加續(xù)航。所以目前最新制程的處理器都是用在了手機(jī)上面。
架構(gòu):架構(gòu)這個(gè)屬于研發(fā),很復(fù)雜,而且對(duì)裝機(jī)沒有太多的幫助,因?yàn)樾碌腃PU架構(gòu)都是進(jìn)一步優(yōu)化,且產(chǎn)品統(tǒng)一采用的都是新架構(gòu),通常都會(huì)比原架構(gòu)更優(yōu)秀,值得一提的就是intel與AMD 雖然都是基于__86指令集研發(fā)的架構(gòu),但是intel比AMD更穩(wěn)定的原因主要就在于架構(gòu)上的優(yōu)勢(shì)(僅限目前,且差距一直在縮小)架構(gòu)其實(shí)是處理器性能非常重要的指標(biāo),只是統(tǒng)一性很高,對(duì)比又很少所以電腦普通用戶沒有必要深究。
主頻(不是越高越好):主頻是直接表現(xiàn)CPU性能的參數(shù)之一,但是以目前的工藝水平,主頻不會(huì)有更大突破,上線基本會(huì)在4G-5GHz,Intel/AMD兩大CPU廠商均將提升性能的手段放在多核心上。主要還是因?yàn)镃PU頻率越高,功耗及發(fā)熱就會(huì)越高,散熱就會(huì)是個(gè)問題,溫度過高壽命及穩(wěn)定性和性能都會(huì)大打折扣。頻率更能反映單核的性能,目前仍然有很多軟件是只支持單線程工作的,所以對(duì)于這類用戶對(duì)頻率的選擇比重更大,比如現(xiàn)在銷量很高的I5 8400主頻只有2.8Ghz,如果讓它工作只支持單線程的軟件,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),只有1個(gè)核心占用,剩下的5個(gè)核心占用為0。效果可能還不如i3 8100的3.6Ghz。
有部分機(jī)友對(duì)于我這個(gè)論斷不滿意,覺得貶低了8400(其實(shí)下文也有為8400正名),這里我主要想表達(dá)的是頻率與單核的關(guān)系,當(dāng)然我自己也忽略了一個(gè)問題就是I3 8100沒有睿頻,所以部分機(jī)友就拿8400的睿頻來說體驗(yàn)效果是高于8100的,但是兄弟們,你們抓錯(cuò)方向了。
i5 8400 基礎(chǔ)2.8G 睿頻 1核4G 2核3.9G 3核3.9G 4核3.9G 5核3.8G 6核3.8G
這是理論最高值,條件滿足能夠達(dá)到,也的確是比I3 8100強(qiáng),兩款CPU本來也不是一個(gè)檔次的,但是注意用詞,我說的是可能不如I3 8100,因?yàn)轭nl不可控,板載平臺(tái),供電,散熱,CPU體質(zhì),實(shí)際載荷等等很多都影響著睿頻,也有很多人的8400就是到不了3.8 ,只有3.2-3.3,你讓他換個(gè)主板還是換個(gè)電源,而且睿頻需要高負(fù)載情況下才有,那非高負(fù)載的程序呢?這樣寫的本質(zhì)是在講述頻率與單核,基礎(chǔ)頻率一樣很重要。請(qǐng)不要忽視。
但是i5 8400是六核六線程的多核處理器,解決支持多核多線程的軟件即便主頻較低,將處理任務(wù)分?jǐn)偨o多個(gè)核心來工作,那么單核就不需要那么高的性能也能游刃有余的完成任務(wù)。就好比一個(gè)人1秒能算10次,2個(gè)人每人1秒能算7次,對(duì)于支持多線程軟件來說,同樣給你1s 我兩個(gè)人可以算14次,而你還是只能10次。如果是只支持單線程的軟件的話,來來來,算10次那個(gè)人,給你發(fā)朵小紅花。。
不過雖然8400主頻是2.8GHz但畢竟i5,單核性能也不會(huì)很差,i5 8400總性高出i3 8100 40%左右。往后發(fā)展游戲多核將更為普遍,各類大型軟件基本也會(huì)往支持多線程開發(fā)。購(gòu)機(jī)前請(qǐng)先了解自己常用的軟件是否對(duì)單核性能有較高的要求比如PS。如果是小型軟件這些即便只支持單核也可以忽略掉,現(xiàn)在的CPU處理起來都沒有問題。如果你有錢也很任性,選I7 8700K或者I9 9900K 超到5G大小通吃也是可以的。
關(guān)于頻率選擇,常見的以下幾種,普通用戶就看主頻和睿頻即可。
主頻:CPU工作默認(rèn)頻率。
睿頻:CPU高負(fù)載運(yùn)行下,智能調(diào)節(jié)頻率高于基礎(chǔ)頻率,達(dá)到提高CPU性能的目的(智能可控)
超頻:玩家自己通過主板BIOS設(shè)定CPU頻率和電壓高于基礎(chǔ)頻率或者睿頻頻率,達(dá)到提高CPU性能的目的(超頻有風(fēng)險(xiǎn),燒毀無質(zhì)保,一般超頻到5GHz,好一點(diǎn)的水冷能壓住。極度超頻實(shí)用性不大,降溫成本太高,不少?gòu)S商展示的時(shí)候用的都是液氮降溫,只有部分CPU支持超頻比如intel酷睿尾綴代K和AMD銳龍尾綴帶__的。)
核心/線程(不是越多越好):上面講主頻的時(shí)候其實(shí)就已經(jīng)講到核心,總的來說核心要參考單核性能和多核性能,多核雖好,但不一定適合你,還要根據(jù)使用需求,平時(shí)就上網(wǎng) 看電影 用辦公軟件啥的買個(gè)I7 8700K也沒什么用,體驗(yàn)基本和i3 8100一樣。如果你喜歡玩大型游戲或者工作上用PS AE PR 分析軟件之類的,多核對(duì)你來說就很重要了。 核心越多同一時(shí)間數(shù)據(jù)處理能力越強(qiáng)。
超線程:比如8核16線程的I9 9900K相較于8核I7 9700K,前者為擁有超線程技術(shù)的CPU。I7 9700K處理任務(wù)時(shí),共8核心,一個(gè)核心一條線程,如果任務(wù)沒有占滿核心性能,那么這個(gè)核心剩余性能就閑置了,如果又來一個(gè)任務(wù)就只能用第二顆核心或者等任務(wù)處理完了再進(jìn)行下一個(gè)任務(wù)。I9 9900K處理任務(wù)時(shí),一個(gè)核心兩條線程,如果任務(wù)沒有占滿核心性能,又來一個(gè)任務(wù),那么就會(huì)用該核心的剩余性能進(jìn)行處理,而不是用第二顆核心來處理,達(dá)到同時(shí)處理更多任務(wù)的目的,提高效率。
超線程是利用特殊的硬件指令一核模擬雙核運(yùn)行,但還是不如雙核來的實(shí)際有用,核心數(shù)量才是性能標(biāo)桿,超線程僅提高了CPU核心的使用效率,不能直接提升核心性能,也就是說如果數(shù)據(jù)計(jì)算已經(jīng)吃滿所有核心那么超不超線程都沒有實(shí)際意義。超線程CPU用在僅支持單線程的程序上可能還達(dá)不到不帶超線程功能的CPU性能,但性能差距也不會(huì)太大。超線程會(huì)大幅提高跑分?jǐn)?shù)據(jù)(跑分沒什么卵用)。
低端的超線程U比如G4560 G5400很好用,效果提升顯著,因?yàn)楹诵纳?,超線程的話恰好能滿足日常需求,因?yàn)楝F(xiàn)在電腦操作越來越快,同時(shí)下達(dá)的任務(wù)可能會(huì)好幾個(gè)(比如看直播的同時(shí)下載電影然后又在掛游戲,微信,QQ在視頻語音什么的)。以前低端的雙核的CPU現(xiàn)在已經(jīng)不適用了不能同時(shí)處理這么多任務(wù),所以在G4560把超線程用上過后,直接解決了這個(gè)問題,性能及體驗(yàn)直逼i3 7100價(jià)格卻只有其一半,被大家奉為神U。高端的CPU從酷睿八代或者銳龍1代開始核心就已經(jīng)增多,正常使用情況下6核基本已經(jīng)足夠了,超不超線程的體驗(yàn)差距已經(jīng)不大,高端超線程U比如I7 8700K 9900K在程序游戲多開的情況下效果比較好(這里多開是指同時(shí)開幾個(gè)大型游戲或者幾十個(gè)小型游戲或手游掛機(jī)這種),或者數(shù)據(jù)建模,大型工程分析關(guān)鍵,視頻渲染也是比較占優(yōu)勢(shì)的。
目前大多主流游戲做的都是雙核或者四核處理,新一點(diǎn)的游戲有的做到六核處理,如果你買電腦玩游戲,追求八核十六線程也沒有用,僅有部分核心能用到。游戲體驗(yàn)和i5沒有差別(多開除外)。
緩存(越大越好):緩存是一個(gè)很重要的參考指標(biāo),緩存分一級(jí)緩存 二級(jí)緩存 三級(jí)緩存,都集成在CPU上,容量都是越大越好,一級(jí)緩存級(jí)別最高,容量相比最小。CPU緩存相當(dāng)重要,與CPU同頻運(yùn)行,遠(yuǎn)高于內(nèi)存頻率,CPU讀取數(shù)據(jù)時(shí)一級(jí)二級(jí)三級(jí)依次讀取,待三級(jí)緩存都沒有的數(shù)據(jù)才從內(nèi)存中調(diào)取,每級(jí)緩存命中概率都在80%左右,所以要從內(nèi)存調(diào)用的數(shù)據(jù)其實(shí)是很少的,由于緩存速度遠(yuǎn)高于內(nèi)存,所以緩存越大越能在使用過程中存放更多的數(shù)據(jù),降低CPU調(diào)用數(shù)據(jù)的時(shí)間,提高執(zhí)行效率,直接反應(yīng)在使用體驗(yàn)上就是速度快。比如很多朋友升級(jí)CPU過后明顯覺得速度快了很多,用在單核小程序上也是,以為是處理器性能增加的原因,其實(shí)還有很重要的原因是緩存增加了的原因。三級(jí)緩存對(duì)游戲體驗(yàn)效果比較明顯。
這里推薦一下適用于各種需求的CPU
辦公 上網(wǎng) 炒股 影音 家用 2D游戲 頁游 回合游戲
建議1000-1500預(yù)算:G4560 G5400的核顯機(jī)就已經(jīng)足夠使用了,單條內(nèi)存4G,配個(gè)固態(tài)提高效率。如果加獨(dú)顯最高加到1050TI這樣級(jí)別的顯卡,玩LOL DOAT 吃雞中檔特效 及各類大型游戲也沒有問題。詳細(xì)看此測(cè)評(píng),視頻只看CPU占用,測(cè)評(píng)的是1030 和1050,并非1050TI,只是給大家看一下G4560這樣的CPU玩吃雞占用也沒有占滿
如往上升可以加到2000-3000元預(yù)算:I3 8100 I5 8400 8500酷睿的核顯主機(jī)在組雙通的內(nèi)存的情況下可以做到高特效流暢玩LOL。因CPU的性能大幅閑余所以后期升級(jí)可以直接加一個(gè)高端獨(dú)立顯卡I3+1060,而I5最高建議加到2070,就能玩更高級(jí)的游戲開高特效甚至滿特效。(如果確定后期要升獨(dú)顯,建議再組核顯機(jī)的時(shí)候就把電源配高一點(diǎn)。)
主玩各類網(wǎng)游及各類單機(jī)游戲
建議3000-6000預(yù)算:I3 8100 I5 8400 8500 R5 2600(考慮價(jià)格,排名為推薦先后),獨(dú)顯選1050TI或1060 6G或同級(jí)別A卡。如果對(duì)大型游戲特效畫質(zhì)要求較高,顯卡可以升到1070TI 或者2070 或者更高,預(yù)算在6000以上。
PS AE PR AI或者工程分析軟件,建模等需要大量數(shù)據(jù)運(yùn)算的工作需求
建議6000-8000預(yù)算:R5 2600__ I5 8600K I5 9600K I5 8500 I7 9700K(考慮價(jià)格,排名為推薦先后),如若對(duì)游戲需求不大 頂多配個(gè)1050TI,充一下4G顯存,內(nèi)存16G起,提高你的工作效率。該級(jí)別處理器也可用于普通直播及LOL直播。預(yù)算充足可往上升R7 2700__ I7 8700K I9 9900K等。
如主要工作是做視頻,廣告,影視,需頻繁長(zhǎng)時(shí)間渲染高質(zhì)量長(zhǎng)視頻,大型模型應(yīng)力分析軟件,大型網(wǎng)游及單機(jī)游戲直播。
建議1W-1.5W預(yù)算 R7 2700__ I7 8700K I7 8700 I9 9900K(考慮價(jià)格,排名為推薦先后)。
若預(yù)算充足還可以2W以上預(yù)算 升AMD Ryzen ThreadRipper系列或者intel 酷睿I9 __系列甚至雙路,因?yàn)榉治鲕浖挠?jì)算需求是沒有上線的。
以上為本人收集知識(shí)編寫推薦,若有不嚴(yán)謹(jǐn)?shù)牡胤竭€請(qǐng)各位多多包涵并提出改正。感謝各位觀看,有不一樣想法的朋友也歡迎留言提出,文明交流。
電腦硬件入門——基礎(chǔ)之CPU架構(gòu)解讀
1、9900K整體架構(gòu)
還是先看圖[1]:
9900K整體架構(gòu)圖
9900K大概可以分為5個(gè)部分:
CPU核心:圖中紅框部分為一個(gè)核心,9900K一共有8個(gè)核心。早期的CPU其實(shí)就只有這么一個(gè)東西,但現(xiàn)在的CPU逐步發(fā)展,把一些周邊的部件也集成在同一塊半導(dǎo)體晶片上,因此傳統(tǒng)的CPU就變成了現(xiàn)代CPU上的核心。此外,為了提高CPU的計(jì)算能力,單塊CPU中的核心數(shù)量越來越多,就消費(fèi)級(jí)市場(chǎng)來說,從2005第一款雙核心CPU奔騰D發(fā)布到今天的單塊CPU晶片有8個(gè)核心的i9-9900K。
三級(jí)緩存(Level 3 Cache,簡(jiǎn)寫為L(zhǎng)3、L3$、L3C、L3 Cache):圖中中間8個(gè)粉色塊組成的三級(jí)緩存,用于臨時(shí)存放內(nèi)存中的一小部分?jǐn)?shù)據(jù)。這里分成8小塊,對(duì)應(yīng)8個(gè)CPU核心。有時(shí)候L3也叫末級(jí)緩存(Last Level Cache,LLC),當(dāng)然,對(duì)9900K這樣具有三級(jí)緩存的CPU,L3才等同于LLC。有的老式CPU有的只有二級(jí)緩存,LLC就是L2;某些服務(wù)器使用的CPU有四級(jí)緩存,LLC則是指L4。
核心顯卡:圖中左邊紫框部分,這個(gè)以后的文章中我們?cè)俳榻B。
系統(tǒng)代理:圖中右邊綠色部分,這是負(fù)責(zé)連接CPU與其它部件的多個(gè)模塊的集合。從上到下分別是:
顯示控制器:負(fù)責(zé)核心顯卡輸出;
PCI-e控制器:負(fù)責(zé)CPU與外部IO設(shè)備連接,以后的文章我們會(huì)另外介紹;
eDRAM控制器:這個(gè)其實(shí)9900K是沒有的,某些定制型號(hào)會(huì)集成有特殊的內(nèi)存,稱為嵌入式動(dòng)態(tài)隨機(jī)訪問存儲(chǔ)(Embedded Dynamic Random-Access Memory, eDRAM)。一般來說eDRAM是作為核心顯卡的專用顯存使用,這個(gè)控制器就是負(fù)責(zé)從eDRAM讀寫數(shù)據(jù)的。
內(nèi)存控制器:負(fù)責(zé)CPU與內(nèi)存連接,從內(nèi)存中讀寫數(shù)據(jù)。
環(huán)形總線(RingBus):把上面這些模塊連接起來的,上圖中標(biāo)記著Ring的藍(lán)色圈。
2、核心架構(gòu)圖
這張圖看起來很復(fù)雜是不是?不用擔(dān)心,我們一個(gè)一個(gè)說。當(dāng)然,我們這是入門知識(shí),不會(huì)介紹的太細(xì)。
我們上一篇文章提到,現(xiàn)代CPU都是改進(jìn)型哈弗架構(gòu);并且舉了一個(gè)會(huì)計(jì)做財(cái)務(wù)報(bào)告的例子。這里我們繼續(xù)使用這個(gè)例子來介紹。但之前,我們稍微改一下做財(cái)務(wù)報(bào)告的方式,不是一個(gè)人全部做完,我們是一個(gè)團(tuán)隊(duì)。有的同事根據(jù)制作指南列計(jì)算步驟,有的同事根據(jù)計(jì)算步驟在小紙條上列公式,有的同事負(fù)責(zé)從賬本上把數(shù)據(jù)抄到寫好公式的小紙條上,有的同事對(duì)著小紙條用計(jì)算器算數(shù)并且算完了寫回小紙條上,有的同事把小紙條上的數(shù)抄到最終的財(cái)務(wù)報(bào)表上。CPU里面,小紙條有一個(gè)專門的名稱,叫寄存器(Register)。
2.1 緩存子系統(tǒng)(Memory Subsystem)
一家規(guī)模比較大點(diǎn)的企業(yè),完整的賬本很厚。我們做整年的財(cái)務(wù)報(bào)告,通常只需要每個(gè)科目的匯總數(shù)就可以了,為了方便,我們把每個(gè)科目匯總的那幾頁復(fù)印出來放在一起。
完整的財(cái)務(wù)報(bào)告制作指南也很厚,但一個(gè)企業(yè)可能只有其中很少一部業(yè)務(wù)。例如一家軟件公司,就不涉及原材料進(jìn)貨、倉(cāng)庫存儲(chǔ)之類的業(yè)務(wù);很多公司也沒有貸款、投資之類的業(yè)務(wù)。所以我們也只把跟公司有相關(guān)業(yè)務(wù)的部分復(fù)印出來。
同樣的,內(nèi)存中的數(shù)據(jù)很多,CPU只需要把計(jì)算用到的指令、數(shù)據(jù)放到緩存中——也就是圖中的紫色塊的緩存子系統(tǒng)。
2.2 前端(Front End)
CPU的前端其實(shí)就是我們上篇文章中的控制單元,負(fù)責(zé)對(duì)指令進(jìn)行預(yù)處理。指令預(yù)處理大體上分為取指、預(yù)解碼、融合、解碼、分支預(yù)測(cè)、重排等操作。
取指(Fetch)
我們制作財(cái)務(wù)報(bào)表,第一步就是把制作指南拿出來。CPU也一樣,先把指令載入進(jìn)來。
預(yù)解碼(PreDecode)
制作指南是一整頁的,我們要分解出第一步算哪個(gè)數(shù)據(jù),第二步又是算哪個(gè)數(shù)據(jù),在小紙條上把公式列出來,一張小紙條一個(gè)公式。CPU也一樣,要把程序中一整批的指令數(shù)據(jù),拆分出來第一條是什么指令,第二條是什么指令;可能還需要對(duì)指令進(jìn)行分類標(biāo)志。預(yù)解碼后的指令放在指令隊(duì)列(Instruction Queue)里面。
解碼(Decode),又稱為譯碼
小紙條上的公式寫著:利潤(rùn)=收入-支出,查帳本的同事就需要先把收入和支出數(shù)據(jù)從賬本中找出來,抄到小紙條上。同樣的,CPU碰到類似把內(nèi)存中兩個(gè)數(shù)加起來這樣的指令,需要分解成:
從內(nèi)存載入第一個(gè)數(shù)字;
從內(nèi)存載入第二個(gè)數(shù)字;
兩個(gè)數(shù)字相加
這樣三個(gè)指令。一般來說,我們把原始的指令稱為宏操作(Macro-Operations),分解后的指令稱為微操作(Micro-Operations, μops)。
指令融合(Micro-Fusion/Macro-Fusion)
假設(shè)指南中有一個(gè)數(shù)據(jù)是算平均數(shù)的,某個(gè)按計(jì)算器的同事手上整好有一個(gè)可以直接算平均數(shù)的統(tǒng)計(jì)用計(jì)算器。那么,當(dāng)我們?cè)谥改现锌吹揭粭l類似
這樣的公式的時(shí)候,我們可以直接列算這幾個(gè)數(shù)的平均數(shù)公式,注明給這位同事算。CPU也一樣,某些指令是可以融合起來執(zhí)行的,例如:
比較A和B的大小;
如果A不等于B,跳轉(zhuǎn)到標(biāo)志__的指令。
可以用一條指令JNE A,B,__來代替,這樣的處理稱之為指令融合。指令解碼前的宏操作融合,稱為Macro-Fusion,解碼后的微操作融合,稱為Micro-Fusion。
分支預(yù)測(cè)(Branch Prediction)
理論上,制作指南中列出的所有步驟,我們都要完成上面的這些處理。但假設(shè)制作指南中說,盈利的話要算某幾個(gè)數(shù)據(jù),虧損的話這幾個(gè)數(shù)不用算,要另外算其它幾個(gè)數(shù)據(jù)。當(dāng)我們計(jì)算過第一季度的數(shù)據(jù)知道企業(yè)第一季度是盈利的,我們算第二季度的數(shù)據(jù)時(shí),想偷懶就直接跳過虧損要算的那幾個(gè)數(shù)據(jù)的處理了。CPU處理指令也是一樣的,負(fù)責(zé)預(yù)測(cè)的模塊叫分支預(yù)測(cè)器(Branch Predictor)
當(dāng)然,如果算下來我們發(fā)現(xiàn)第二季度虧損了,還是要重新處理指南上的這些計(jì)算步驟。CPU也一樣。
指令重排,或者叫亂序執(zhí)行(Out-Of-Order,OOO),或者動(dòng)態(tài)執(zhí)行(Dynamic E__ecution)
事實(shí)上,我們不一定要完全按照指南上的步驟第一步算什么,第二步算什么這樣算。只要公式列出來,數(shù)據(jù)抄出來了,就可以直接交給按計(jì)算器的同事去算。所以可能第一步要用的數(shù)據(jù)不太好找,按計(jì)算器的同事就先把第二步算出來了。
當(dāng)然,這里有一個(gè)前提,就是算第二步的時(shí)候,不需要用到第一步的計(jì)算結(jié)果。
2.3 執(zhí)行單元(E__ecution Engine)
執(zhí)行單元也就是上一篇文章提到的運(yùn)算單元了。也就是我們這個(gè)團(tuán)隊(duì)里抄數(shù)據(jù)、按計(jì)算器的各位同事了。其中,按計(jì)算器的同事中,有的用的計(jì)算器簡(jiǎn)單點(diǎn),只能做四則計(jì)算,還只能算整數(shù);有的用高級(jí)點(diǎn)的計(jì)算器,可以算小數(shù);有的用統(tǒng)計(jì)專用的計(jì)算器;有的用更高級(jí)的可以算很多函數(shù)的計(jì)算器。當(dāng)然,有這么多不同的計(jì)算器,什么樣的小紙條給哪位同事用,我們也需要有一個(gè)人來做分配小紙條這件事情。
數(shù)據(jù)存取單元(Load Data/Store Data)
CPU里面也一樣,有負(fù)責(zé)從緩存子系統(tǒng)中載入數(shù)據(jù)的Load Data單元;有把計(jì)算結(jié)果寫回去緩存子系統(tǒng)的Store Data單元。
計(jì)算單元
CPU里面負(fù)責(zé)具體計(jì)算的,根據(jù)計(jì)算類型、計(jì)算的數(shù)據(jù)不同,有多種計(jì)算單元:
整數(shù)算術(shù)邏輯單元(Integer Arithmetic Logic Unit,Int ALU),算整數(shù)加減法/二進(jìn)制運(yùn)算;需要說明一下的,電腦里面很多小數(shù)計(jì)算也是通過移位操作處理后,用整數(shù)單元計(jì)算后再數(shù)小數(shù)位這樣的方式來處理的。
整數(shù)乘法器(Integer Multiplier,Int MUL),專門負(fù)責(zé)整數(shù)乘法的;
整數(shù)除法器(Integer Divider,Int DIV),專門負(fù)責(zé)整數(shù)除法的;
分支處理(Branch),負(fù)責(zé)各種跳轉(zhuǎn)指令的;
地址生成器(Address Generation Unit,AGU),這個(gè)稍微解釋一下,例如制作指南中說,總收入要和上一年度的總收入對(duì)比算增長(zhǎng)率,那么就需要翻譯成“現(xiàn)在做2018年的年報(bào),上一年度就是2017年度總收入”。CPU也是一樣,有的指令是把內(nèi)存地址A1的數(shù)和A1后面第五個(gè)地址的數(shù)相加,那么要先算出來A1后面五個(gè)地址A2到底是哪個(gè)地址。
整數(shù)向量ALU(Int Vect ALU),向量是指類似空間坐標(biāo)+值(__,y,z, value)這樣的一組數(shù)據(jù),其中__、y、z和value都是整數(shù)。類似整數(shù),除了算加減法/二進(jìn)制的整數(shù)向量ALU,還有整數(shù)向量乘法器、除法器(Int Vect MUL,Int Vect DIV)。
浮點(diǎn)向量加乘融合單元(Fused multiply–add,F(xiàn)P FMA),這個(gè)也要解釋一下。我們知道,105可以寫成
這樣的形式,這種形式在計(jì)算機(jī)中稱為浮點(diǎn)數(shù)。上面提到向量中,如果(__,y,z,value)中的一個(gè)或者多個(gè)都是浮點(diǎn),就是浮點(diǎn)向量。而加乘融合,是指
這樣的計(jì)算,當(dāng)然,可以算加乘融合的,自然也可以用來算加減法和乘法:A=0就是乘法,C=1就是加減法。
浮點(diǎn)除法單元(FP DIV):算浮點(diǎn)除法的,也可以算一些常用函數(shù)例如開方、對(duì)數(shù)等。
其它:例如加密用的AES,字符串處理的Vect String,位查找的bit Scan(對(duì)一個(gè)二進(jìn)制數(shù)據(jù)按照多種方法數(shù)0)
調(diào)度器(Scheduler)
有這么多不同的計(jì)算單元,CPU需要一個(gè)把不同的計(jì)算指令分配給對(duì)應(yīng)計(jì)算單元的調(diào)度器。
不過呢,我們這個(gè)財(cái)務(wù)部比較特殊,分了幾個(gè)小辦公室,某幾個(gè)同事在一個(gè)辦公室里面,另外幾個(gè)同事又在另一個(gè)辦公室里面,而每次我們只能傳一張小紙條到一個(gè)辦公室。
在9900K里面,從圖中可以看到,不同的計(jì)算單元在不同的端口(Port)下,就是類似的情況。
寄存器文件(Register File)
計(jì)算財(cái)務(wù)數(shù)據(jù)的時(shí)候,很多數(shù)據(jù)的計(jì)算是需要多步計(jì)算的,具體到每一步的計(jì)算,可能要分給不同的同事來算。如果每一步列一張小紙條,等某位同事算完第一個(gè)數(shù),再抄到第二張小紙條給另外一位同事,這顯然很慢很麻煩——直接列在一張小紙條上就好了嘛。
另外,我們有這么多同事,分配小紙條的同事每次傳小紙條可以一次分配好多張——當(dāng)然,前提是分給不同的同事。
因?yàn)榭赡芤粡埣垪l要算好幾次,又有這么多紙條傳來傳去,因此為了不出錯(cuò),我們需要標(biāo)明這張小紙條給誰算,算完了,負(fù)責(zé)分配小紙條的同事根據(jù)下一步要算的,把標(biāo)注的名字改一下給另外一位同事去算。
CPU中的寄存器也一樣,一個(gè)數(shù)據(jù)可能需要不同的計(jì)算單元多次處理,又有那么多的計(jì)算單元分成了好幾組。所以我們需要多個(gè)寄存器,這些寄存器的組合稱之為寄存器文件。每個(gè)計(jì)算單元只能處理特定名稱的寄存器里面的數(shù)據(jù),因此調(diào)度器經(jīng)常需要對(duì)寄存器進(jìn)行分配、重命名、退出等操作
CPU基礎(chǔ)知識(shí)拓展相關(guān)文章:
★ 【電腦小知識(shí)知多少】:CPU四核和兩核的區(qū)別在于哪里呢?
★ 電腦入門操作大全
★ 小學(xué)三年級(jí)語文課外知識(shí)競(jìng)賽拓展題
★ 惠普戰(zhàn)66二代AMD版評(píng)測(cè)!
CPU基礎(chǔ)知識(shí)拓展相關(guān)文章:
★ 【電腦小知識(shí)知多少】:CPU四核和兩核的區(qū)別在于哪里呢?
★ 電腦入門操作大全
★ 小學(xué)三年級(jí)語文課外知識(shí)競(jìng)賽拓展題