日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

關(guān)于CPU科普,這篇說得最詳細(xì)

 昵稱69423985 2020-04-13

來源:半導(dǎo)體行業(yè)觀察

CPU通常被稱為計(jì)算機(jī)的大腦,就像人的大腦一樣,它由幾個(gè)部分組成,其中包括接收信息的部分,存儲(chǔ)信息的部分,處理信息的部分,幫助輸出信息的部分等等。這些部分協(xié)同工作以處理信息。

在今天的解文章中,我們將介紹構(gòu)成CPU的關(guān)鍵元素以及它們?nèi)绾喂餐瑸橛?jì)算機(jī)提供動(dòng)能。


CPU藍(lán)圖:ISA

分析任何CPU時(shí),您首先遇到的就是指令集體系結(jié)構(gòu)(ISA)。這是有關(guān)CPU如何運(yùn)行以及所有內(nèi)部系統(tǒng)如何交互的圖形化藍(lán)圖。就像同一物種中有許多品種的狗一樣,可以在CPU上構(gòu)建許多不同類型的ISA。兩種最常見的類型是x86(在臺(tái)式機(jī)和筆記本電腦中找到)和ARM(在嵌入式和移動(dòng)設(shè)備中找到)。

還有其他一些像MIPS,RISC-V和PowerPC這樣的小眾應(yīng)用程序。ISA將指定CPU可以處理哪些指令,如何與內(nèi)存和緩存交互,如何在多個(gè)處理階段劃分工作等等。

為了覆蓋CPU的主要部分,我們將遵循一條指令在執(zhí)行時(shí)所采用的路徑。不同類型的指令可能遵循不同的路徑,并使用CPU的不同部分,但在這里我們將進(jìn)行概括以涵蓋最大部分。我們將從單核處理器的最基本設(shè)計(jì)開始,并隨著我們朝著更現(xiàn)代的設(shè)計(jì)逐步增加復(fù)雜性。

控制單元和數(shù)據(jù)路徑

CPU可以分為兩部分:控制單元和數(shù)據(jù)路徑。想象一輛火車。引擎是火車的動(dòng)力來源,但指揮員卻在幕后拉動(dòng)操縱桿并控制引擎的各個(gè)方面。CPU是相同的方式。

數(shù)據(jù)路徑就像引擎一樣,顧名思義,是數(shù)據(jù)在處理過程中流動(dòng)的路徑。數(shù)據(jù)路徑接收輸入,處理它們,并在完成后將它們發(fā)送到正確的位置??刂茊卧嬖V數(shù)據(jù)路徑如何工作。根據(jù)指令,數(shù)據(jù)路徑會(huì)將信號(hào)路由到不同的組件,打開和關(guān)閉數(shù)據(jù)路徑的不同部分,并監(jiān)視CPU的狀態(tài)。


指令周期-獲取

我們的CPU必須做的第一件事是弄清楚下一步要執(zhí)行什么指令,然后將它們從內(nèi)存轉(zhuǎn)移到CPU中。指令由編譯器產(chǎn)生,并且特定于CPU的ISA。ISA將共享最常見的指令類型,例如加載,存儲(chǔ),加法,減法等,但是每個(gè)特定ISA都有許多其他特殊類型的指令。對(duì)于每種類型的指令,控制單元將知道需要將哪些信號(hào)路由到何處。

例如,當(dāng)您在Windows上運(yùn)行.exe時(shí),該程序的代碼將移入內(nèi)存,并且告訴CPU第一條指令的起始地址。CPU始終維護(hù)一個(gè)內(nèi)部寄存器,該寄存器保存要執(zhí)行的下一條指令的存儲(chǔ)器位置。這稱為程序計(jì)數(shù)器(PC)。

一旦知道從哪里開始,指令周期的第一步就是獲取該指令。這會(huì)將指令從存儲(chǔ)器移到CPU的指令寄存器中,這稱為提取階段。實(shí)際上,指令可能已經(jīng)在CPU的高速緩存中,這個(gè)我們在后續(xù)再介紹。

