最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

【轉】 MIPS架構深入理解1-MIPS和RISC架構體系介紹

2023-08-03 02:29 作者:小林家的垃圾王R  | 我要投稿

以RISC的角度來看其實老所長的眼光是沒問題的,相比ALPHA,MIPS效率更高血統(tǒng)更純正,可惜結果來看這個結局相比申威選擇ALPHA可能不太好

?MIPS架構深入理解1-MIPS和RISC架構體系介紹

發(fā)布于?2022-08-15 16:12:40

3.5K0

舉報

眾多RISC精簡指令集架構中,MIPS架構是最優(yōu)雅的”舞者”。就連它的競爭者也為其強大的影響力所折服。DEC公司的Alpha指令集(現(xiàn)在已被放棄)和HP的Precision都受其影響。雖說,優(yōu)雅不足以讓其在殘酷的市場中固若金湯,但是,MIPS架構還是以最簡單的設計成為每一代CPU架構中,執(zhí)行效率最快的那一個。

作為一個從學術項目孵化而來的成果,簡單的架構是MIPS架構商業(yè)化的需要。它擁有一個小的設計團隊,制造和商業(yè)推廣交給它的半導體合作伙伴們。結果就是,在半導體行業(yè)領域中,它擁有廣泛的合作制造商:LSI邏輯、LSI、東芝、飛利浦、NEC和IDT等都是它的合作伙伴。值得一提的是,國內的龍芯買斷了它的指令集架構,成為芯片國產化的佼佼者。

在低端CPU領域,MIPS架構曇花一現(xiàn)。目前主要應用于嵌入式行業(yè),比如路由器領域,幾乎占據(jù)了大部分的市場。

MIPS架構的CPU是RISC精簡指令CPU中的一種,誕生于RISC學術研究最為活躍的時期。RISC(精簡指令集計算機)這個縮略語是1986年-1989年之間誕生的所有新CPU架構的一個標簽TAG,它為新誕生的這些高性能架構提供了想法上的創(chuàng)新。有人形象的說,”RISC是1984年之后誕生的所有計算機架構的基礎”。雖說,略顯夸張,但也是無可爭議的事實,誰也無法忽略RISC精簡指令集的那些先驅們所做的貢獻。

MIPS領域最無法忽視的貢獻者是Stanford大學的MIPS項目。之所以命名成MIPS,即可以代表microcomputer without interlocked pipeline stages-無互鎖流水線的微處理器的英文意思,又可以代表millions of instructions per second每秒執(zhí)行百萬指令的意思,真是一語雙關??雌饋?,MIPS架構主要研究方向還是CPU的流水線架構,讓它如何更高效地工作。那接下來,我們就從流水線開始講起。

流水線的互鎖是影響CPU指令執(zhí)行效率的關鍵因素之一。

1.1 流水線

假設有一家餐館,我們稱之為Evie的炸魚薯條店。在其中,每一名顧客排隊取餐(炸鱈魚、炸薯片、豌豆糊、一杯茶)。店員裝好盤子后,顧客找桌子坐下來就餐。這是,我們常見的餐館就餐方式。

Evie的薯條是當?shù)刈詈玫男〕?。所以,每當趕大集的時候,長長的隊伍都要延伸到店外。所以,當隔壁的木屐店關門的時候,Evie盤下來,擴大了店面,增加了桌子。但是,這還是于事無補。因為忙碌的市民根本沒空坐下來喝杯茶。(因為Evie還沒有找到排長隊的根本原因,......)

Evie炸鱈魚和Bert的薯條是店里的招牌,來的顧客都會點這兩樣。但是他們只有一個柜臺,所以,當有一名顧客執(zhí)行點一杯茶的時候,而恰好他又在點鱈魚和薯條的顧客后面,那他只能等待了.....。終于有一天,Evie想起了一個絕妙的主意:他們把柜臺延長,Evie、Bert、Dionysus和Mary四名店員一字排開;每當顧客進來,Evie負責鱈魚裝盤,Bert添加薯條,Dionysus盛豌豆糊,Mary倒茶并結賬。這樣,一次可以有四名顧客同時被服務,多么天才的想法啊。

再也沒有長長的排隊人群,Evie的店收入增加了......。

