日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

指令集及流水线基本概念

發(fā)布時(shí)間:2024/4/18 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 指令集及流水线基本概念 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1地址總線、數(shù)據(jù)總線和機(jī)器字長(zhǎng)

1.1?數(shù)據(jù)總線

數(shù)據(jù)總線DB(DataBus)用于傳送數(shù)據(jù)信息。數(shù)據(jù)總線是雙向三態(tài)形式的總線,即它既可以把CPU的數(shù)據(jù)傳送到存儲(chǔ)器或輸入輸出接口等其它部件,也可以將其它部件的數(shù)據(jù)傳送到CPU。

1.2?地址總線

地址總線AB(Address Bus;又稱(chēng)位址總線) 屬于一種電腦總線 (一部份),是由CPU 或有DMA 能力的單元,用來(lái)溝通這些單元想要存取(讀取/寫(xiě)入)電腦內(nèi)存元件/地方的實(shí)體位址。

地址總線AB是專(zhuān)門(mén)用來(lái)傳送地址的,由于地址只能從CPU傳向外部存儲(chǔ)器或I/O端口,所以地址總線總是單向三態(tài)的,這與數(shù)據(jù)總線不同。地址總線的位數(shù)(寬度)決定了CPU可直接尋址的內(nèi)存空間大小,即決定有多少的內(nèi)存可以被存取。

1.3?機(jī)器字長(zhǎng)

機(jī)器字長(zhǎng)是指CPU一次處理數(shù)據(jù)的寬度,我們通常所說(shuō)的“32位CPU”、“64位CPU”中的“32”、“64”就是機(jī)器字長(zhǎng)。機(jī)器字長(zhǎng)主要由運(yùn)算器、寄存器決定,通常寄存器長(zhǎng)度等于機(jī)器字長(zhǎng)。如32位處理器,每個(gè)寄存器能存儲(chǔ)32bit數(shù)據(jù),加法器支持兩個(gè)32bit數(shù)據(jù)進(jìn)行相加。

目前嵌入式處理器大都以32位為主,32位處理器的地址總線通常都是32位,可尋址范圍是4Gbyte,地址總線越寬,可尋址范圍越大。通常數(shù)據(jù)總線的帶寬都要高于機(jī)器字長(zhǎng),32位處理器很多都采用64bit、128bit的數(shù)據(jù)帶寬,這樣可以一次讀取更多的數(shù)據(jù)。

2?機(jī)器語(yǔ)言和指令集

2.1?機(jī)器語(yǔ)言

語(yǔ)言主要包括以下要素:

1.詞匯。一個(gè)詞匯代表一個(gè)意象片段,每個(gè)詞匯與某事物一一對(duì)應(yīng)。

2.語(yǔ)法。包括格式、結(jié)構(gòu)和規(guī)則。

3.語(yǔ)句。詞匯按照一定的語(yǔ)法規(guī)則有機(jī)組合形成語(yǔ)句。

4.語(yǔ)義。亦即動(dòng)機(jī)性,即維特根斯坦說(shuō)的語(yǔ)言中訓(xùn)練的部分。它包括詞匯的表意和語(yǔ)句的含義,表達(dá)信息或操作命令。

CPU不認(rèn)識(shí)匯編語(yǔ)言,更不認(rèn)識(shí)C/C++等高級(jí)語(yǔ)言,它只認(rèn)識(shí)機(jī)器語(yǔ)言。計(jì)算機(jī)數(shù)字邏輯電路只認(rèn)識(shí)以高低電平或者開(kāi)關(guān)通斷狀態(tài)信號(hào)來(lái)量化的二進(jìn)制0和1,因此機(jī)器語(yǔ)言都是基于二進(jìn)制的編碼序列。

在遠(yuǎn)古時(shí)代,只能使用機(jī)器語(yǔ)言編程。當(dāng)程序需要被運(yùn)行時(shí),程序員需要將他寫(xiě)的程序?qū)懭氲酱鎯?chǔ)設(shè)備上,最原始的存儲(chǔ)設(shè)備就是紙帶,即在紙帶上打相應(yīng)的孔。每個(gè)孔代表一位,穿孔表示0,未穿孔表示1,這些孔序列匯編成機(jī)器語(yǔ)言,由譯碼器(掃描器)識(shí)別。計(jì)算機(jī)運(yùn)算完畢,需要人工翻譯結(jié)果。

二進(jìn)制機(jī)器碼太難記了,可以想見(jiàn)打孔編程的工作是多么的枯燥和乏味。于是人們發(fā)明了匯編語(yǔ)言,使用人類(lèi)語(yǔ)言的單詞作為助記符與機(jī)器碼建立一一對(duì)應(yīng)關(guān)系。匯編器維護(hù)了這張映射表,并在匯編階段將匯編代碼翻譯成指令機(jī)器碼。從大的方面講,匯編是相當(dāng)簡(jiǎn)單的,它只是使用助記符號(hào)替代對(duì)應(yīng)的機(jī)器碼元。