指令周期-解碼

當(dāng)CPU有一條指令時(shí),它需要專門弄清楚它是什么類型的指令。這稱為解碼階段。每個(gè)指令將具有一組稱為操作碼的特定位,該“位”告訴CPU如何解釋它。這類似于如何使用不同的文件擴(kuò)展名告訴計(jì)算機(jī)如何解釋文件。例如,.jpg和.png都是圖像文件,但是它們以不同的方式組織數(shù)據(jù),因此計(jì)算機(jī)需要知道類型才能正確解釋它們。

根據(jù)ISA的復(fù)雜程度,CPU的指令解碼部分可能會(huì)變得復(fù)雜。像RISC-V這樣的ISA可能只有幾十條指令,而x86有數(shù)千條指令。在典型的Intel x86 CPU上,解碼過程是最具挑戰(zhàn)性的過程之一,并且占用大量空間。CPU將解碼的最常見的指令類型是存儲(chǔ)器,算術(shù)或分支指令。

3種主要指令類型

存儲(chǔ)指令可能類似于“將值從存儲(chǔ)地址1234讀入值A(chǔ)”或“將值B寫入存儲(chǔ)地址5678”。算術(shù)指令可能類似于“將值A(chǔ)添加到值B并將結(jié)果存儲(chǔ)到值C”。分支指令可能類似于“如果C值為正,則執(zhí)行此代碼;如果C值為負(fù),則執(zhí)行彼代碼”。一個(gè)典型的程序可能將它們鏈接在一起,以產(chǎn)生類似“將結(jié)果為肯定的內(nèi)存地址1234的值添加到內(nèi)存地址5678的值,并將其存儲(chǔ)在內(nèi)存地址4321的結(jié)果,如果結(jié)果為負(fù)的則存儲(chǔ)在地址8765的東西” 。

在開始執(zhí)行剛剛解碼的指令之前,我們需要暫停片刻以討論寄存器。

CPU具有一些很小但非??斓拇鎯?chǔ)器,稱為寄存器。在64位CPU上,每個(gè)將容納64位,并且內(nèi)核可能只有幾十個(gè)。這些用于存儲(chǔ)當(dāng)前正在使用的值,可以將其視為類似于L0緩存的值。在上面的指令示例中,值A(chǔ),B和C都將存儲(chǔ)在寄存器中。

ALU

現(xiàn)在回到執(zhí)行階段。對(duì)于我們上面討論的3種類型的指令,這將有所不同,因此我們將分別介紹每一種。

從算術(shù)指令開始,因?yàn)樗鼈冏钊菀桌斫?。這些類型的指令被送入算術(shù)日志單元(ALU)進(jìn)行處理。ALU是一種通常具有兩個(gè)輸入和控制信號(hào)并輸出結(jié)果的電路。


想象一下您在中學(xué)時(shí)期使用的基本計(jì)算器。要執(zhí)行操作,請(qǐng)輸入兩個(gè)輸入數(shù)字以及要執(zhí)行的操作類型。計(jì)算器進(jìn)行計(jì)算并輸出結(jié)果。對(duì)于我們的CPU的ALU,操作類型由指令的操作碼決定,控制單元會(huì)將其發(fā)送給ALU。除了基本的算術(shù)運(yùn)算之外,ALU還可以執(zhí)行AND,OR,NOT和XOR之類的bitwise運(yùn)算。ALU還將為控制單元輸出一些有關(guān)其剛剛完成的計(jì)算的狀態(tài)信息。這可能包括諸如結(jié)果是肯定的,否定的,零的還是溢出的事情。

ALU與算術(shù)運(yùn)算最相關(guān),但是它也可以用于存儲(chǔ)器或分支指令。例如,CPU可能需要計(jì)算作為先前算術(shù)運(yùn)算結(jié)果給出的內(nèi)存地址。它還可能需要計(jì)算偏移量,以添加到分支指令所需的程序計(jì)數(shù)器中。諸如“如果先前的結(jié)果是否定的,則向前跳20條指令”。

