隋兵才,孫彩霞,王永文,郭 輝
(國防科技大學計算機學院,湖南 長沙 410073)
微體系結構技術的不斷革新,使得微處理器的時鐘頻率不斷提高,芯片的集成度也越來越高。這2個方面也同時導致了整個處理器更高的功耗密度,也就必須使用更高的成本以降低整個處理器的工作溫度。降低處理器的關鍵功能部件的功耗,可以有效地提高整個處理器的能效,并能夠降低冷卻成本,或者說,在給定能效的情況下,處理器可以獲得更高的性能。
發(fā)射隊列是超標量處理器中的關鍵功耗部件,并對整個處理器的性能起著決定性的作用。為了保證超標量處理器的整體性能和功耗,必須要對發(fā)射隊列進行低延遲、 低功耗的專門設計。
傳統(tǒng)的發(fā)射隊列都是利用全相聯(lián)的喚醒機制來實現(xiàn)。這種實現(xiàn)方式需要在每個時鐘周期對發(fā)射隊列中所有的指令進行操作數(shù)的檢查監(jiān)控,直到指令所需要的所有源操作數(shù)就緒,并且執(zhí)行資源可用時,才可以將該指令喚醒并等待到執(zhí)行部件執(zhí)行。選擇控制邏輯在源操作數(shù)就緒的所有指令中選擇一條或者多條指令送入執(zhí)行單元。盡管這種實現(xiàn)方式可以有效地提高處理器的IPC(Instructions Per Cycle),但是發(fā)射隊列的延遲會與處理器的時鐘頻率不相匹配。 并且,隨著發(fā)射寬度或者發(fā)射隊列的大小的增大,發(fā)射隊列的復雜度會急劇增大。
本文提出了一種能夠以較低功耗有效提高亂序超標量處理器性能的發(fā)射隊列結構。該結構包含多個指令隊列,能夠根據指令之間的相關性,估算指令的發(fā)射時機,將指令分配到不同的隊列中。
指令通過取指和譯碼流水站之后,通過分派邏輯被存儲到發(fā)射隊列中,在所有操作數(shù)準備好之后被發(fā)射到執(zhí)行單元。發(fā)射隊列的設計需要著重考慮影響性能和復雜性的相關問題,包括:指令的保存方式、指令的發(fā)射邏輯、指令的監(jiān)控邏輯以及如何選擇指令的執(zhí)行單元。
傳統(tǒng)的發(fā)射隊列基于CAM(Content-Address- able Memory)結構[1],能夠有效提升處理器的IPC,但是同時也使得處理器的功耗按比例增大。后續(xù)也有相關的實現(xiàn)針對CAM結構的功耗問題進行優(yōu)化[2,3],大多通過動態(tài)調整發(fā)射隊列的大小,或者通過關閉空閑的喚醒邏輯,或者利用發(fā)射隊列與ROB(Re -Order Buffer)的控制邏輯關系來降低CAM的功耗。
Buyuktosunoglu等[4]提出了一種CAM和RAM(Random Access Memeory)相結合的發(fā)射隊列實現(xiàn)結構,以有效降低發(fā)射隊列的功耗。同時,論文中也提出了類似的動態(tài)調整發(fā)射隊列大小的設計思路。Brown等[5]提出了一種流水實現(xiàn)的發(fā)射隊列,能夠保證連續(xù)發(fā)射指令。Ernst等[6]提出了一種可以包含3種類型存儲項的發(fā)射隊列,能夠降低功耗,提高發(fā)射隊列的性能。
Cotofana等[7]提出了一種利用計數(shù)器減少資源沖突的發(fā)射隊列選擇邏輯,相對于傳統(tǒng)的發(fā)射機制,能夠更快地喚醒和選擇指令并發(fā)射到功能單元。Kucuk等[8]針對發(fā)射隊列提出了低功耗比較器、0字節(jié)編碼和位處理方式,以有效降低相關功耗。 Lebeck等[9]提出了一種等待指令的存儲緩沖,以保存與訪問Cache失效指令相關的指令。當Cache失效處理完成之后,相關指令從緩沖中移動到發(fā)射隊列中。Brekelbaum等[10]提出了基于結構化調度的發(fā)射隊列結構,關鍵性的指令被存放在高速CAM/RAM發(fā)射隊列中,而非關鍵性指令存放在低功耗高延遲的CAM結構中。Canal等[11,12]提出了不同于傳統(tǒng)方式的發(fā)射隊列結構。分派時,該結構首先估算每條指令的發(fā)射時機,然后根據計算結果進行順序發(fā)射。由于在分派時刻很難估算出指令的精確發(fā)射時機,該結構中實現(xiàn)了一個很小的CAM/RAM陣列,以保存在預計時刻不能發(fā)射出去的指令,直到按照傳統(tǒng)的方式將其發(fā)射到功能單元中。Michaud等[13]提出了一種2級發(fā)射隊列結構,其中第1級與傳統(tǒng)的CAM/RAM結構相同,第2級保存暫時不能被喚醒的指令。該實現(xiàn)機制能夠很好地解決指令之間的相關性,但是在一定程度上增加了實現(xiàn)的復雜度。Raasch等[14]提出了一種可調整的發(fā)射邏輯,該邏輯實現(xiàn)了多個存儲體,可以根據指令的延遲將指令從一個存儲體調度到另一個存儲體,可以實現(xiàn)很高的頻率,但是功耗依然是一個比較大的問題。
上述很多實現(xiàn)機制需要在分派時計算被分派的多條指令的發(fā)射時機,這必然導致復雜的硬件實現(xiàn)邏輯。
由于CAM結構的發(fā)射隊列的功耗更高,因此研究人員提出了很多非CAM結構的發(fā)射隊列結構。通過分析指令特性,發(fā)現(xiàn)大部分指令的后續(xù)相關指令并不多,因此Canal等[11]提出了一種根據每條指令喚醒N條相關指令的結構。Palacharla等[1]提出了一種FIFO結構的發(fā)射隊列,只有FIFO頭部的指令才會被發(fā)射出去。
Moreshet等[15]提出一種雙端口的發(fā)射隊列結構,能夠以更小的發(fā)射隊列資源獲得更高的指令并行度,并能夠有效減少發(fā)射信用處理通路的關鍵路徑。
其他關于發(fā)射隊列結構的綜述可以參考文獻[16]。
發(fā)射隊列是超標量處理器中的亂序控制部件。發(fā)射隊列接收指令控制部件分派的指令相關信息,并負責監(jiān)控執(zhí)行部件的數(shù)據總線使用及空閑狀態(tài),更新發(fā)射隊列中等待發(fā)射的指令的操作數(shù)相關信息,一旦指令的所有操作數(shù)準備就緒,并且不存在后續(xù)的流水線和總線相關,該指令即進入準備狀態(tài)。發(fā)射隊列從已經準備就緒的所有指令中選擇一條指令發(fā)射到對應的流水線中執(zhí)行。由于VFU(Vector and Float Unit)部件的執(zhí)行流水線是不等長流水線,并且多個流水線共享3條結果總線,因此VFU部件的發(fā)射隊列還需要根據各條指令的延遲情況,以及結果總線的空閑情況,判斷準備發(fā)射的指令是否存在結構相關。此外,為了提高浮點處理性能,根據處理器融合乘加實現(xiàn)的方式,發(fā)射隊列也維護了FMUL/FADD/FCVT(Floating-point CoVerT)部件指令結果數(shù)據旁路到浮點融合乘加的累加操作數(shù)中的相關控制,以保證浮點融合乘加指令不必等到所有的操作數(shù)都全部準備好之后再進行發(fā)射,可以在2個乘法操作數(shù)準備好,并且確定累加操作數(shù)可以通過旁路獲得的時候,就將融合乘加的指令提前發(fā)射到乘法流水線中。
發(fā)射隊列的結構圖如圖1所示,其中UOP代表Micro-OPeration。浮點部件的發(fā)射隊列為2入2出24項的結構。每個時鐘周期最多可以接受指令譯碼部件分派來的2條指令,并且每個時鐘周期可以最多向流水線中發(fā)射2條指令執(zhí)行。整個發(fā)射隊列采用節(jié)拍(age)計數(shù)的方式進行發(fā)射控制,每個時鐘周期從24個發(fā)射項中選擇操作數(shù)已經就緒的并且節(jié)拍數(shù)最多的2條指令進行發(fā)射,2個發(fā)射端口可以分別向VFU的所有2條流水線中各自發(fā)射指令。
Figure 1 Structure of dual-port issue queue圖1 雙端口發(fā)射隊列的結構圖
(1)時序控制:發(fā)射隊列的每一項有一個age標識,發(fā)射隊列有多少項age標識就有多少位,每一位對應一項。每一項根據age標識來判斷當前項與其他各個項的時序關系,如果age標識中的某個對應位為1,表示當前項要比對應項后進入流水線。
(2)發(fā)射隊列首項:發(fā)射隊列的結構均為2入2出。指令控制部件分派來的指令只進入發(fā)射隊列的首2項,然后再由首2項輸出指令信息并將其保存到其他項,其他發(fā)射隊列項與ISU(Instruction Schedule Unit)無接口。首項接收的指令的age標識為全1。
由于VFU部件的各個流水線長度不一致,所有的流水線共享3條結果總線,因此需要對發(fā)射出來的指令進行結果總線的相關判斷。VFU部件根據指令的延遲的不同,對各個延遲的指令對應的結果總線維護了一個記分牌,用于記錄當前流水線中的指令需要占用的結果總線的情況。發(fā)射隊列在發(fā)射指令的同時,需要根據所發(fā)射的指令的延遲,檢查對應的延遲的記分牌,如果有空閑總線,則該指令可以正常發(fā)射;否則,該指令不能發(fā)射。
24項的單端口發(fā)射隊列的結構圖如圖 2所示。
Figure 2 Structure of single-port issue queue圖2 單端口發(fā)射隊列的結構圖
對比圖 1和圖 2的結構可以看出,本文提出的雙端口發(fā)射隊列與分布式單端口發(fā)射隊列的項數(shù)均為24項。雙端口發(fā)射隊列的頭2項為入口項,采用向下移動的方式維護,所以其它項的指令信息來源于2個入口項。發(fā)射指令時,雙端口需要從24項中選出2項,傳統(tǒng)實現(xiàn)需要2個24選1的選擇邏輯,但是為了降低硬件實現(xiàn)的復雜度,也可以使用12-1的選擇邏輯實現(xiàn)。單端口發(fā)射隊列的第11項作為入口項,也采用向下移動的方式實現(xiàn),其它項的指令信息來源于入口項。發(fā)射指令時,分別使用2個12-1的選擇開關實現(xiàn)。因此,從硬件實現(xiàn)開銷角度來說,雙端口的發(fā)射隊列并沒有增加很多額外的硬件開銷。相比于分布式的單端口發(fā)射隊列實現(xiàn),如果流水線端口slotj和slotk屬于不對稱結構實現(xiàn),slotj和slotk的可用發(fā)射隊列項都是24項,但是單端口發(fā)射隊列的可用發(fā)射隊列項為12項,能夠有效提高非對稱流水線設計中發(fā)射隊列的利用率。
發(fā)射隊列向執(zhí)行部件發(fā)射指令的策略對整個流水線的效率有很大影響。由于本文的發(fā)射隊列是一個2入2出的隊列結構,所輸出的2條指令需要根據類型不同分配到不同的執(zhí)行槽上。本文設計對比了2種不同的發(fā)射策略對執(zhí)行性能的影響。2種不同的發(fā)射策略如圖3所示。圖3a的發(fā)射隊列在接受分派的指令時,不對指令進行分類檢查,而在發(fā)射到執(zhí)行流水線之前,分別從發(fā)射隊列的高低2部分選取最老的指令,然后對2條選取出的指令進行類別判定。如果2條指令存在執(zhí)行流水線沖突,則取消1條指令。否則,將指令發(fā)射到對應的執(zhí)行流水線中執(zhí)行。圖3b的發(fā)射隊列在接收分派的指令進入發(fā)射隊列之前,對所處理的指令進行執(zhí)行流水線的標記,指令進入發(fā)射隊列之后就已經確定在流水線j(slotj)或者流水線k(slotk)執(zhí)行。發(fā)射時,從所有的隊列項中分別選取流水線j(slotj)或者流水線k(slotk)中的最老的指令進行發(fā)射即可。
Figure 3 Two different issue strategies圖3 2種不同的發(fā)射策略
對2種發(fā)射策略進行SPEC2006性能評測的結果如圖3所示。發(fā)射隊列輸入端對指令進行執(zhí)行流水線的標記相比于基準版的發(fā)射策略能夠有效降低執(zhí)行流水線的沖突,提升執(zhí)行的有效IPC,最大可提升10.68%。2種發(fā)射隊列的主要不同點在于是在發(fā)射隊列輸入端還是輸出端進行執(zhí)行流水線的判定。圖3a從發(fā)射隊列的高低2部分分別選擇2條指令,在輸出端進行執(zhí)行流水線的判定,需要的選擇邏輯較少,但是存在2條指令執(zhí)行流水線沖突的情況。圖3b在發(fā)射隊列的輸入端就進行執(zhí)行流水線的標記和確定,在發(fā)射時只要選擇對應執(zhí)行流水線的指令發(fā)射到對應的執(zhí)行流水線中,能夠有效減少執(zhí)行流水線沖突的情況,但是選擇控制邏輯較多。
Figure 4 Performance comparison of two issue strategies圖4 2種發(fā)射策略性能對比
由于發(fā)射隊列是亂序超標量處理器中最關鍵的亂序資源,其項數(shù)對性能和整個處理器的PPA(Performance Power and Area)指標影響很大,因此,本文也對比了24項發(fā)射隊列與32項發(fā)射隊列對處理器SPEC2006實際IPC性能的影響,發(fā)射隊列均采用輸入端標記式的發(fā)射策略。SPEC2006的IPC性能測試結果如圖5所示。
由于僅增加了浮點部件的發(fā)射隊列,所以SPEC的整數(shù)程序的性能提升不大,但也有稍許提升。對于浮點測試程序平均IPC性能提升2%,最大提升8.59%。但是,454.calcculix程序IPC性能降低12%,可能是該程序的訪存較多,增大發(fā)射隊列會引起更多的流水線刷新,從而引起性能的降低。因此,增大亂序發(fā)射資源的同時,必須相應地優(yōu)化其他亂序資源,以達到資源的最大利用率,有效提升IPC性能。
發(fā)射隊列是超標量處理器中的關鍵部件,并對整個處理器的性能起著決定性的作用。本文設計并實現(xiàn)了一種2入2出的發(fā)射隊列結構,并對不同的發(fā)射策略進行了性能評測與優(yōu)化。比對了32項與24項發(fā)射隊列對處理器有效IPC性能的影響。發(fā)射隊列的項數(shù)對處理器的IPC性能有重要影響,在增大發(fā)射隊列資源的同時,也必須相應地優(yōu)化其他亂序資源,以獲得資源的最大利用率。