下表列出了MIPS32中匯編指令add/and與機(jī)器碼的對(duì)應(yīng)關(guān)系。

ASM
31-26
25-21
20-16
15-11
10-6
5-0
add?d,s,t
0
s
t
d
0
32
and?d,s,t
0
s
t
d
0
36

MIPS有32個(gè)通用寄存器(編碼占5bit),所有指令都是32位(無(wú)Intelx86那樣的可變長(zhǎng)指令),3操作數(shù)運(yùn)算指令的操作數(shù)只能是寄存器。

“add d,s,t”和“and d,s,t”都屬于3寄存器算術(shù)/邏輯運(yùn)算指令組,域31-26為6位長(zhǎng)的主操作碼“op”,add和and共享op域,都為0;域5-0為子操作碼域,用于區(qū)分add(32)和and(36)。25-21為第一個(gè)源操作數(shù)寄存器s的編碼;20-16為第二個(gè)源操作數(shù)寄存器t的編碼;15-11為目的操作數(shù)寄存器d的編碼。

2.2?指令集

在機(jī)器語(yǔ)言中,指令就是一個(gè)語(yǔ)句。指令格式為“操作碼域+操作數(shù)域”,操作碼域指明了指令的操作性質(zhì)及功能,操作數(shù)域則給出了操作數(shù)或操作數(shù)的地址。操作碼和操作數(shù)是機(jī)器可識(shí)別的詞匯,包括“操作命令”、“內(nèi)存地址”、“字節(jié)”、“寄存器”,它們組合在一起的機(jī)器指令體現(xiàn)語(yǔ)義。不同類(lèi)型的操作命令和操作數(shù),具有不同的組合表現(xiàn)形式。

指令集(IA:InstructionSet)是指CPU指令系統(tǒng)所能識(shí)別(翻譯)執(zhí)行的全部指令的集合。處理器要完成計(jì)算任務(wù),需要具備以下幾種指令類(lèi)型

(1)運(yùn)算指令

運(yùn)算由運(yùn)算器單元(ALU)實(shí)現(xiàn),指令包括算術(shù)運(yùn)算指令、邏輯運(yùn)算指令和移位指令。

算術(shù)運(yùn)算指令實(shí)現(xiàn)加減乘除(+-*/)等基本的算術(shù)運(yùn)算;邏輯運(yùn)算指令實(shí)現(xiàn)與或非(&|~)等基本的邏輯運(yùn)算;移位指令實(shí)現(xiàn)二進(jìn)制比特位(bit)的左右移(<<>>)運(yùn)算。

(2)控制指令

除了做計(jì)算外,CPU還要實(shí)現(xiàn)循環(huán)。循環(huán)是由跳轉(zhuǎn)指令實(shí)現(xiàn)的,跳回去執(zhí)行就是循環(huán)。循環(huán)在一定條件下跳出,否則就成死循環(huán)了,條件跳轉(zhuǎn)指令能完成這個(gè)功能。條件跳轉(zhuǎn)指令在一定條件下實(shí)現(xiàn)跳轉(zhuǎn),它能實(shí)現(xiàn)分支功能。跳轉(zhuǎn)指令也稱(chēng)為控制指令。控制由CPU控制器單元實(shí)現(xiàn)。

(3)數(shù)據(jù)傳送指令

運(yùn)算和控制指令的操作數(shù)從哪里來(lái)的呢?操作數(shù)都放在存儲(chǔ)器中。在x86 IA中,運(yùn)算指令的操作數(shù)既可以是寄存器,也可以是存儲(chǔ)器;而在其他RISCIA例如MIPS中,運(yùn)算指令的操作數(shù)只能是寄存器,因此需要先使用加載(load)指令將存儲(chǔ)器中的數(shù)據(jù)導(dǎo)入到寄存器中,運(yùn)算完成后,再用存儲(chǔ)(store)指令將寄存器中的運(yùn)算結(jié)果數(shù)據(jù)導(dǎo)出到存儲(chǔ)器中。這類(lèi)指令就是數(shù)據(jù)傳送指令

有了這三類(lèi)指令,CPU就能完成各種復(fù)雜的運(yùn)算。

2.3 CISC和RISC

處理器的指令集可簡(jiǎn)單分為兩種:復(fù)雜指令集(CISC,Complex InstructionSet Computer)和精簡(jiǎn)指令集(RISC,Reduced Instruction Set Computer)。

(1)指令集的演進(jìn)