內(nèi)存指令和層次結(jié)構(gòu)

對(duì)于內(nèi)存指令,我們需要了解一個(gè)稱為“ 內(nèi)存層次結(jié)構(gòu)”的概念。這代表了高速緩存,RAM和主存儲(chǔ)之間的關(guān)系。當(dāng)CPU接收到一條內(nèi)存指令,該指令針對(duì)尚未在其寄存器本地存儲(chǔ)的數(shù)據(jù)時(shí),它將沿內(nèi)存層次結(jié)構(gòu)下降,直到找到它為止。大多數(shù)現(xiàn)代CPU包含三級(jí)緩存:L1,L2和L3。CPU首先要檢查的地方是L1緩存。這是三級(jí)緩存中最小和最快的。L1高速緩存通常分為用于數(shù)據(jù)的部分和用于指令的部分。請(qǐng)記住,指令需要像數(shù)據(jù)一樣從內(nèi)存中獲取。

典型的L1緩存可能為數(shù)百KB。如果CPU在L1緩存中找不到所需的內(nèi)容,它將檢查L2緩存。這可能約為幾MB。下一步是L3緩存,它可能是幾十MB。如果CPU在三級(jí)緩存中找不到所需的數(shù)據(jù),它將進(jìn)入RAM,最后進(jìn)入主存儲(chǔ)器。當(dāng)我們沿著每一步走時(shí),可用空間大約增加一個(gè)數(shù)量級(jí),但是等待時(shí)間也增加。


CPU找到數(shù)據(jù)后,它將調(diào)出層次結(jié)構(gòu),以便將來如有需要,CPU可以快速訪問它。這里有很多步驟,但是可以確保CPU快速訪問所需的數(shù)據(jù)。例如,CPU可以在一個(gè)或兩個(gè)周期內(nèi)讀取其內(nèi)部寄存器,在幾個(gè)周期中讀取L1,在十個(gè)左右周期中讀取L2,在幾十個(gè)周期中讀取L3。如果需要進(jìn)入內(nèi)存或主存儲(chǔ),則可能要花費(fèi)數(shù)萬甚至數(shù)百萬個(gè)周期。根據(jù)系統(tǒng)的不同,每個(gè)核心可能會(huì)擁有自己的私有L1緩存,與另一個(gè)核心共享一個(gè)L2,并在四個(gè)或更多核心的組之間共享一個(gè)L3。我們將在本文后面詳細(xì)討論多核CPU。

分支和跳轉(zhuǎn)指令

三種主要指令類型中的最后一種是分支指令?,F(xiàn)代程序始終無休止地跳來跳去,CPU很少執(zhí)行沒有分支的連續(xù)指令。分支指令來自諸如if語句,for循環(huán)和return語句之類的編程元素。這些都用于中斷程序執(zhí)行并切換到代碼的不同部分。也有跳轉(zhuǎn)指令,這些跳轉(zhuǎn)指令是始終采用的分支指令。

條件分支對(duì)于CPU尤其棘手,因?yàn)樗赡芤淮螆?zhí)行多個(gè)指令,并且可能直到分支開始執(zhí)行后續(xù)指令后才能確定分支的結(jié)果。

為了完全理解為什么這是一個(gè)問題,我們需要進(jìn)行另一種轉(zhuǎn)移,并討論流水線。指令周期中的每個(gè)步驟可能需要幾個(gè)周期才能完成。這意味著在提取指令時(shí),ALU否則將處于空閑狀態(tài)。為了最大化CPU的效率,我們在稱為流水線的過程中劃分每個(gè)階段。