這就是流水線,將重復的工作分成若干份,每個人負責其中一份。雖然每名顧客總的服務時間延長,但是,同時有四名顧客被服務,提高了整個取餐付賬的效率。下圖1-1就是Evie店里的流水線結構圖。

那么,我們將CPU執(zhí)行一條指令分解成取指令、解碼、查找操作數(shù)、執(zhí)行運算、存儲結果五步操作的話,是不是跟上面Evie的店里的流水線就極其類似了呢。本質上講,等待執(zhí)行的程序就是一個個指令的隊列,等待CPU一個個執(zhí)行。

流水線當然不是RSIC指令集的新發(fā)明,CSIC復雜指令集也采用流水線的設計。差異就是,RSIC重新設計指令集,使流水線更有效率。那到底什么是制約流水線效率的關鍵因素呢?

1.1.1 制約流水線效率的因素

我們都知道那個著名的”木桶效應”:決定木桶的裝水量的是最短的那個木頭,而不是最長的。同樣的,如果我們保證指令執(zhí)行的每一步都占用相同時間的話,那么這個流水線將是一個完美的高效流水線。但現(xiàn)實往往是殘酷的,CPU的工作頻率遠遠大于讀寫內存的工作頻率(都不是一個量級)。

讓我們回到Evie的店中。顧客Cyril是一個窮人,經常缺錢,所以在Mary沒有收到他的錢之前,Evie就不會為他服務。那么,現(xiàn)在Cyril就卡在Evie的位置處,知道Mary處理完前面三名顧客,再給他結完賬,Evie才會繼續(xù)為他服務。所以,在這個取餐的流水線上,Cyril就是一個麻煩制造者,因為他需要一個他人正在使用資源(Mary結賬)。(這種情況可以對應CPU存儲指令使用鎖總線的方式保證對內存的獨占訪問。)

有時候,Daphne和Lola分別買一部分食物,然后彼此之間共享。比如說,Lola買不買薯條,取決于Daphne是否購買一杯茶。因為光吃薯條不喝點飲料的話,也許Daphne會噎著或者齁著。那么,Lola就會在售賣員Bert處著急等待Daphne在Mary處買一杯茶,這中間就發(fā)生了時間上的空隙,我們將其稱為流水線上的間隙。(這是不是很像條件分支?)

當然了,不是所有的依賴關系都是壞的結果。假設有一名顧客Frank,總是模仿Fred點餐,也許Frank是Fred的粉絲呢。這其實蘊涵著通過Cache命中提高存取內存和分支預測工作效率的基礎。

你當然在想,把這些麻煩的顧客剔除出去,不就是一個效率超高的流水線嗎?但是,Evie還要在這兒生活,怎么可能得罪顧客呢。計算機處理器的行業(yè)大佬Intel現(xiàn)在也面臨著這樣的問題:不可能不兼容以前的軟件,完全另起爐灶搞一個新的架構的話,可能會流失很多客戶。于是,只能在舊的架構上縫縫補補又十年啊。這也給了RSIC指令集發(fā)展的大好機會。

1.1.2 流水線和Cache

計算機CPU處理速度和內存讀取速度的匹配問題是提高CPU工作效率的關鍵,也就是”木桶效應”的那個短板。So,為了加速對內存的訪問,CPU設計中引入了Cache。所謂的Cache,就是一個小的高速內存,用來拷貝內存中的一段數(shù)據(jù)。Cache中的最小數(shù)據(jù)單元是line,每個line對應一小段內存地址(常見的line大小為64字節(jié))。每個Line不僅包含從主內存讀取的數(shù)據(jù),還包括其地址信息(TAG)和狀態(tài)信息。當CPU想要訪問內存中的數(shù)據(jù)時,先由內存管理單元搜索Cache,如果數(shù)據(jù)存在,則立即返回給CPU,這稱為Cache命中;如果不存在,則稱為Cache未命中,此時,內存管理單元再去主內存中查找相關數(shù)據(jù),返回給CPU并在Cache中留下備份。Cache當然不知道CPU下一步需要什么數(shù)據(jù),所以它只能保留CPU最近使用過的數(shù)據(jù)。如果需要為新拷貝的主內存數(shù)據(jù),它就會選擇合適的數(shù)據(jù)丟棄,這涉及到Cache替換策略算法。