一開(kāi)始的處理器都是CISC架構(gòu),隨著時(shí)間的演進(jìn),有越來(lái)越多的指令集加入。采用復(fù)雜指令系統(tǒng)的計(jì)算機(jī)有著較強(qiáng)的處理高級(jí)語(yǔ)言的能力,這對(duì)提高計(jì)算機(jī)的性能是有益的。當(dāng)計(jì)算機(jī)的設(shè)計(jì)沿著這條道路發(fā)展時(shí),有些人沒(méi)有隨波逐流,他們回過(guò)頭去看一看過(guò)去走過(guò)的道路,開(kāi)始懷疑這種傳統(tǒng)的做法:IBM公司設(shè)在紐約Yorktown的JhomasI.Wason研究中心于1975年組織力量研究指令系統(tǒng)的合理性問(wèn)題。因?yàn)楫?dāng)時(shí)已感到,日趨龐雜的指令系統(tǒng)不但不易實(shí)現(xiàn),而且還可能降低系統(tǒng)性能。

1979年以帕特遜教授為首的一批科學(xué)家也開(kāi)始在美國(guó)加冊(cè)大學(xué)伯克萊分校開(kāi)展這一研究,結(jié)果表明,CISC存在許多缺點(diǎn)。首先,在這種體系架構(gòu)中,各種指令的使用頻率相差懸殊:一個(gè)典型程序的運(yùn)算過(guò)程所使用的80%指令只占一個(gè)處理器指令系統(tǒng)的20%,剩余80%的指令則只占整個(gè)程序的20%。事實(shí)上最頻繁使用的指令是取、存和加這些最簡(jiǎn)單的指令。于是帕特遜教授提出了精簡(jiǎn)指令集的理念,主張指令系統(tǒng)應(yīng)當(dāng)只包含那些使用頻率很高的少量指令較為復(fù)雜的指令則利用常用的簡(jiǎn)單指令去組合。按照這個(gè)原則發(fā)展而成的計(jì)算機(jī)被稱(chēng)為精簡(jiǎn)指令集計(jì)算機(jī)(Reduced Instruction Set Computer)結(jié)構(gòu),簡(jiǎn)稱(chēng)RISC。