理解這一點(diǎn)的經(jīng)典方法是以洗衣服為對(duì)比。您有兩個(gè)東西要洗,洗滌和干燥個(gè)需要一個(gè)小時(shí)。您可以將第一個(gè)物件放入洗衣機(jī)中,然后在烘干機(jī)中放入,等烘干之后后再開始洗第二個(gè)產(chǎn)品。這將花費(fèi)四個(gè)小時(shí)。但是,如果您劃分工作并在第一個(gè)產(chǎn)品干燥的同時(shí)開始第二個(gè)洗滌,則可以在三個(gè)小時(shí)內(nèi)完成兩個(gè)裝載。一小時(shí)減少量取決于您的要洗的東西數(shù)量以及洗衣機(jī)和烘干機(jī)的數(shù)量。洗烘每個(gè)東西仍然需要兩個(gè)小時(shí),但是如果計(jì)算重疊,則將總吞吐量從0.5個(gè)產(chǎn)品/小時(shí)增加到0.75個(gè)產(chǎn)品/小時(shí)。


CPU使用相同的方法來提高指令吞吐量?,F(xiàn)代的ARM或x86 CPU可能具有20多個(gè)流水線級(jí),這意味著在任何給定點(diǎn),該內(nèi)核一次都可以處理20多個(gè)不同的指令。每種設(shè)計(jì)都是唯一的,但是一個(gè)樣本劃分可能是4個(gè)周期用于讀取,6個(gè)周期用于解碼,3個(gè)周期用于執(zhí)行以及7個(gè)周期將結(jié)果更新回內(nèi)存。

回到分支機(jī)構(gòu),希望您可以開始看到此問題。如果直到周期10才知道一條指令是分支,那么我們將已經(jīng)開始執(zhí)行9條新指令,如果采用該分支,這些指令可能無效。為了解決這個(gè)問題,CPU具有非常復(fù)雜的結(jié)構(gòu),稱為分支預(yù)測器。他們使用機(jī)器學(xué)習(xí)中的類似概念來嘗試猜測是否將采用分支。分支預(yù)測變量的復(fù)雜性遠(yuǎn)遠(yuǎn)超出了本文的范圍,但是在基本級(jí)別上,它們跟蹤先前分支的狀態(tài),以了解是否可能采用即將到來的分支。現(xiàn)代分支預(yù)測器可以具有95%或更高的準(zhǔn)確性。

一旦確定分支的結(jié)果(已完成流水線的該階段),程序計(jì)數(shù)器將被更新,CPU將繼續(xù)執(zhí)行下一條指令。如果分支的預(yù)測錯(cuò)誤,則CPU將在分支錯(cuò)誤地開始執(zhí)行后拋出所有指令,然后從正確的位置重新啟動(dòng)。

亂序執(zhí)行

現(xiàn)在,我們知道如何執(zhí)行三種最常見的指令類型,讓我們看一下CPU的一些更高級(jí)的功能。實(shí)際上,所有現(xiàn)代處理器實(shí)際上并沒有按接收順序執(zhí)行指令。等待執(zhí)行其他指令時(shí),可以使用稱為亂序執(zhí)行的范例來最大程度地減少停機(jī)時(shí)間。

如果CPU知道即將到來的指令,但所需的數(shù)據(jù)并不能及時(shí)準(zhǔn)備,這時(shí)候它可以在等待時(shí)切換指令順序并從程序的后面引入一條獨(dú)立的指令。該指令重新排序是一種功能非常強(qiáng)大的工具,但它遠(yuǎn)非CPU使用的唯一技巧。


另一個(gè)提高性能的功能稱為預(yù)取。如果您要花時(shí)間從頭到尾完成一條隨機(jī)指令需要多長時(shí)間,您會(huì)發(fā)現(xiàn)內(nèi)存訪問大部分時(shí)間都用完了。預(yù)取器是CPU中的一個(gè)單元,它試圖預(yù)見將來的指令以及它們將需要什么數(shù)據(jù)。如果發(fā)現(xiàn)需要CPU尚未緩存的數(shù)據(jù),它將到達(dá)RAM并將該數(shù)據(jù)提取到緩存中。因此它的名稱叫做預(yù)取。