Cache大約9成時間能夠提供CPU想要的數(shù)據(jù),所以大大提高了CPU讀取數(shù)據(jù)的速率,從而提高了流水線的工作效率。

因為指令不同于數(shù)據(jù),是只讀屬性,所以,MIPS架構采用哈弗結構,將數(shù)據(jù)Cache和指令Cache分開。這樣就可以同時讀取指令和讀寫變量了。

1.2 MIPS架構5級流水線

圖1.2: MIPS-5級流水線

MIPS本身就是基于流水線優(yōu)化設計的架構,所以,將MIPS指令分為5個階段,每個階段占用固定的時間,在此,固定的時間其實就是處理器的時鐘周期(有2個指令花費半個時鐘周期,所以,MIPS的5級流水線實際上占據(jù)4個時鐘周期)。

所有的指令都是嚴格遵守流水線的各個階段,即使某個階段什么也不做。這樣做的結果就是,只要Cache命中,每個時鐘周期CPU都會啟動一條指令。

讓我們看看每一個階段都做了什么:

  • 取指令-IF從I-Cache中取要執(zhí)行的指令。

  • 讀寄存器-RD取CPU寄存器中的值。

  • 算術、邏輯運算-ALU執(zhí)行算術或邏輯運算。(浮點運算和乘除運算在一個時鐘周期內無法完成,我們以后再寫文章專門講解FPU相關的知識)

  • 讀寫內存-MEM也就是讀寫D-Cache。至于這兒為什么說讀寫數(shù)據(jù)緩存,是因為內存的讀寫速度實在太慢了,無法滿足CPU的需要。所以出現(xiàn)了D-Cache這種高速緩存。但即便如此,在讀寫D-Cache期間,平均每4條指令就會有3條指令什么也做不了。但是,每條指令在這個階段都應該是獨占數(shù)據(jù)總線的,不然會造成訪問D-Cache沖突。這就是內存屏障和總線鎖存在的理由。

  • 寫回寄存器-Writeback將結果寫入寄存器。

當然,上面的流水線只是一個理論上的模型而已。但實際上,有一些MIPS架構的CPU會有更長的流水線或者其它的不同。但是,5級流水線架構確是這一切的出發(fā)點和基礎。

流水線的嚴格規(guī)定,限制了指令可以做的事情。

首先,所有的指令具有相同的長度(32位),讀取指令使用相同的時間。這降低了流水線的復雜度,比如,指令中沒有足夠的位用來編碼復雜的尋址模式。

這種限制當然也有不利:基于X86架構的程序,平均指令長度也只有大約3個字節(jié)多一點。所以,MIPS架構占用更多的內存空間。

第二,MIPS架構的流水線設計排除了對內存變量進行任何操作的指令的實現(xiàn)。內存數(shù)據(jù)的獲取只能在階段4,這對于算術邏輯單元有點延遲。內存訪問只能通過load或store指令進行。(MIPS架構的匯編也是最簡單易懂的代碼之一)

盡管有這些問題,但是MIPS架構的設計者也在思考,如何使CPU可以被編譯器更加簡單高效地優(yōu)化。一些編譯器高效優(yōu)化的要求和流水線的設計要求是兼容的,所以MIPS架構的CPU具有32個通用寄存器,使用具有三個操作數(shù)的算術/邏輯指令。那些復雜的特殊目的的指令也是編譯器不愿意產生的。通俗地講,編譯器能不用復雜指令就不用復雜指令。

1.3 RISC和CISC對比

我們如何區(qū)分RISC和CISC指令集定義上的區(qū)別。在我看來,RISC就是架構和指令集關系的描述。20世紀80年代中期,誕生了一批新的架構,在這些架構中,巧用指令集以最大化這些基于流水線實現(xiàn)的架構的效率。這些被巧用的指令集就被稱為精簡指令集,采用這些指令集的架構也就稱為精簡指令集計算機(RISC)?;赗SIC精簡指令集設計的CPU架構有SPARC、MIPS、PowerPC、HP Precision、DEC Alpha和ARM。

