版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-中央處理器操作指令

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

基本概念

中央處理器(CPU,Central Processing Unit)是一塊超大規(guī)模的集成電路,是一臺(tái)計(jì)算機(jī)的運(yùn)算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù)。

中央處理器主要包括運(yùn)算器(算術(shù)邏輯運(yùn)算單元,ALU,Arithmetic Logic Unit)和高速緩沖存儲(chǔ)器(Cache)及實(shí)現(xiàn)它們之間聯(lián)系的數(shù)據(jù)(Data)、控制及狀態(tài)的總線(Bus)。它與內(nèi)部存儲(chǔ)器(Memory)和輸入/輸出(I/O)設(shè)備合稱(chēng)為電子計(jì)算機(jī)三大核心部件。

CPU操作指令的處理流程大概分為:取指、譯碼、執(zhí)行、訪存、寫(xiě)回等幾步。每條指令需要1~6個(gè)字節(jié)不等,這取決于需要哪些字段。每條指令的第一個(gè)字節(jié)表明指令的類(lèi)型:高4位是代碼部分(例:6為整數(shù)類(lèi)操作指令),低4位是功能部分(例:1為整數(shù)類(lèi)中的減法指令) 61合起來(lái)即為sub指令。

處理指令流程指令集的一個(gè)重要性質(zhì)就是字節(jié)編碼必須有唯一的解釋。任意一個(gè)字節(jié)序列要么是一個(gè)唯一的指令序列的編碼,要么就不是一個(gè)合法的字節(jié)序列。因?yàn)槊織l指令的第一個(gè)字節(jié)有唯一的代碼和功能組合,給定這個(gè)字節(jié),我們就可以決定所有其他附加字節(jié)的長(zhǎng)度和含義。

每條指令需要1~6個(gè)字節(jié)不等,這取決于需要哪些字段。每條指令的第一個(gè)字節(jié)表明指令的類(lèi)型:高4位是代碼部分(例:6為整數(shù)類(lèi)操作指令),低4位是功能部分(例:1為整數(shù)類(lèi)中的減法指令) 61合起來(lái)即為sub指令。

下面是處理每條指令的流程圖:

取指(fetch)取值階段從存儲(chǔ)器讀取指令字節(jié),放到指令存儲(chǔ)器(CPU中)中,地址為程序計(jì)數(shù)器(PC)的值。它按順序的方式計(jì)算當(dāng)前指令的下一條指令的地址(即PC的值加上已取出指令的長(zhǎng)度)。

譯碼(decode)ALU從寄存器文件(通用寄存器的集合)讀入最多兩個(gè)操作數(shù)。(即一次最多讀取兩個(gè)寄存器中的內(nèi)容)

執(zhí)行(execute)在執(zhí)行階段會(huì)根據(jù)指令的類(lèi)型,將算數(shù)/邏輯單元(ALU)用于不同的目的。對(duì)其他指令,它會(huì)作為一個(gè)加法器來(lái)計(jì)算增加或減少棧指針,或者計(jì)算有效地址,或者只是簡(jiǎn)單地加0,將一個(gè)輸入傳遞到輸出。

條件碼寄存器(CC)有三個(gè)條件位。ALU負(fù)責(zé)計(jì)算條件碼新值。當(dāng)執(zhí)行一條跳轉(zhuǎn)指令時(shí),會(huì)根據(jù)條件碼和跳轉(zhuǎn)類(lèi)型來(lái)計(jì)算分支信號(hào)cnd。

訪存(memory)訪存階段,數(shù)據(jù)存儲(chǔ)器(CPU中)讀出或?qū)懭胍粋€(gè)存儲(chǔ)器字。指令和數(shù)據(jù)存儲(chǔ)器訪問(wèn)的是相同的存儲(chǔ)器位置,但是用于不同的目的。

寫(xiě)回(write back)寫(xiě)回階段最多可以寫(xiě)兩個(gè)結(jié)果到寄存器文件。寄存器文件有兩個(gè)寫(xiě)端口。端口E用來(lái)寫(xiě)ALU計(jì)算出來(lái)的值,而端口M用來(lái)寫(xiě)從數(shù)據(jù)存儲(chǔ)器中讀出的值。

更新PC(PC update)根據(jù)指令代碼和分支標(biāo)志,從前幾步得出的信號(hào)值中,選出下一個(gè)PC的值。

