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