與此形成鮮明對比的是,CISC復雜指令集計算機與流水線的實現(xiàn)沒有多大關系。CISC的設計出發(fā)點主要是從代碼的易用性上考慮的。1985年之后的計算機架構,基本上都是基于RISC實現(xiàn)的。CISC主要是1985年之前的架構使用。比如英特爾公司的X86架構和摩托羅拉公司的680x系列。

總結來說,RISC和CISC的共同點都是對指令集的描述,但是RISC對于CPU的流水線架構的實現(xiàn)影響比較大,而CISC指令集對于架構的影響不大。雖然,現(xiàn)在的X86架構大量借鑒了RISC的一些實現(xiàn)技巧,用來提升自己的性能。但其本質上還是復雜指令集計算機(CISC)架構。

1.4 MIPS架構的發(fā)展

縱觀MIPS架構的近40年的發(fā)展歷程,雖經歷過輝煌,但現(xiàn)在也日漸式微。網上有許許多多關于MIPS架構的評論或者見解。筆者對于市場一竅不通,故不在此班門弄斧。但是我本人還是非常欣賞MIPS架構的設計理念:強調軟硬件協(xié)同提高性能,同時簡化硬件設計。

咱們在此提一下國內的龍芯公司,號稱”國產芯”。它由于直接買斷了MIPS指令集的授權,所以不受技術封鎖的影響。而且,MIPS指令集的授權和ARM指令集的授權有著本質上的不同:MIPS授權后,允許設計廠商自行對架構或者指令集進行自定義;但是ARM授權不允許廠商對其授權的架構進行自定義(當然了,近些年,ARM也已經授權了蘋果、高通等公司可以自行定義ARM授權的架構)。所以,龍芯選擇MIPS是技術上的選擇,也是時代的選擇。雖然,最近幾年RISC-V開源指令集非常火熱,但是其上的軟件生態(tài)同樣需要布局。而龍芯已經在MIPS架構上花費了20年的人力物力,也已經有了一些技術上的沉淀。完全掉頭轉向RISC-V開源指令集也是不太現(xiàn)實的。希望龍芯能夠在CPU領域繼續(xù)深耕,逐步完善生態(tài)系統(tǒng),實現(xiàn)真正的國產芯片自主化吧。

1.5 MIPS和CISC的對比

大部分的程序員對匯編語言的認知都來源于X86架構,畢竟是最早的CPU架構之一。但是,當你看見基于MIPS架構的匯編代碼時,你還是得到一些驚喜。我個人的感覺就是,基于MIPS架構的匯編語言理解起來還是比較容易的,畢竟它是精簡指令集。但是,它又有一些程序代碼設計上的奇技淫巧,需要我們額外理解。我們將通過以下幾個方面進行歸納總結:

  1. 為了提高流水線的效率而對MIPS指令操作所施加的限制;

  2. 極度簡單的load/store操作;

  3. 有意省略的一些操作;

  4. 指令集的一些預想不到的特性;

  5. 流水線操作中對程序員可見的那些點。

最初提出MIPS設想的斯坦福大學的研究小組,特別關注能夠實現(xiàn)的簡短的流水線架構。后來的事實也證明,他們的判斷是完全正確的,由流水線而引申出的許多設計決定被證明,能夠更容易、更快速地實現(xiàn)更高的性能。