工作過(guò)程CPU從存儲(chǔ)器或高速緩沖存儲(chǔ)器中取出指令,放入指令寄存器,并對(duì)指令譯碼。它把指令分解成一系列的微操作,然后發(fā)出各種控制命令,執(zhí)行微操作系列,從而完成一條指令的執(zhí)行。指令是計(jì)算機(jī)規(guī)定執(zhí)行操作的類(lèi)型和操作數(shù)的基本命令。指令是由一個(gè)字節(jié)或者多個(gè)字節(jié)組成,其中包括操作碼字段、一個(gè)或多個(gè)有關(guān)操作數(shù)地址的字段以及一些表征機(jī)器狀態(tài)的狀態(tài)字以及特征碼。有的指令中也直接包含操作數(shù)本身。

提取第一階段,提取,從存儲(chǔ)器或高速緩沖存儲(chǔ)器中檢索指令(為數(shù)值或一系列數(shù)值)。由程序計(jì)數(shù)器(Program Counter)指定存儲(chǔ)器的位置。(程序計(jì)數(shù)器保存供識(shí)別程序位置的數(shù)值。換言之,程序計(jì)數(shù)器記錄了CPU在程序里的蹤跡。)

解碼CPU根據(jù)存儲(chǔ)器提取到的指令來(lái)決定其執(zhí)行行為。在解碼階段,指令被拆解為有意義的片段。根據(jù)CPU的指令集架構(gòu)(ISA)定義將數(shù)值解譯為指令。一部分的指令數(shù)值為運(yùn)算碼(Opcode),其指示要進(jìn)行哪些運(yùn)算。其它的數(shù)值通常供給指令必要的信息,諸如一個(gè)加法(Addition)運(yùn)算的運(yùn)算目標(biāo)。

執(zhí)行在提取和解碼階段之后,緊接著進(jìn)入執(zhí)行階段。該階段中,連接到各種能夠進(jìn)行所需運(yùn)算的CPU部件。

例如,要求一個(gè)加法運(yùn)算,算術(shù)邏輯單元(ALU,Arithmetic Logic Unit)將會(huì)連接到一組輸入和一組輸出。輸入提供了要相加的數(shù)值,而輸出將含有總和的結(jié)果。ALU內(nèi)含電路系統(tǒng),易于輸出端完成簡(jiǎn)單的普通運(yùn)算和邏輯運(yùn)算(比如加法和位元運(yùn)算)。如果加法運(yùn)算產(chǎn)生一個(gè)對(duì)該CPU處理而言過(guò)大的結(jié)果,在標(biāo)志暫存器里可能會(huì)設(shè)置運(yùn)算溢出(Arithmetic Overflow)標(biāo)志。

寫(xiě)回最終階段,寫(xiě)回,以一定格式將執(zhí)行階段的結(jié)果簡(jiǎn)單的寫(xiě)回。運(yùn)算結(jié)果經(jīng)常被寫(xiě)進(jìn)CPU內(nèi)部的暫存器,以供隨后指令快速存取。在其它案例中,運(yùn)算結(jié)果可能寫(xiě)進(jìn)速度較慢,但容量較大且較便宜的主記憶體中。某些類(lèi)型的指令會(huì)操作程序計(jì)數(shù)器,而不直接產(chǎn)生結(jié)果。這些一般稱(chēng)作“跳轉(zhuǎn)”(Jumps),并在程式中帶來(lái)循環(huán)行為、條件性執(zhí)行(透過(guò)條件跳轉(zhuǎn))和函式。許多指令會(huì)改變標(biāo)志暫存器的狀態(tài)位元。這些標(biāo)志可用來(lái)影響程式行為,緣由于它們時(shí)常顯出各種運(yùn)算結(jié)果。例如,以一個(gè)“比較”指令判斷兩個(gè)值大小,根據(jù)比較結(jié)果在標(biāo)志暫存器上設(shè)置一個(gè)數(shù)值。這個(gè)標(biāo)志可藉由隨后跳轉(zhuǎn)指令來(lái)決定程式動(dòng)向。在執(zhí)行指令并寫(xiě)回結(jié)果之后,程序計(jì)數(shù)器值會(huì)遞增,反覆整個(gè)過(guò)程,下一個(gè)指令周期正常的提取下一個(gè)順序指令。

CPU指令集CPU指令集主要有:MMX、SSE、SSE2、SSE3、3DNow!、AMD64、EM64T等。

MMX:MMX(Multi Media eXtension 多媒體擴(kuò)展指令)指令集是Intel公司在1996年為旗下的Pentium系列處理器所開(kāi)發(fā)的一項(xiàng)多媒體指令增強(qiáng)技術(shù)。MMX指令集中包括了57條多媒體指令,通過(guò)這些指令可以一次性處理多個(gè)數(shù)據(jù),在處理結(jié)果超過(guò)實(shí)際處理能力的時(shí)候仍能夠進(jìn)行正常處理,如果在軟件的配合下,可以得到更強(qiáng)的處理性能。