加速器與未來

在CPU中,另一個(gè)正在增加的主要功能是對(duì)于特定任務(wù)的加速。這些電路的全部工作是盡可能快地完成一項(xiàng)小任務(wù)。這可能包括加密,媒體編碼或機(jī)器學(xué)習(xí)。

CPU可以自己完成這些事情,但是擁有專用于它們的單元會(huì)大大提高效率。專用GPU就是一個(gè)很好的例子。CPU當(dāng)然可以執(zhí)行圖形處理所需的計(jì)算,但是為它們配備專用單元可以提供更好的性能數(shù)量級(jí)。隨著加速器的興起,CPU的實(shí)際核心可能只占芯片的一小部分。

下圖顯示了幾年前的Intel CPU。大部分空間被內(nèi)核和緩存占用。下面的第二張圖片是新的AMD芯片。那里的大部分空間都由核心以外的組件占用。


走向多核

最后要介紹的主要功能是如何將一堆單獨(dú)的CPU連接在一起以形成多核CPU。這不只是簡單地放入我們之前討論的單核設(shè)計(jì)的多個(gè)副本那樣簡單。就像沒有簡單的方法將單線程程序轉(zhuǎn)換為多線程程序一樣,相同的概念也適用于硬件。問題來自核心之間的依賴性。

例如,對(duì)于4核設(shè)計(jì),CPU需要能夠以4倍的速度發(fā)出指令。它還需要四個(gè)單獨(dú)的內(nèi)存接口。由于多個(gè)實(shí)體可能會(huì)處理相同的數(shù)據(jù),因此必須解決諸如一致性和非一致性之類的問題。如果兩個(gè)內(nèi)核都使用相同的數(shù)據(jù)來處理指令,那么他們?nèi)绾沃勒l擁有正確的價(jià)值?如果一個(gè)內(nèi)核修改了數(shù)據(jù)但又沒有及時(shí)到達(dá)另一個(gè)內(nèi)核執(zhí)行該怎么辦?由于它們具有可存儲(chǔ)重疊數(shù)據(jù)的單獨(dú)緩存,因此必須使用復(fù)雜的算法和控制器來消除這些沖突。

隨著CPU中內(nèi)核數(shù)量的增加,正確的分支預(yù)測也非常重要。內(nèi)核一次執(zhí)行的指令越多,其中一個(gè)處理分支指令的可能性就越高。這意味著指令流可能隨時(shí)更改。

通常,單獨(dú)的內(nèi)核將處理來自不同線程的指令流。這有助于減少內(nèi)核之間的依賴性。這就是為什么如果您檢查“任務(wù)管理器”,您會(huì)經(jīng)??吹揭粋€(gè)核心在努力工作,而其他核心卻在工作。許多程序不是為多線程設(shè)計(jì)的。在某些情況下,讓一個(gè)核心來完成工作比支付試圖分工的開銷要高得多。

物理設(shè)計(jì)

本文的大部分內(nèi)容都集中在CPU的體系結(jié)構(gòu)設(shè)計(jì)上,因?yàn)檫@是大多數(shù)復(fù)雜性所在。但是,所有這些都需要在現(xiàn)實(shí)世界中創(chuàng)建,這又增加了另一層次的復(fù)雜性。
為了使整個(gè)處理器中的所有組件同步,使用了時(shí)鐘信號(hào)?,F(xiàn)代處理器通常在3.0GHz和5.0GHz之間運(yùn)行,并且在過去十年中似乎沒有改變。在每個(gè)周期中,芯片內(nèi)部數(shù)十億個(gè)晶體管處于導(dǎo)通和截止?fàn)顟B(tài)。

時(shí)鐘對(duì)于確保在流水線的每個(gè)階段前進(jìn)時(shí),所有值在正確的時(shí)間顯示都是至關(guān)重要的。時(shí)鐘確定CPU每秒可以處理多少條指令。通過超頻提高其頻率將使芯片速度更快,但也會(huì)增加功耗和熱量輸出。