1.5.1 MIPS指令集的限制

  • 所有的指令都是32位長度: 這意味著沒有指令僅占用2個或3個字節(jié)的內存空間(也就是說,通常情況下,MIPS架構的二進制文件比X86架構大百分之二十或三十),也沒有指令超過4個字節(jié)。 這樣的結果就是,只通過一條指令無法操作32位常數(shù)。因為一個32位指令,沒有足夠的位為操作數(shù)和目標寄存器進行編碼。MIPS架構的設計者為兩條指令保留了26位,這兩條特殊的指令就是跳轉jump指令,一個跳轉到指定的目標地址,一個跳轉到子程序。其它的指令都只有16位留給常數(shù)。于是,加載任意一個32位的常數(shù),都需要2條指令才能實現(xiàn),條件分支被限制到64K的作用范圍。

  • 指令操作必須適合流水線: 指令的每一步操作都必須在流水線的正確階段執(zhí)行,且必須在一個時鐘周期內完成。比如,寄存器寫回操作只提供寫一個值到寄存器中,所以指令在這個階段只能改變某個寄存器的內容。 乘除指令無法在一個時鐘周期內完成。MIPS架構的CPU使用的策略就是,將這部分操作分配到單獨的一個流水線上進行操作(我們在其它文章中,再討論這個話題)。

  • 3個操作數(shù)的指令: 編譯器偏愛三個操作數(shù)的運算,對于復雜的表達式能夠有更大的優(yōu)化空間。而算術/邏輯運算指令不需要存儲操作,所以有足夠的位表示兩個源操作寄存器和一個目的寄存器。

  • 32個通用寄存器: 通用寄存器的個數(shù)是由軟件需求驅動的,32個通用寄存器是現(xiàn)代計算機架構中常用的數(shù)量。如果使用16個寄存器并不能完全滿足現(xiàn)代編譯器的需要,而使用32個寄存器對于C編譯器是完全足夠的,足以覆蓋最大最復雜的函數(shù)調用關系。但是,使用64個寄存器需要占用指令中更多的位去編碼寄存器,也會增加上下文切換時的負荷(需要保存的寄存器更多)。

  • 寄存器0:寄存器0總是返回一個0常數(shù)。0是最常用的一個常數(shù),直接用一個寄存器表示,可以減少常數(shù)向寄存器的加載操作。

  • 指令不含條件碼: 即使相比其它RISC架構,MIPS指令集也具有一個重要特性就是沒有任何條件標志。許多架構使用進位、零等多個標志。像X86等CISC復雜指令集架構的指令中有一些位專門表示是否根據(jù)結果設置這些標志位。就是一些RISC指令集架構也保留了一些這樣的標志位,比如說ARM,盡管通常只有比較指令可以設置這些標志位。 MIPS架構決定使用寄存器保存這些信息:比較指令根據(jù)結果設置通用寄存器,條件分支指令檢查判斷這些通用寄存器。這樣的操作,非常有利于流水線架構的實現(xiàn),因為這樣的機制,比較/分支指令不需要再依賴于算術/邏輯操作,也就是說,它們之間彼此都是獨立的,流水線的實現(xiàn)也就更簡單。它們之間的邏輯關系由軟件實現(xiàn),這也是MIPS架構的設計理念:強調軟硬件結合,簡化硬件設計。 有效的條件分支指令要求,必須在半個時鐘周期內做出是否要跳轉的決定;MIPS架構通過盡可能簡單地測試條件是否滿足實現(xiàn),比如,判斷某個寄存器的值是否為符號位或者等于0,再比如,判斷兩個寄存器的值是否相等。

1.5.2 尋址和內存訪問

  • 訪問內存都是先load/store到寄存器中: 算術指令如果直接操作內存變量會破壞簡化流水線設計的理念。所以,對內存變量進行操作的時候,先將其加載到寄存器中,然后再對寄存器進行算術邏輯操作。完成后,將將結果再存儲到內存中對應的位置。

  • 只有一種數(shù)據(jù)尋址模式,寄存器尋址: 幾乎所有的加載和存儲都是通過寄存器基址加上16位的偏移實現(xiàn)的。

  • 字節(jié)尋址: MIPS架構中的寄存器是一個整體,所有的操作都是對整個寄存器的操作。所以,無法實現(xiàn)字節(jié)或者半字這樣的操作。但是,C語言之類的語法又要求可以按照字節(jié)或半字進行操作。MIPS架構采取的方式就是,提供一組load/store指令,分別加載字節(jié)、半字或WORD大小的內存變量。一旦數(shù)據(jù)加載到寄存器中,它就看作為一個寄存器長度大小的數(shù)據(jù)(比如說,32位架構就是32位整數(shù),64位架構就被看作為64位整數(shù))。所以,對于這些字節(jié)或半字的load操作,還需要考慮符號位。于是,又延伸出兩種加載指令的形式:符號擴展或零擴展。

  • load/store操作必須對齊: MIPS架構內存訪問必須是按對齊方式進行的。字節(jié)可以是任何地址,但是半字就必須是偶數(shù)地址對齊,WORD必須是4字節(jié)對齊的方式。CISC指令集架構的微處理器可以從任意地址處讀取一個4字節(jié)的數(shù)據(jù),代價就是需要多花費一些時鐘周期。 但是,MIPS指令集一些特殊的指令,以簡化未正確對齊的地址上load和store的工作。

  • 跳轉指令: 指令的長度限制為32位,對于想要大范圍跳轉的分支指令是一個很大的問題。MIPS指令中最小的操作碼域是6位,為跳轉的目的地址保留了26位。因為內存中的指令代碼都是4字節(jié)對齊的,也就是說,最低2位不需要保存,那么允許訪問的程序范圍就是2^28,等于256MB。這個地址不是相對于PC(程序計數(shù)器)的,而是被解釋為256M的代碼段中一個絕對地址。這樣以來,對于大于256M的單個程序非常不便。雖然,可以使用寄存器保存跳轉目標,然后再使用跳轉指令跳轉到32位地址的任何地方。 條件分支指令只有16位的偏移量,對于4字節(jié)對齊的內存空間,其訪問的范圍是2^18B。但是這兒的地址可以解釋為相對PC寄存器的正負范圍。所以,編譯器只有知道目標地址在分支指令前后128KB的范圍內才能正確地編碼條件分支指令。