使用MMX指令集的好處就是當(dāng)時(shí)所使用的操作系統(tǒng)可以在不做任何改變的情況下執(zhí)行MMX指令。但是,MMX指令集的問(wèn)題也是比較明顯的,MMX指令集不能與X86的浮點(diǎn)運(yùn)算指令同時(shí)執(zhí)行,必須做密集式的交錯(cuò)切換才可以正常執(zhí)行,但是這樣一來(lái),就會(huì)造成整個(gè)系統(tǒng)運(yùn)行速度的下降。

SSE:SSE是Streaming SIMD Extension(SIMD擴(kuò)展指令集)的縮寫(xiě),而其中SIMD的為含意為Single Istruction Multiple Data(單指令多數(shù)據(jù)),所以SSE指令集也叫單指令多數(shù)據(jù)流擴(kuò)展。該指令集最先運(yùn)用于Intel的Pentium III系列處理器,其實(shí)在Pentium III推出之前,Intel方面就已經(jīng)泄漏過(guò)關(guān)于KNI(Katmai New Instruction)指令集的消息。這個(gè)KNI指令集也就是SSE指令集的前身,當(dāng)時(shí)也有不少的媒體將該指令集稱(chēng)之為MMX2指令集,但是Intel方面卻從沒(méi)有發(fā)布有關(guān)MMX2指令集的消息。

最后在Intel推出Pentium III處理器的時(shí)候,SSE指令集也終于水落石出。SSE指令集是為提高處理器浮點(diǎn)性能而開(kāi)發(fā)的擴(kuò)展指令集,它共有70條指令,其中包含提高3D圖形運(yùn)算效率的50條SIMD浮點(diǎn)運(yùn)算指令、12條MMX 整數(shù)運(yùn)算增強(qiáng)指令、8條優(yōu)化內(nèi)存中的連續(xù)數(shù)據(jù)塊傳輸指令。理論上這些指令對(duì)當(dāng)時(shí)流行的圖像處理、浮點(diǎn)運(yùn)算、3D運(yùn)算、多媒體處理等眾多多媒體的應(yīng)用能力起到全面提升的作用。

SSE指令與AMD公司的3DNow!指令彼此互不兼容,但SSE包含了3DNow!中的絕大部分功能,只是實(shí)現(xiàn)的方法不同而已。SSE也向下兼容MMX指令,它可以通過(guò)SIMD和單時(shí)鐘周期并行處理多個(gè)浮點(diǎn)數(shù)據(jù)來(lái)有效地提高浮點(diǎn)運(yùn)算速度。

3DNow!:3DNow!指令集最由AMD公司所推出的,該指令集應(yīng)該是在SSE指令之前推出的,被廣泛運(yùn)用于AMD的K6、K6-2和K7系列處理器上,擁有21條擴(kuò)展指令集。在整體上3DNow!的SSE非常相相似,它們都擁有8個(gè)新的寄存器,但是3DNow!是64位的,而SSE是128位。所以3DNow!它只能存儲(chǔ)兩個(gè)浮點(diǎn)數(shù)據(jù),而不是四個(gè)。

但是它和SSE的側(cè)重點(diǎn)有所不同,3DNow!指令集主要針對(duì)三維建模、坐標(biāo)變換和效果渲染等3D數(shù)據(jù)的處理,在相應(yīng)的軟件配合下,可以大幅度提高處理器的3D處理性能。AMD公司后來(lái)又在Athlon系列處理器上開(kāi)發(fā)了新的Enhanced 3DNow!指令集,新的增強(qiáng)指令數(shù)達(dá)了52個(gè),以致目前最為流行的Athlon 64系列處理器還是支持3DNow!指令的。

SSE2:在PentiumIII發(fā)布的時(shí)候,SSE指令集就已經(jīng)集成在了處理器的內(nèi)部,但因?yàn)楦鞣N原因一直沒(méi)有得到充分的發(fā)展。直到Pentium 4發(fā)布之后,開(kāi)發(fā)人員看到使用SSE指令之后,程序執(zhí)行性能將得到極大的提升,于是Intel又在SSE的基礎(chǔ)上推出了更先進(jìn)的SSE2指令集。

