胡健
摘要:微處理器架構(gòu)廣泛應用于微處理器設(shè)計。 該文主要論述了流水線對處理器性能的影響,微處理器架構(gòu)的關(guān)鍵技術(shù)包括緩存存儲器、緩存一致性、分支預測、寄存器重命名、微指令、重新排序等技術(shù)。
關(guān)鍵詞:緩存存儲器;緩存一致性;分支預測
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)23-5536-03
1 概述
處理器架構(gòu)定義了這種架構(gòu)可以執(zhí)行的指令,但是決定這些指令執(zhí)行方式的是微處理器架構(gòu)。在處理器設(shè)計流程的諸多決定因素中,處理器架構(gòu)方面的因素對于處理器的性能和最終芯片的面積有著很大的影響。
根據(jù)定義,處理器架構(gòu)之間的改變對于編程人員是可見,并且需要新軟件來支持新處理器架構(gòu)。對于采用了新的架構(gòu)寄存器和SIMD指令的程序,處理器性能可以得到提升,但是對于原先版本的軟件卻沒有影響。微處理器架構(gòu)的改變對于程序員確實是不可見的,并且可以提升處理器性能而不需要軟件進行任何改變。
2 流水線對處理器性能的影響
大部分微處理器架構(gòu)改進的方面基本上集中在提高程序的指令并行度。處理器架構(gòu)定義了軟件的運行方式,其中就期望在程序執(zhí)行過程中每一個時鐘周期執(zhí)行一條指令。然而,在程序中很多指令可以并行執(zhí)行或者至少重疊執(zhí)行。微處理器架構(gòu)可以利用這些優(yōu)勢來提高處理器性能,但是為了保證軟件兼容性,又要維持指令的順序執(zhí)行。通過允許不同指令的重疊執(zhí)行,流水線可以提供更高的處理器性能。
最早時期的處理器并沒有充分的晶體管來支持流水線。這些處理器只能如處理器架構(gòu)定義的那樣每個時鐘周期順序執(zhí)行一條指令。簡單的串行處理器每4個時鐘周期完成一條指令,但是一個理想的流水線處理器每個時鐘周期就可以完成一條指令。理想流水線只有在每條指令可以在同樣的時鐘周期完成并且在指令之間沒有任何依賴的條件下才能達到。
為了提升性能,必須提高運行頻率或者提高每周期執(zhí)行指令的數(shù)量(IPC)或者減少所需要的指令條數(shù)。處理器架構(gòu)方面的選擇會影響IPC以及指令條數(shù),在微處理器架構(gòu)方面的選擇則會提升運行頻率或IPC。最簡單的方法就是通過增加流水線深度來提高運行頻率,將每條指令的執(zhí)行分成更多更小的階段。
指令類型決定每一條指令具有一定周期的邏輯延遲。增加流水線深度將計算時間分成更多周期,這樣每個周期所需要的時間就降低了。理想情況下,將流水線深度翻1番可以將處理器運行頻率提高1倍。但是實際上,每一個新的流水級中還是會增加一定數(shù)量的額外延遲開支。這些額外的開支限制了由于增加流水線深度而提升的處理器運行頻率。
3 微處理器架構(gòu)的關(guān)鍵技術(shù)
現(xiàn)在處理器采用流水線技術(shù)和增加指令發(fā)射寬度來使更多的指令可以并行執(zhí)行。微處理器架構(gòu)則需要解決數(shù)據(jù)依賴和控制依賴,這些依賴關(guān)系使得流水線無法達到理論上能達到的最大性能。
一些最重要的微處理器架構(gòu)技術(shù)有以下幾種:1) 緩存存儲器;2) 緩存一致性;3) 分支預測;4) 寄存器重命名;5) 微指令;6) 重新排序(reorder)、重演(replay)、隱退(retire)。
3.1 緩存存儲器
將最近使用過的數(shù)據(jù)存放在緩存存儲器中以減少平均存儲器訪問時延,這種技術(shù)在現(xiàn)代微處理器架構(gòu)中被不斷地使用。指令、數(shù)據(jù)、虛擬內(nèi)存轉(zhuǎn)換以及程序跳轉(zhuǎn)地址都是現(xiàn)代處理器中常被存放在緩存中的數(shù)據(jù)。在減少平均訪問時延方面,緩存是十分有效的,這是因為程序通常按照一定規(guī)律的模式訪問數(shù)據(jù)和指令。
通過在緩存中保持最近訪問過的數(shù)據(jù),當重復需要相同的數(shù)據(jù)時,處理器可以減少訪問時延。另外,在不久后這個地址附近的數(shù)據(jù)也很可能被訪問。假設(shè)一個標準程序訪問了存儲器100這個空間,那么這個程序就很可能訪問存儲器101這個空間。這種相近的存儲器空間進行的訪問的特點被稱為空間域相關(guān)性(spatial locality)。
3.2 緩存一致性
當多個器件共享主存儲器時,緩存會產(chǎn)生一個新的問題。即使在一個計算機系統(tǒng)中只有一個CPU,其它的計算機組件還是可以訪問主存儲器。顯卡、外設(shè)以及其它硬件都可以對存儲器進行讀寫。當其它器件需要讀存儲器時,最重要的一點就是這些器件需要讀取的數(shù)據(jù)是最近被更新的值,而這個值只儲存在處理器緩存中。而當其它寫存儲器的時候,最重要的一點就是存儲在處理器緩存中的數(shù)據(jù)也同時被更新。在多核系統(tǒng)中,多個處理器全部共享主存儲器,每個處理器都有自己的緩存。用于保障這些存儲器的緩存同步的機制就被稱為緩存一致性。
支持緩存一致性的首要條件是支持監(jiān)聽機制的總線協(xié)議。監(jiān)聽機制是當總線中存在數(shù)據(jù)通信時檢查數(shù)據(jù)通信是否會影響自己緩存中的數(shù)據(jù)。
3.3 分支預測
現(xiàn)代微處理器架構(gòu)中還有一個類型的專用緩存,那就是分支預測緩存。分支會給流水線和亂序執(zhí)行處理器帶來一系列問題。由于分支可以改變控制流程,所有在分支之后執(zhí)行的指令都依賴于分支的結(jié)果。這種控制依賴不僅僅影響后續(xù)指令的執(zhí)行,還決定了后續(xù)指令是否需要全部從存儲器中讀取出來。對很多程序而言,指令中20%或更多的操作為分支。如果沒有解決分支控制依賴有效的處理機制,那么任何流水線處理器都不可能實現(xiàn)理想的性能加速。處理分支控制依賴最常用的方法是分支預測。處理器簡單地猜測下一步哪一條指令需要從存儲器中讀取出來。
如果沒有分支預測機制,在獲取合適的指令之前,處理器需要停頓直到產(chǎn)生分支結(jié)果。采用分支預測機制,處理器可以猜測是否需要進行分支,并且基于預測的結(jié)果來獲取指令而不會產(chǎn)生停頓。如果預測正確,就能節(jié)省時間,從而提高處理器性能。如果預測錯誤,那么在預測錯誤發(fā)現(xiàn)之前、分支指令之后已經(jīng)進入流水線的幾條指令就是不符合程序流程的。
3.4 寄存器重命名
由于分支控制程序執(zhí)行流程,由分支產(chǎn)生的流水線停頓被稱為控制依賴。由于一條指令必須等待另一條結(jié)果而導致的流水線停頓被稱為數(shù)據(jù)依賴。從一條指令到另一條指令進行數(shù)據(jù)傳輸而產(chǎn)生的依賴為真數(shù)據(jù)依賴;由程序中寄存器的重復使用而產(chǎn)生的依賴為假依賴,這些假依賴可以被寄存器重命名技術(shù)消除從而提高性能。
每個計算機架構(gòu)都定義了有限數(shù)量的寄存器,指令可以在這些寄存器中讀取或存儲數(shù)據(jù)。為了使指令空間和代碼空間最小化,原先的處理器架構(gòu)盡量把寄存器的數(shù)量定義的相對小。由于可以選擇的架構(gòu)寄存器數(shù)量有限,程序需要通過少量的指令盡量對寄存器實現(xiàn)重復使用,這種重復使用產(chǎn)生了假數(shù)據(jù)依賴。一個寄存器在被一條指令進行寫操作之后馬上被另一條指令進行讀取時,會產(chǎn)生真數(shù)據(jù)依賴,這種依賴關(guān)系被稱為寫后讀(RAW)依賴。而假數(shù)據(jù)依賴則是讀后寫(WAR)或?qū)懞髮懀╓AW)依賴。讀后寫依賴需要一條指令必須將寫寄存器操作停頓下來,直到另一條指令已經(jīng)完成讀取這個寄存器的數(shù)據(jù)。在寫后寫依賴中,兩條指令在試圖寫同一個寄存器時會產(chǎn)生沖突。在沒有分支指令的代碼中,由于在結(jié)果數(shù)據(jù)被存儲之后總是會有一條指令來讀取這個結(jié)果數(shù)據(jù),所以不會產(chǎn)生WAW依賴,但是如果代碼中包含分支或者中斷,程序有可能對同一個寄存器進行不止一次的寫操作而不對這個寄存器進行任何讀操作。
通過程序代碼中的架構(gòu)寄存器映射到處理器中的物理寄存器上,寄存器重命名技術(shù)可以消除假數(shù)據(jù)依賴。物理寄存器的數(shù)量可以大于架構(gòu)寄存器的數(shù)量,這就允許寄存器重復使用的概率變小。消除假依賴可以允許更多的指令進行重新排序,從而提高處理器性能。寄存器別名表(RAT)可以用來記錄當前每個架構(gòu)寄存器映射到哪個物理寄存器。
3.5 微指令和微碼
處理器流水線可將復雜的指令分解成簡單的步驟,這就相當于把一個滾得很慢的小球替換成幾個滾得快的小球。RISC架構(gòu)可以達到上述要求,在RISC架構(gòu)中只允許執(zhí)行相對復雜度類似的簡單指令。通過采用硬件來把采用復雜機器語言的指令轉(zhuǎn)換成幾個簡單的步驟,支持CISC架構(gòu)的處理器也可以達到同樣的效果。在轉(zhuǎn)換之前,機器語言指令被稱為宏指令,而在轉(zhuǎn)換之后的簡單步驟被稱為微指令。
3.6 重新排序、隱退以及重演
任何允許亂序執(zhí)行的處理器都具有可以在執(zhí)行后將指令重新排成順序的機制。編寫軟件的時候都認為指令可以按照程序中的順序執(zhí)行。為了產(chǎn)生所期望的結(jié)果,需要在合適的時間處理中斷以及異常。分支預測意味著處理器可能執(zhí)行某些在順序執(zhí)行處理器中還沒有獲取的指令。必須存在將這些指令產(chǎn)生的結(jié)果置為無效的方法。所有可以提高性能的微處理器架構(gòu)特性都需要能保證軟件的兼容性。處理器亂序執(zhí)行的本質(zhì)也需要在程序中得到隱藏,而在程序中維持順序執(zhí)行,完成這個任務(wù)最常用的方法就是采用重排序緩存(ROB)。
重排序緩存將完成執(zhí)行的亂序指令搜集起來并按照原始程序中的順序進行排列。當指令從存儲器中獲取時,指令仍然保持原始程序中的順序,那么按照期望的指令執(zhí)行順序,每條指令在ROB中對應一個條目。在指令亂序執(zhí)行之后,ROB被重新以跟蹤那些完成執(zhí)行的指令。對于任何指令,只有當這條指令之前的所有指令都成功執(zhí)行完之后,這條指令產(chǎn)生的結(jié)果的正確性才得到保證。也只有到了這時候,才提交指令的結(jié)果,這條指令才真正地執(zhí)行完畢,這被稱為指令隱退。
如果對于每種類型的指令都只考慮其最長的執(zhí)行時間,那么填充滿一個流水線會變得更加困難。相反,處理器可以假設(shè)每條指令可以完成的最短的周期數(shù)。指令執(zhí)行完之后,可以檢查這種假設(shè)是否正確。假設(shè)所需要的數(shù)據(jù)是有效的,這種情況被稱為數(shù)據(jù)投機,這和分支預測非常類似。這兩種方法都是在調(diào)度時進行預測,當預測正確時可以減少延遲,而預測錯誤時將會付出更大執(zhí)行時延的代價。當分支預測錯誤時,指令將會誤操作,因此必須將所執(zhí)行的指令清除。當數(shù)據(jù)投機錯誤時,指令執(zhí)行還是正確的,但是所執(zhí)行的數(shù)據(jù)是錯誤的。這些指令并不能被清除,相反,它們必須被重新執(zhí)行,并保證所執(zhí)行的數(shù)據(jù)是正確的。將指令重新送到流水線的操作叫做指令重演。
4 總結(jié)
微處理器架構(gòu)包含了在IPC、工作頻率、芯片面積以及設(shè)計復雜度之間的權(quán)衡。硬件可以實現(xiàn)很多復雜的算法以提高處理器性能,,但是由于設(shè)計時間和芯片面積的限制而不能得以實現(xiàn)。
所以,處理器開發(fā)團隊必須發(fā)掘這些特性才可以設(shè)計出最佳的處理器性能。
參考文獻:
[1] 蔣本珊.電子計算機組成原理(修訂版)[M].北京:北京理工大學出版社,1999.
[2] 王愛英.計算機組成與結(jié)構(gòu)[M].2版.北京:清華大學出版社,1995.
[3] 陳國順,宋新民,等.網(wǎng)絡(luò)化測控技術(shù)[TP].北京:電子工業(yè)出版社,2006.