1.5.3 MIPS沒有的特性

  • 沒有字節(jié)或半字算術運算: 所有的算術和邏輯操作都是基于32位完成的。操作字節(jié)或者半字要求更多的額外資源和更多的操作碼,所以,一般不推薦使用。但是,如果程序中顯式地使用short或者char類型的數(shù)據(jù)進行運算,支持MIPS架構的編譯器必須額外地插入一些機器指令,保證結果能夠像在真正的16位或8位機器上那樣正確運行。

  • 沒有對堆棧寄存器的特定支持: 雖然,傳統(tǒng)意義上的MIPS匯編代碼確定也會定義一個寄存器作為堆棧指針寄存器,但是,硬件上沒有規(guī)定那個寄存器是特定的sp寄存器。而像ARM和X86架構有一個特定的sp寄存器。我們都知道,對于函數(shù)調用的實現(xiàn),有一些約定俗成的格式,比如說System V ABI。有一種推薦的子程序調用時堆棧棧幀布局,這樣可以混合使用匯編語言和C語言編程,使用不同的編譯器選項進行編譯。但是這一切和硬件都沒有關系,需要人為實現(xiàn)。堆棧的pop操作不符合流水線的執(zhí)行,因為它要寫兩個寄存器(來自堆棧的數(shù)據(jù)和增加的指針值)。

  • 最少的子程序支持: 跳轉指令也與我們習慣上的認知有所不同:具有跳轉(jump)和鏈接(link)跳轉指令,把返回地址寫入到一個固定的寄存器中。默認使用$31作為返回地址寄存器。 這比把返回地址保存到堆棧中更為簡單,而且還有許多優(yōu)點。舉兩個例子讓你對這種論斷有一個直觀感受:第一,它把分支指令和內存訪問指令分離開來;第二,當調用不需要保存返回地址的子程序時,有助于提高效率。

  • 最少的中斷處理: 很難看到比這做得更少的硬件了。它把程序重新運行的地址保存到一個特定寄存器中,修改機器狀態(tài),然后禁止中斷。做完這些后,跳轉到一段保存到低內存中的預定義好的程序,之后的工作完全由軟件控制。 其實,現(xiàn)在處理器對于中斷都是基于能少則少的原則進行處理。硬件上,MIPS架構則是只保存了一個重新運行的地址,而像X86架構,還需要保存eflags、cs、eip、ss和esp等寄存器。所以,MIPS的中斷處理更為簡單。

  • 最少的異常處理: 異常的硬件處理其實同中斷處理一樣。MIPS架構把中斷看作為異常的一種,MIPS的異常涵蓋了CPU想要中斷所有順序的執(zhí)行,調用軟件處理程序所產生的所有事件。比如中斷、試圖訪問物理地址不存在的虛擬內存或者其它事情都可以產生異常。還有比如故意植入的trap陷阱指令,像為了訪問內核態(tài)程序的系統(tǒng)調用都是一種異常。所有的異常都導致CPU的控制權傳遞給一個固定的入口點。 對于任何異常,MIPS架構的CPU不會存儲任何東西到堆棧上,也不會寫內存或者保存任何寄存器。一切都由你自己決定。這與ARM和X86架構都是不一樣的。 按照約定,MIPS架構也保留了2個通用寄存器,讓異常程序可以自舉(在MIPS架構的CPU上,不使用寄存器是無法工作的)。但是,對于一個旨在多架構上運行的、允許中斷或陷阱(trap)的通用系統(tǒng),這兩個寄存器的值隨時會發(fā)生變化,最后不要使用它們。