熱量是CPU的最大敵人。隨著數(shù)字電子設(shè)備的升溫,微觀晶體管可能開始退化。如果不清除熱量,可能會(huì)導(dǎo)致芯片損壞。這就是為什么所有CPU都帶有散熱器的原因。CPU的實(shí)際硅芯片可能僅占物理設(shè)備表面積的20%。占用空間的增加允許熱量更均勻地散布到散熱器。它還允許更多的引腳用于與外部組件的接口。

現(xiàn)代CPU的背面可以有數(shù)千個(gè)或更多的輸入和輸出引腳。由于大多數(shù)計(jì)算部件都在芯片內(nèi),因此移動(dòng)芯片可能只有幾百個(gè)引腳。不管采用哪種設(shè)計(jì),其中約有一半專門用于供電,其余用于數(shù)據(jù)通信。這包括與RAM,芯片組,存儲(chǔ),PCIe設(shè)備等的通信。

隨著高性能CPU在滿負(fù)載下汲取100安培或更高的電流,它們需要數(shù)百個(gè)引腳才能平均分散電流消耗。引腳通常鍍金以提高導(dǎo)電性。不同的制造商在其許多產(chǎn)品線中使用不同的銷釘布置。

結(jié)合一個(gè)例子

總結(jié)一下,我們將快速介紹一下Intel Core 2 CPU的設(shè)計(jì)。這是從2006年開始的,因此某些零件可能已過時(shí),但是尚無有關(guān)較新設(shè)計(jì)的詳細(xì)信息。

從頂部開始,我們有指令緩存和ITLB。轉(zhuǎn)換后備緩沖區(qū)(TLB)用于幫助CPU知道存儲(chǔ)器中要查找所需指令的位置。這些指令存儲(chǔ)在L1指令緩存中,然后發(fā)送到預(yù)解碼器中。x86體系結(jié)構(gòu)極其復(fù)雜且密集,因此有許多解碼步驟。同時(shí),分支預(yù)測器和預(yù)取器都在期待由傳入指令引起的任何潛在問題。


從那里,指令被發(fā)送到指令隊(duì)列。回顧一下無序設(shè)計(jì)如何使CPU執(zhí)行指令并選擇最及時(shí)的指令來執(zhí)行。該隊(duì)列保存CPU正在考慮的當(dāng)前指令。一旦CPU知道哪一條指令將是最佳執(zhí)行方式,它將進(jìn)一步解碼為微操作。雖然一條指令可能包含CPU的復(fù)雜任務(wù),但微操作是精細(xì)的任務(wù),CPU可以更輕松地對(duì)其進(jìn)行解釋。

然后,這些指令進(jìn)入“注冊表”,“ ROB”和“保留站”。這三個(gè)組成部分的確切功能有些復(fù)雜(請(qǐng)考慮研究生水平的大學(xué)課程),但是它們在亂序過程中用于幫助管理指令之間的依賴關(guān)系。

一個(gè)“核心”實(shí)際上將具有許多ALU和內(nèi)存端口。將傳入的操作放入預(yù)留站,直到可以使用ALU或內(nèi)存端口。一旦所需的組件可用,該指令將在L1數(shù)據(jù)緩存的幫助下進(jìn)行處理。輸出結(jié)果將被存儲(chǔ),并且CPU現(xiàn)在準(zhǔn)備從下一條指令開始。就是這樣!

雖然本文并不是要確切地指導(dǎo)每個(gè)CPU的工作方式,但是它應(yīng)該使您對(duì)它們的內(nèi)部工作原理和復(fù)雜性有一個(gè)很好的了解。坦白說,AMD和Intel之外的人實(shí)際上都不知道他們的CPU如何工作。本文的每個(gè)部分都代表了整個(gè)研究和開發(fā)領(lǐng)域,因此此處提供的信息只是從頭開始。

公眾號(hào)ID:imecas_wx 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多