設(shè)計(jì)理念上,RISC的設(shè)計(jì)重點(diǎn)在于降低由硬件執(zhí)行指令的復(fù)雜度,因?yàn)檐浖扔布菀滋峁└蟮撵`活性和更高的智能,因此RISC設(shè)計(jì)對(duì)編譯器有更高的要求;CISC的設(shè)計(jì)則更側(cè)重于硬件執(zhí)行指令的功能,使CISC的指令變得很復(fù)雜。總之RISC對(duì)編譯器的要求高,CISC強(qiáng)調(diào)硬件的復(fù)雜性,CPU的實(shí)現(xiàn)更復(fù)雜。CISC提供了很多微碼支持,使得匯編程序的工作量減少,而RISC完成同樣的操作則需要更多的指令。

(2)RISC與CISC的比較

<1>指令集——RISC處理器減少指令集的種類(lèi),只提供固定長(zhǎng)度的簡(jiǎn)單指令,大多都在四五個(gè)周期內(nèi)完成,通常一個(gè)周期執(zhí)行一條指令。

<2>寄存器——RISC的寄存器擁有更多的通用寄存器,寄存器操作較多,例如MIPS提供了32個(gè)通用寄存器,ARM提供了27個(gè)通用寄存器,CISC的寄存器都是用于特定目的的。

<3>內(nèi)存訪問(wèn)——處理器只處理寄存器中的數(shù)據(jù),運(yùn)算指令的操作數(shù)只能是寄存器。這是因?yàn)樵L問(wèn)存儲(chǔ)器很耗時(shí),同時(shí)對(duì)外部存儲(chǔ)器的讀寫(xiě)會(huì)影響其壽命;CISC能夠在存儲(chǔ)器中直接運(yùn)行。對(duì)內(nèi)存變量的直接訪存不利于流水線實(shí)現(xiàn),因此RISC沒(méi)有實(shí)現(xiàn)可以操作內(nèi)存變量的指令。RISC內(nèi)存引用總是通過(guò)load指令將內(nèi)存變量加載到寄存器,通過(guò)store指令將寄存器中的值寫(xiě)回到內(nèi)存,大型寄存器堆使得這不會(huì)成為一個(gè)大問(wèn)題。

<4>簡(jiǎn)化的尋址方式——RISC不像CISC那樣的復(fù)雜眾多的尋址方式。例如MIPS只有一種數(shù)據(jù)尋址模式,幾乎所有的加載和存儲(chǔ)的內(nèi)存地址都是通過(guò)單個(gè)基址寄存器的值加上一個(gè)16位的有符號(hào)偏移量來(lái)選擇。

<5>高效的流水線特性——流水線的本質(zhì)就是CPU并行運(yùn)行,只是并行運(yùn)行不像FPGA中的那么直接,它只是把一條指令分成幾個(gè)更小的執(zhí)行單元;CISC指令的執(zhí)行需要調(diào)用一個(gè)微碼,明顯沒(méi)有RISC的指令吞吐量大。

固定的指令長(zhǎng)度、大型寄存器堆和load/store結(jié)構(gòu)可充分發(fā)揮流水線特性。在并行處理方面RISC明顯優(yōu)于CISC,RISC可同時(shí)執(zhí)行多條指令,它可將一條指令分割成若干個(gè)進(jìn)程或線程,交由多個(gè)處理器同時(shí)執(zhí)行。由于RISC執(zhí)行的是精簡(jiǎn)指令集,所以它的制造工藝簡(jiǎn)單且成本低廉。

<6>子程序調(diào)用——在CISC中,程序調(diào)用返回時(shí)需要將上下文保存到堆棧中,push/pop指令需要訪問(wèn)內(nèi)存操作;而RISC沒(méi)有提供push/pop支持,將它們存放在寄存器中,而且參數(shù)也是用寄存器傳遞。RISC中斷可視為特殊的子程序調(diào)用:CISC發(fā)生中斷時(shí),所有的寄存器內(nèi)容都被壓入堆棧中,而RISC對(duì)中斷進(jìn)行區(qū)分對(duì)待,分為輕量級(jí)重量級(jí)。對(duì)于輕量級(jí)中斷只保存需要保存的寄存器內(nèi)容;對(duì)于重量級(jí)中斷的處理如同常規(guī)中斷。

<7>RISC的缺點(diǎn)——代碼密度不高,可執(zhí)行文件體積較大,匯編代碼可讀性差。代碼密度不高是值得關(guān)注的問(wèn)題:若不使用cache,會(huì)需要更大的指令存儲(chǔ)控件,取指時(shí)也占用更大的內(nèi)存帶寬;若采用cache,又會(huì)降低cache的命中率。而從CPU的設(shè)計(jì)上來(lái)講,由于RISC的核心代碼要少很多,使得其結(jié)構(gòu)相應(yīng)簡(jiǎn)化,因此在體積、造價(jià)、功耗、散熱和價(jià)格上都具有優(yōu)勢(shì)。

<8>CISCRISC的融合演進(jìn)

從以上的比較來(lái)看,RISC與CISC各有千秋,由于RISC具有更強(qiáng)的實(shí)用性,故應(yīng)該是未來(lái)處理器的發(fā)展方向。但事實(shí)上,當(dāng)今時(shí)代wintel一統(tǒng)江湖,且早期很多軟件都是根據(jù)CISC設(shè)計(jì)的,單純的RISC將無(wú)法兼容。此外,現(xiàn)代CISC結(jié)構(gòu)的CPU已經(jīng)融合了很多RISC的成分,其性能差距已經(jīng)越來(lái)越小。復(fù)雜指令可以提供更多的功能,這是程序設(shè)計(jì)所需要的。例如ARM提供了DSP& SIMD擴(kuò)展:增強(qiáng)型DSP指令(E變種)和媒體功能擴(kuò)展(SIMD變種)。因此,CISC與RISC的融合應(yīng)該是未來(lái)的發(fā)展方向。

(3)指令集的五朵金花

處理器公司很多,品牌也很多,而指令集則相對(duì)穩(wěn)定,用指令集對(duì)處理器公司分類(lèi)是比較常見(jiàn)的做法。有5種指令集最為常見(jiàn),它們構(gòu)成了處理器領(lǐng)域的5朵金花。

<1>x86——碩大的大象

Intel x86是經(jīng)典的CISC體系結(jié)構(gòu),它是史上最賺錢(qián)的指令集,幾乎所有的個(gè)人計(jì)算機(jī)都使用Intel x86指令集的處理器。

英特爾的鐘擺策略:在奇數(shù)年,英特爾將會(huì)推出新的工藝;而在偶數(shù)年,英特爾則會(huì)推出新的架構(gòu)。簡(jiǎn)單的說(shuō),就是奇數(shù)工藝年和偶數(shù)架構(gòu)年的概念。鐘擺策略能夠體現(xiàn)英特爾技術(shù)變化方向。當(dāng)有英特爾鐘擺往左擺的時(shí)候,tick這個(gè)策略會(huì)更新工藝;往右擺的時(shí)候,tock會(huì)更新處理器微架構(gòu)。

<2>ARM——穩(wěn)扎穩(wěn)打的蟻群

如果要問(wèn)哪個(gè)指令集的處理器銷(xiāo)量最大,很多人會(huì)認(rèn)為是Intel,不過(guò)一家來(lái)自英國(guó)的公司讓我們大跌眼鏡,這家公司就是ARM公司。

在智能手機(jī)領(lǐng)域,ARM(Acorn?RISCMachine)獨(dú)領(lǐng)風(fēng)騷,占據(jù)了手機(jī)市場(chǎng)90%以上的份額。當(dāng)今手機(jī)上的應(yīng)用處理器,不管是高通還是TI的,東芝還是三星的,在內(nèi)部都采用了ARM內(nèi)核。

ARM11之后的處理器家族改稱(chēng)為Cortex,并針對(duì)高、中、低階劃分為A、R、M三大系列處理器。高階智能手機(jī)普遍采用Coretex-A系列,例如蘋(píng)果iPhone 4、4s和5所采用的A4/A5/A6處理器,設(shè)計(jì)結(jié)構(gòu)分別是Cortex-A8/Cortex-A9/非標(biāo)準(zhǔn)ARM,都是基于指令集:ARMv7 (Cortex)。

<3>MIPS——優(yōu)雅的孔雀

如果要說(shuō)最經(jīng)典的RISC處理器,那么非MIPS莫屬,就連它的競(jìng)爭(zhēng)對(duì)手,也不得不承認(rèn)它的優(yōu)雅,它被作為處理器教科書(shū)的典范,很多其他的處理器,都能看到它的身影。

MIPS全稱(chēng)為Microprocessor without Interlocked Piped Stages,無(wú)內(nèi)部互鎖流水級(jí)的微處理器。中國(guó)科學(xué)院計(jì)算所自主研發(fā)的龍芯,采用類(lèi)似于MIPS的簡(jiǎn)單指令集。

<4>Power——昔日的貴族

最早提出RISC思想的是IBM公司,PowerPC是一種RISC多發(fā)射體系結(jié)構(gòu)。

1990年,IBM推出了高性能的POWER(Performance Optimized With Enhanced RISC)處理器。POWER性能卓越,一直以來(lái)都被用在IBM自己的服務(wù)器上。1997年與國(guó)際象棋大師卡斯帕羅夫交戰(zhàn)的深藍(lán)計(jì)算機(jī),使用POWER2處理器,2011年參加知識(shí)競(jìng)賽電視節(jié)目“Jeopardy!”挑戰(zhàn)人類(lèi)的Watson計(jì)算機(jī),使用的是POWER7處理器。

由于POWER的高性能,IBM想到可以將POWER用于PC領(lǐng)域,因此IBM向Apple拋了橄欖枝,Apple當(dāng)然求之不得。Apple一直都使用Motorola的處理器,因此Apple又把Motorola拉下了水。這3家公司一拍即合,富有傳奇色彩的三大巨頭,同時(shí)又是在PC時(shí)代只能賺吆喝的3個(gè)難兄難弟終于結(jié)拜在了一起,于1991年成立了AIM聯(lián)盟(AIM為Apple、IBM、Motorola的3個(gè)首字母)。AIM對(duì)POWER處理器進(jìn)行了修改,于是就形成了PowerPC,PC是Performance Computing的縮寫(xiě)。

Apple公司的Macintosh過(guò)去十幾年來(lái)用的是IBM研發(fā)的PowerPC處理器,但是蘋(píng)果于2005年6月宣布終止與IBM和摩托羅拉長(zhǎng)期合作關(guān)系,放棄PowerPC支持 全面Intel化。蘋(píng)果CEO史蒂夫·喬布斯(Steve Jobs)指出,轉(zhuǎn)換芯片架構(gòu)是因?yàn)橛⑻貭柼峁└鼉?yōu)越的產(chǎn)品藍(lán)圖。

<5>C6000——偏安一隅的獨(dú)立王國(guó)

以上介紹的這些處理器,都是較通用的處理器,還有一種較專(zhuān)業(yè)的處理器,它的名字叫DSP(Digital SignalProcessor,數(shù)字信號(hào)處理器),專(zhuān)業(yè)做信號(hào)處理運(yùn)算的。

這幾年,全球的無(wú)線通信網(wǎng)絡(luò)建設(shè)如火如荼,視頻網(wǎng)站、視頻通信系統(tǒng)也如雨后春筍般涌現(xiàn)出來(lái),在這些產(chǎn)品或服務(wù)的背后,一個(gè)是無(wú)線通信技術(shù),一個(gè)是音視頻技術(shù),這二者的共同點(diǎn)在于:它們都需要大量的信號(hào)處理運(yùn)算,而這正是DSP的強(qiáng)項(xiàng)。

20世紀(jì)80年代初,Motorola和TI(德州儀器)都推出了自己的手機(jī)DSP芯片,Motorola要強(qiáng)于TI,但由于Motorola的芯片只給自己的手機(jī)用,諾基亞、愛(ài)立信等公司選擇了TI,從此成就了TI。

現(xiàn)在的DSP芯片主要由TI、Freescale、LSI等公司推出,TI DSP一家獨(dú)大,占據(jù)絕大部分市場(chǎng)份額。TI也是半導(dǎo)體領(lǐng)域的先驅(qū)之一,第一塊集成電路的發(fā)明人、諾貝爾獎(jiǎng)得主Jack Kilby就來(lái)自于TI。

C6000系列DSP是TI的高端DSP,C62/C64/C64+是定點(diǎn)DSP內(nèi)核,C67是浮點(diǎn)DSP內(nèi)核,C66是定點(diǎn)/浮點(diǎn)融合的內(nèi)核。

與C6000直接競(jìng)爭(zhēng)的,是Starcore體系結(jié)構(gòu),最早由Infineon、Agere、Motorola的合資公司設(shè)計(jì),公司經(jīng)過(guò)多年的分與合之后,目前這個(gè)體系結(jié)構(gòu)的DSP由Freescale和LSI推出。

3?指令的執(zhí)行

3.1?通用寄存器

指令的語(yǔ)義主要是完成一定的功能操作,其操作對(duì)象就是操作數(shù)。在進(jìn)行運(yùn)算之前,數(shù)據(jù)必須就位,那么操作數(shù)放在哪里呢?

CPU內(nèi)部有很多通用寄存器(General Purpose Register),這些寄存器用來(lái)存儲(chǔ)指令的操作數(shù),它對(duì)程序員可見(jiàn)。例如x86有8個(gè)通用寄存器,MIPS有32個(gè)寄存器。這一堆寄存器也被叫做寄存器堆(Register File)。寄存器一般為SRAM,可將其看做CPU的緩存。

在硬件實(shí)現(xiàn)上,算術(shù)邏輯運(yùn)算單元ALU直接訪問(wèn)通用寄存器進(jìn)行計(jì)算。通用寄存器中的數(shù)據(jù)需要先讀到ALU輸入寄存器(ALU Input Register)中,ALU運(yùn)算結(jié)束后,數(shù)據(jù)會(huì)存儲(chǔ)在ALU輸出寄存器(ALU Output Register)中,最后再送回通用寄存器中。

在MIPS中,運(yùn)算指令的操作數(shù)只能是寄存器,因此在執(zhí)行運(yùn)算指令之前,調(diào)用數(shù)據(jù)傳送指令load將數(shù)據(jù)從內(nèi)存加載到通用寄存器中。在x86中一般使用mov指令進(jìn)行數(shù)據(jù)傳送。

3.2?指令執(zhí)行過(guò)程

指令的執(zhí)行過(guò)程按時(shí)間順序可分為以下幾個(gè)步驟:

(1)CPU發(fā)出指令地址。將指令指針寄存器(IP)的內(nèi)容——指令地址,經(jīng)地址總線送入存儲(chǔ)器的地址寄存器中。

(2)從地址寄存器中讀取指令。將讀出的指令暫存于存儲(chǔ)器的數(shù)據(jù)寄存器中。

(3)將指令送往指令寄存器。將指令從數(shù)據(jù)寄存器中取出,經(jīng)數(shù)據(jù)總線送入控制器的指令寄存器中。

(4)指令譯碼。指令寄存器中的操作碼部分送指令譯碼器,經(jīng)譯碼器分析產(chǎn)生相應(yīng)的操作控制信號(hào),送往各個(gè)執(zhí)行部件。

(5)按指令操作碼執(zhí)行。

(6)修改程序計(jì)數(shù)器的值,形成下一條要取指令的地址。若執(zhí)行的是非轉(zhuǎn)移指令,即順序執(zhí)行,則指令指針寄存器的內(nèi)容加1,形成下一條要取指令的地址。指令指針寄存器也稱(chēng)為程序計(jì)數(shù)器(PC)。

4?流水線作業(yè)

4.1?流水線的概念

關(guān)于流水線,生活中到處可見(jiàn),工廠的生產(chǎn)流水線和食堂的打飯流水線都是流水線的經(jīng)典范例。在《MIPS體系結(jié)構(gòu)透視》中借用食堂打飯流水線的例子很好的闡述了流水線的概念。

所謂流水線(pipeline),就是將那些重復(fù)性的工作分解成幾個(gè)串行的部分,使得工作能在工人中間移動(dòng)。每個(gè)熟練工人只需要依次將他們熟悉的那部分工作做好即可。雖然每個(gè)顧客等待服務(wù)的總時(shí)間有所增加,但是卻有四個(gè)顧客能同時(shí)接受服務(wù),這樣在午餐高峰期能夠接待的顧客數(shù)量增加了三倍。

假如Evie的小賣(mài)部新增了一種炸雞腿,交由Bert負(fù)責(zé)派發(fā),這樣Bert在給顧客派發(fā)炸土豆時(shí)還得派發(fā)炸雞腿。此時(shí),Bert這一環(huán)節(jié)相比以前耗時(shí)增加,導(dǎo)致流水線效率下降。如是,Evie再請(qǐng)了一個(gè)朋友加入食物派發(fā)流水線,專(zhuān)門(mén)負(fù)責(zé)派發(fā)雞腿。我們說(shuō)Evie店的流水線從四步(step)增加到了五步,流水線的級(jí)數(shù)(深度)增加了一級(jí),相應(yīng)增加了人力成本。

4.2 CPU指令執(zhí)行流水線

如果將程序看成是內(nèi)存中存儲(chǔ)的一些指令的話,一個(gè)即將運(yùn)行的程序看起來(lái)和排著隊(duì)等待接受服務(wù)的顧客沒(méi)什么相似之處。但是,在CPU看來(lái),情況就不一樣了。CPU從內(nèi)存中提取每條指令,進(jìn)行譯碼,找到所需要的操作數(shù),執(zhí)行相應(yīng)操作,并存儲(chǔ)運(yùn)算產(chǎn)生的結(jié)果——然后又從頭開(kāi)始重復(fù)同樣的工作。這樣等待執(zhí)行的程序就是一個(gè)指令的序列,該隊(duì)列中一次只有一條指令經(jīng)過(guò)CPU。

由于每條指令要做不同的工作,因此在CPU內(nèi)部已經(jīng)配有各種不同的專(zhuān)用的大塊邏輯電路(每一流水階段都有獨(dú)立的邏輯電路來(lái)處理),所以構(gòu)造一個(gè)流水線并沒(méi)有使CPU復(fù)雜度增加多少,只是讓CPU工作得更努力一些而已。

采用流水線技術(shù)后,并沒(méi)有加速單條指令的執(zhí)行,每條指令的操作步驟一個(gè)也不能少,只是多條指令的不同操作步驟同時(shí)執(zhí)行,因而從總體上看加快了指令流速度,縮短了程序執(zhí)行時(shí)間。

為了進(jìn)一步滿足普通流水線設(shè)計(jì)所不能適應(yīng)的更高時(shí)鐘頻率的要求,高檔次處理器中的流水線的深度(級(jí)數(shù))在逐代增多。當(dāng)流水線深度在5~6級(jí)以上時(shí),通常稱(chēng)為超流水線結(jié)構(gòu)(SuperPipeline)。顯然,流水線級(jí)數(shù)越多,每級(jí)所花的時(shí)間越短,時(shí)鐘周期就可以設(shè)計(jì)的越短,指令速度越快,指令平均執(zhí)行時(shí)間也就越短,但是相應(yīng)設(shè)計(jì)成本也會(huì)增加。

在TI C6000 DSP中,所有指令的執(zhí)行大概分為Fetch(取指)、Decode(譯碼)、Execute(執(zhí)行)三個(gè)大的步驟,每個(gè)大的步驟又可以細(xì)分為一些小的步驟,實(shí)現(xiàn)了更深的流水線。

4.3 MIPS經(jīng)典五級(jí)流水線

(1)MIPS的五級(jí)流水線

MIPS體系架構(gòu)依據(jù)流水線結(jié)構(gòu)設(shè)計(jì)。只要CPU從緩存中獲取數(shù)據(jù),那么執(zhí)行每條MIPS指令就被分成五個(gè)流水階段,并且每個(gè)階段占用固定的時(shí)間,通常是只耗費(fèi)一個(gè)處理器時(shí)鐘周期。RD/WB操作只占用半個(gè)時(shí)鐘周期,故MIPS五段流水線只占用四個(gè)時(shí)鐘周期。

MIPS處理器在設(shè)計(jì)時(shí),將處理器的執(zhí)行階段劃分為以下五個(gè)階段:

<1>?IF:Instruction Fetch,取指。從指令緩存(I-Cache)中獲取下一條指令。

<2>?ID(RD):InstructionDecode(Read Register),譯碼(讀寄存器)。翻譯指令,識(shí)別操作碼和操作數(shù),從寄存器堆中讀取數(shù)據(jù)到ALU輸入寄存器。

<3>?EX(ALU):Execute,執(zhí)行(算術(shù)/邏輯運(yùn)算)。在一個(gè)時(shí)鐘周期內(nèi),完成算術(shù)或邏輯操作。注意,浮點(diǎn)算術(shù)運(yùn)算和整數(shù)乘除運(yùn)算不能在一個(gè)時(shí)鐘周期內(nèi)完成。

<4>?MEM:Memory Access,內(nèi)存數(shù)據(jù)讀或者寫(xiě)。在該階段,指令可以從數(shù)據(jù)緩存(D-Cache)中讀/寫(xiě)內(nèi)存變量。平均來(lái)說(shuō),大約四分之三的指令在這一階段沒(méi)有執(zhí)行任何操作,為每條指令分配這個(gè)階段是為了保證同一時(shí)刻不會(huì)有兩條指令都訪問(wèn)數(shù)據(jù)緩存。

<5>?WB:Write Back,寫(xiě)回。操作完成后,將計(jì)算結(jié)果從ALU輸出寄存器寫(xiě)回到通用寄存器中。

對(duì)于運(yùn)算指令,在MEM階段空閑。對(duì)于load指令,在EX階段計(jì)算要訪問(wèn)的地址,在MEM階段從內(nèi)存中將數(shù)據(jù)讀入到MEMregister(MEM和WB之間的流水線寄存器)中,在WB階段,將MEM register的數(shù)據(jù)寫(xiě)回到Register File中。對(duì)于store指令,在EX階段計(jì)算要訪問(wèn)的地址,在MEM階段將寄存器中的數(shù)據(jù)寫(xiě)回到存儲(chǔ)器中。

(2)流水線和緩存

高效的流水線操作要求每個(gè)階段占用相同的時(shí)間。高效的流水線還依賴于高速緩存(Cache),可以將內(nèi)存訪問(wèn)速度提高50倍左右。當(dāng)CPU需要數(shù)據(jù)時(shí),首先在緩存中查找,如果該數(shù)據(jù)在緩存中則命中,那么緩存很快就把數(shù)據(jù)返回給CPU。由于無(wú)法猜測(cè)CPU將使用什么數(shù)據(jù),故緩存僅存儲(chǔ)最近一段時(shí)間內(nèi)CPU從主內(nèi)存中獲取的數(shù)據(jù)副本。如果緩存缺失(沒(méi)有命中),則需要重填(Invalidate and Refill)。

x86的寄存器個(gè)數(shù)很少,所以同樣的程序編譯給x86會(huì)比MIPS使用多得多的數(shù)據(jù)存取操作。當(dāng)然,x86使用堆棧來(lái)代替寄存器給這些額外存取使用,這些堆棧位置將是內(nèi)存中使用非常頻繁的區(qū)域,對(duì)應(yīng)高速緩存的使用效率非常高。

MIPS體系架構(gòu)設(shè)計(jì)時(shí)采用了獨(dú)立的指令緩存和數(shù)據(jù)緩存,這樣CPU就可以同時(shí)獲取指令和讀寫(xiě)內(nèi)存變量。

(3)嚴(yán)格流水線的限制

RISC(Reduced Instruction Set Computing,精簡(jiǎn)指令集)相對(duì)CISC(Complex Instruction Set Computing,復(fù)雜指令集)對(duì)指令集作了巧妙和有效的規(guī)定,從而使得流水線可以高效和成功的實(shí)現(xiàn)。所有的MIPS指令都經(jīng)過(guò)嚴(yán)格的定義,以遵循同樣的流水線階段順序,即使這些指令在某個(gè)流水線階段什么也不做。于是最終結(jié)果是:只要CPU保持從緩存中命中(hit)數(shù)據(jù),就能在每個(gè)時(shí)鐘周期開(kāi)始一條指令。

流水線的嚴(yán)格要求限制了指令的某些操作能力。

首先,要求所有的指令一樣長(zhǎng)(剛好是一個(gè)機(jī)器字長(zhǎng)32位),這樣的指令可以在固定時(shí)間被讀取。定長(zhǎng)指令的要求限制了操作的復(fù)雜程度。比如,在指令中沒(méi)有足夠的位空間對(duì)真正復(fù)雜的尋址模式進(jìn)行編碼。定長(zhǎng)指令直接導(dǎo)致的一個(gè)問(wèn)題就是,一個(gè)典型的程序在支持變長(zhǎng)指令的x86體系架構(gòu)上,編譯后其指令平均長(zhǎng)度只有3個(gè)字節(jié),在MIPS代碼中則全部是4個(gè)字節(jié),從而占用了更多的內(nèi)存空間。通常MIPS二進(jìn)制文件要比680x0或80x86二進(jìn)制文件大20%~30%。

第二,MIPS中的指令操作必須符合流水線特性。指令操作只有在正確的流水線階段才能夠執(zhí)行,并且必須在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行完畢。比如,寄存器寫(xiě)回階段只允許一個(gè)值存儲(chǔ)到寄存器堆,因此這些MIPS指令只能修改一個(gè)寄存器的值。出棧操作需要將兩個(gè)值(棧中的數(shù)據(jù)以及遞增的棧指針值)寫(xiě)回到寄存器中,因此它不適合流水線。所以,MIPS沒(méi)有提供對(duì)棧操作的硬件支持,沒(méi)有x86那樣的push/pop指令。

第三,流水線的設(shè)計(jì)規(guī)則沒(méi)有實(shí)現(xiàn)可以操作內(nèi)存變量的指令。緩存或者內(nèi)存的數(shù)據(jù)只有在流水線的第四階段才能夠獲得。對(duì)于ALU而言,這些數(shù)據(jù)來(lái)得太遲了。內(nèi)存訪問(wèn)僅通過(guò)簡(jiǎn)單的load/store指令來(lái)將數(shù)據(jù)導(dǎo)入或?qū)С黾拇嫫鳌?/p>


參考:

《各種通訊總線介紹》

《大話處理器》

《MIPS體系結(jié)構(gòu)透視》


《MIPS體系結(jié)構(gòu)》

《MIPS體系結(jié)構(gòu)的特點(diǎn)》

《ARM 與 MIPS 比較》


《RISC與CISC比較》

《CISC與RISC之比較》

《CISC與RISC的區(qū)別》

《逃離x86架構(gòu)——CPU體系結(jié)構(gòu)CISC與RISC之爭(zhēng)》

《完全看透ARM處理器:RISC與CISC是什么?歷史、架構(gòu)一次看透》


《現(xiàn)代處理機(jī)設(shè)計(jì)技術(shù)》

《基于DLX體系結(jié)構(gòu)的微處理器核的設(shè)計(jì)與實(shí)現(xiàn)》

《Baring ItAll to Software: Raw Machines》

總結(jié)

以上是生活随笔為你收集整理的指令集及流水线基本概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。