1.5.4 MIPS架構流水線的延遲

前面我們討論的都是簡化CPU的設計帶來的一些結果。但是,為了使指令集對流水線更友好,也產生了一些奇怪的效應,想要理解它們并不容易:

  • 分支延遲:

  • 如上圖的流水線結構圖所示,當一個jump指令在讀取階段時,又產生了新的PC寄存器值,jump指令后的指令也被啟動了。MIPS架構規(guī)定,分支指令后的指令總是在分支目標指令之前執(zhí)行。跟隨在分支指令后的指令位置被稱為分支延遲槽,具體物理意義有點抽象,對應上圖的話,就是橫向上的一格。對于分支延遲槽,如果硬件不做任何特殊處理的話,決定是否跳轉以及跳轉的目標地址等,這些工作就會在ALU階段結束時才能完成,此時即使是在下下個流水線槽都來不及提供一個指令地址。 但是分支指令的重要性足以給其特殊處理,從上圖可以看出,通過特殊的處理,ALU階段可以在半個時鐘周期內就使目標地址可用。連同取指令提前的半個周期,剛好在下下個流水線槽得到分支目標地址作為指令開始執(zhí)行。所以,CPU控制單元執(zhí)行的順序是,分支指令,分支延遲槽指令,然后是分支目標指令,中間沒有延時。 如何利用好這個分支延遲槽,就是編譯器或者匯編程序編寫者的責任了??梢赃m當安排位于分支延遲槽中的指令做些有用的工作。也可以把不影響執(zhí)行順序的指令安排到分支延遲槽中執(zhí)行。 對于條件分支指令,這個比較復雜,至少保證位于分支延遲槽的指令對兩個分支都是無害的。如果是在沒有可以安排的指令,可以添加一個nop指令。這也是我們經常在MIPS架構的匯編代碼中看到的處理方式。

  • 數(shù)據(jù)加載延遲(加載延時槽):


  • 簡化的流水線另一個結果就是,當下一條指令到達ALU階段的時候,上一條load指令的數(shù)據(jù)才開始從cache或內存中到達。也就是說,load指令后的下一條指令還是不能使用數(shù)據(jù)的。 那么load指令后的位置,就稱為加載延時槽。帶有優(yōu)化的編譯器總是嘗試利用這個加載延時槽。有時候,編譯器會把這個位置填充一個nop操作。最新的MIPS架構CPU上,load操作也是采用了互鎖機制:如果你嘗試過早使用這個數(shù)據(jù),CPU會停止執(zhí)行,等待這個數(shù)據(jù)到達。但是,在早期的CPU上,沒有互鎖機制,過早的使用這個數(shù)據(jù),會產生不可預料的結果。


【轉】 MIPS架構深入理解1-MIPS和RISC架構體系介紹的評論 (共 條)

使用qq登录你需要登录后才可以评论。
宣化县| 砀山县| 阳西县| 景德镇市| 留坝县| 深圳市| 绥阳县| 舞钢市| 家居| 宝清县| 上饶市| 榕江县| 调兵山市| 明星| 天全县| 吉木乃县| 化州市| 泉州市| 老河口市| 龙里县| 松溪县| 保亭| 普宁市| 疏附县| 仪征市| 民权县| 绥宁县| 许昌县| 贺州市| 阿克陶县| 东辽县| 遂宁市| 星座| 珠海市| 浙江省| 子洲县| 汝州市| 霍邱县| 封开县| 马公市| 阆中市|