SSE2包含了144條指令,由兩個(gè)部分組成:SSE部分和MMX部分。SSE部分主要負(fù)責(zé)處理浮點(diǎn)數(shù),而MMX部分則專(zhuān)門(mén)計(jì)算整數(shù)。SSE2的寄存器容量是MMX寄存器的兩倍,寄存器存儲(chǔ)數(shù)據(jù)也增加了兩倍。在指令處理速度保持不變的情況下,通過(guò)SSE2優(yōu)化后的程序和軟件運(yùn)行速度也能夠提高兩倍。由于SSE2指令集與MMX指令集相兼容,因此被MMX優(yōu)化過(guò)的程序很容易被SSE2再進(jìn)行更深層次的優(yōu)化,達(dá)到更好的運(yùn)行效果。

SSE2對(duì)于處理器的性能的提升是十分明顯的,雖然在同頻率的情況下,Pentium 4和性能不如Athlon XP,但由于Athlon XP不支持SSE2,所以經(jīng)過(guò)SSE2優(yōu)化后的程序Pentium 4的運(yùn)行速度要明顯高于Athlon XP。而AMD方面也注意到了這一情況,在隨后的K-8系列處理器中,都加入SSE2指令集。

SSE3:SSE3指令是目前規(guī)模最小的指令集,它只有13條指令。它共劃分為五個(gè)應(yīng)運(yùn)層,分別為數(shù)據(jù)傳輸命令、數(shù)據(jù)處理命令、特殊處理命令、優(yōu)化命令、超線程性能增強(qiáng)五個(gè)部分,其中超線程性能增強(qiáng)是一種全新的指令集,它可以提升處理器的超線程的處理能力,大大簡(jiǎn)化了超線程的數(shù)據(jù)處理過(guò)程,使處理器能夠更加快速的進(jìn)行并行數(shù)據(jù)處理。 上面介紹的基本上就是Intel和AMD公司在X86架構(gòu)處理器上主要的擴(kuò)展指令集,雖然它們對(duì)于處理器的性能提升有著一定程度的幫助,但是由于受到IA-32體系的限制,X86架構(gòu)基本上不會(huì)再有具有革命性意義的指令集出現(xiàn),而雙方都已經(jīng)把重心轉(zhuǎn)向了64位體系架構(gòu)的處理器指令集開(kāi)發(fā)上。

AMD64:AMD的athlon 64系列處理器的64位技術(shù)是在X86指令集的基礎(chǔ)上加入了X86-64的64位擴(kuò)展X86指令集,這就使得athlon 64系列處理器可兼容原來(lái)的32位的X86軟件,并同時(shí)支持X86-64的擴(kuò)展64位計(jì)算,并且具有64位的尋址能力,使得它成為真正的64位X86構(gòu)架處理器。在采用X86-64架構(gòu)的Athlon 64處理器中,X86-64指令集中新增了幾組處理器寄存器,它能夠提供更加快速的執(zhí)行效率。

寄存器是處理器用來(lái)創(chuàng)建和儲(chǔ)存CPU運(yùn)算結(jié)果和其他運(yùn)算結(jié)果的地方,標(biāo)準(zhǔn)的X86構(gòu)架中包括8組通用寄存器,而在AMD的X86-64架構(gòu)中又增加了8組,將通過(guò)寄存器的數(shù)目提高到了16組。在這基礎(chǔ)之上,X86-64指令集還另外增加了8組128位的XMM寄存器,也叫做SSE寄存器。

它能夠給單指令多數(shù)據(jù)流技術(shù)(SIMD)運(yùn)算提供更多的存儲(chǔ)空間,這些128位的寄存器能夠提供在矢量和標(biāo)量計(jì)算模式下進(jìn)行128位雙精度處理,這也為3D數(shù)據(jù)處理、矢量分析和虛擬技術(shù)提供了良好的硬件基礎(chǔ)。由于提供了更多的寄存器,按照X86-64標(biāo)準(zhǔn)生產(chǎn)的處理器可以更有效率的處理數(shù)據(jù),在一個(gè)時(shí)鐘周期內(nèi)能夠傳輸更多的信息。

EM64T :EM64T(Extended Memory 64 Technology)也就是Intel公司開(kāi)發(fā)的64位內(nèi)存擴(kuò)展技術(shù)。它實(shí)際上就是Intel IA-32構(gòu)架體系的擴(kuò)展,即IA-32E(Intel Architectur-32 Extension)。Intel的IA-32處理器通過(guò)加入EM64T技術(shù)便可在兼容IA-32軟件的情況下,允許軟件程序利用更多的內(nèi)存地址空間,并且允許程序進(jìn)行32 位線性地址寫(xiě)入1。