摘要:探討通過優化總線接口部件的設計來提高處理器整體性能,優化的措施著重于降低處理器訪存的次數和減小總線負載。仿真和驗證結果證明這些方法是可行有效的。
關鍵詞:多處理機; 存儲一致性; 總線接口; 總線負載
中圖分類號:TP302文獻標志碼:A
文章編號:1001-3695(2007)12-0282-03
“龍騰R2”是西北工業大學航空微電子中心自行設計的一種基于PowerPC體系結構的32位RISC處理器,采用自頂向下的正向設計方法,使用Verilog編碼,與PowerPC750在指令集上完全兼容。筆者負責微處理器總線接口單元的設計。
多處理器的情況下,處理器與存儲器之間的訪問頻度大大增加,存儲系統的存儲一致性問題成為設計的主要難點。根據Amdahl定律[1],對處理器性能瓶頸進行優化可以更好地提高處理器的整體性能。所以在本文中,筆者在總線接口單元的設計中提出了兩種優化策略,優化方案的目標就是盡可能地減少處理器與存儲器的通信次數,從而減小總線的負載來實現處理器存儲系統整體性能的優化。
1減小總線負載的方案
對于給定的一段程序,降低其運行過程中處理器訪存次數的方法很多。可以對這段程序進行編譯優化,讓它具有更好的空間局部性。這樣在cache一定的情況下,可以提高cache的命中率,減少程序運行過程中的訪存次數。也可以通過增加cache的容量或者相關聯度來提高cache的命中率。
本文主要介紹兩種方法:一是在“龍騰R2”的存儲系統中增加犧牲者緩沖區;二是對“龍騰R2”的寫緩沖區采用合并寫緩沖區的策略。兩種方法在減小總線負載的同時,對單處理器的性能也有很大的提高。
2“龍騰R2”存儲系統的結構
為了便于闡述筆者的研究內容,下面給出“龍騰R2”存儲系統的結構,如圖1所示。其中處理器內核(MPU)、FPU、存儲管理單元(如TLB)以及一級cache是微處理器芯片內的快速電路。而主存儲器則是片外的慢速電路。系統接口是連接這兩種不同速度設備的電路。
片上cache的大小隨實現技術的不同而不同,采用越高速的技術,cache的大小就會越小。因此為了實現整個處理器的高頻率,一級cache的大小不可能做得太大。“龍騰R2”的一級指令cache和數據cache的容量均為32 KB。
“龍騰R2”的數據cache設計有兩種工作模式:
a)Cache打開模式。Cache工作的正常模式。在該模式下,數據cache又可以采用“寫直達”和“寫回”兩種寫策略。
b)Cache關閉模式。數據cache直接把LSU的load/store操作轉發給BIU,訪存操作都是單拍的。
3犧牲者緩沖區
3.1缺失cache和犧牲者cache
Cache缺失是導致處理器訪存的直接原因,cache缺失可以分為四類[2]:
a)沖突缺失。如果塊替換策略是組相聯或者直接映射并且有太多的塊被映射到同一組中,則某一cache塊可能會在被替換掉后重新再調入,這時就發生了沖突缺失。如果cache是全相聯并且采用LRU替換算法,沖突缺失將被避免。
b)強制缺失。對一個塊的第一次訪問一定不在cache中,所以該塊必須被調入到cache中。這也被稱為冷啟動缺失或者首次訪問缺失。
c)容量缺失。如果cache容納不了一個程序執行所需的所有的塊,將會發生容量缺失,某些cache塊會在被替換掉后重新調入。
d)層次缺失(coherence miss)。層次缺失是由維護高速緩存一致性導致的缺失。
為降低cache的沖突缺失,Jouppi在1990年就提出了缺失cache和犧牲者cache的概念[3]。
Jouppi在一級cache與存儲器之間增加了一個小的全相聯cache來增加一級cache的相聯度。根據小cache中存儲的內容,小cache可以分別被當做缺失cache(missing cache)和犧牲者cache(victim cache)。
若小cache中存放的是一級cache缺失發生時從存儲器返回的數據,小cache被當做缺失cache。一級cache缺失發生時從存儲器返回的數據不僅要返回到一級cache中,還要返回到缺失cache中,替換掉缺失cache中最少被使用的項。當一級cache被訪問時,缺失cache同時也被訪問。如果訪問在一級cache中缺失,但在缺失cache中命中,處理器在下一周期就會得到所需數據。缺失cache存在一個問題:當一級cache缺失發生時,數據讀回被同時寫到缺失cache和一級cache中,這種重復浪費了缺失cache的存儲空間。
為了更好地利用小cache,可以在小cache中采用一種新的替換算法。不再將一級cache缺失時讀回的數據寫入小cache,而是將一級cache缺失時從一級cache替換出來的cache塊寫入缺失cache。這時,小cache就是犧牲者cache,如圖2所示。
當訪存操作在一級cache中缺失,但在犧牲者cache中命中時,一級cache與犧牲cache相應的行互換。犧牲cache的效果總是優于缺失cache,性能提高的程度依賴于缺失cache中與一級cache相同的項的數目,缺失cache相同的項越多,犧牲者cache性能提高就越顯著。AMD的Athlon微處理器中就使用了八個條目的犧牲者cache[4]。
3.2“龍騰R2”微處理器犧牲者緩沖區的設計
筆者將犧牲者cache應用到了“龍騰R2”的設計中。但是沒有將其在cache中實現,而是在總線接口中設計了一個犧牲者緩存區。這樣做有兩方面的考慮:
a)“龍騰R2”的后端設計表明,處理器的關鍵路徑在cache中,因此在cache中增加部件很有可能惡化整個處理器的時序,降低處理器的主頻。
b)在總線接口中增加一個緩存區對cache是完全透明的,這樣可以降低設計的復雜度。
犧牲者緩沖區的設計如圖3所示。
當數據cache訪存時,如果是castout(即塊替換)操作,存數操作同時將數據和地址(標記)寫入犧牲者緩沖區中。當數據cache有取數請求時,首先將訪存地址和犧牲者緩沖區的標記比較,看是否命中。若不命中則繼續訪存;若命中,則直接取回數據。可見,在訪存請求命中犧牲者緩沖區時,存儲器訪問的延遲被大大地縮短了。
當犧牲者緩沖區已滿時,如果下一個塊替換操作沒有命中犧牲者緩沖區,就需要將犧牲者緩沖區中的一塊替換掉。最理想的替換算法是LRU(least recently used),但是LRU算法需要統計犧牲者緩沖區中每一cahce塊命中的次數,這在硬件上的開銷非常大,特別是當犧牲者緩沖區的入口很多時。因此筆者采用了偽LRU算法:總是替換掉最久沒有被使用的cache塊,而無須統計每塊命中的次數。
筆者在“龍騰R2”上運行VxWorks BootRom(BootRom為VxWorks的引導程序)及VxWorks操作系統以及大監控、小監控等實際應用程序來測試犧牲者緩沖區的效果。四個程序運行的指令數以及其中load/store指令的比重如表1所示。
當犧牲者緩沖區入口數變化時,能捕捉到的castout操作如圖4所示。由圖4中的平均數據曲線可以看出,當入口數為18時,犧牲者緩沖區能夠捕捉到50%的castout操作。圖4中命中率指捕捉到的castout操作占總castout操作的比例。
犧牲者緩沖區導致訪存減少的情況如圖4、5所示。由圖5中的平均數據曲線可以看出,當犧牲者緩沖區入口數為18時,處理器訪存次數減少10%。由此可見,犧牲者緩沖區很好地起到了減小總線負載的作用。
對于數據量較小的大、小監控程序,當犧牲者緩沖區入口數達到8以后,隨著入口數的增多,犧牲者緩沖區的性能提高較為緩慢。對于數據量較大的VxWorks BootRom和VxWorks操作系統,當犧牲者緩沖區入口數達到18以后,犧牲者緩沖區的性能提高才變得較為緩慢。針對不同的應用環境,可以適當地選擇犧牲者緩沖區的入口數,以使犧牲者緩沖區具有較高的性價比。通過綜合考慮“龍騰R2”運行的實際應用程序,筆者確定“龍騰R2”中犧牲者緩沖區的入口數為18。
4合并寫緩沖區
大多數處理器在執行寫操作時,用到一個寫緩沖區。當寫緩沖區為空且CPU有寫操作時,CPU將該操作的地址和數據放到寫緩沖區中,寫操作就結束了;此后,當寫緩沖區將數據寫回內存時,CPU可以繼續工作。如果寫緩沖區中已經有內容,當有新的寫操作時,檢查它的地址是否與寫緩沖區中某一項地址相匹配。如果匹配,且兩次操作的數據之和不超過寫緩沖區的一項,新的寫操作的數據就合并到該項中。這個過程稱為寫緩沖區合并。如果寫緩沖區已滿,而且也沒有地址可以匹配, CPU必須等待,直到緩沖區空出一個項。
因為一次寫多個字比多次寫一個字速度更快,這種優化更有效地利用了總線帶寬。這種方法同時減少了因為寫緩沖區已滿而產生的停頓。
“龍騰R2”設計中的寫緩沖區為總線接口部件中的輸出FIFO。輸出FIFO的容量為8,每項的內容為
為使輸出FIFO支持寫緩沖區合并技術,需要對輸出FIFO數據項里的data項作修改,增加一個8位的標記位flag,分別標記data項中的8個字(256位)是否有效。輸出FIFO的內容變為
輸出FIFO還需要增加一個地址判別邏輯,判斷寫輸出FIFO的操作是否滿足合并寫緩沖區的條件。
圖6是“龍騰R2”采用合并寫緩沖區的情況。現在有8個連續的單字寫操作。如果沒有采用合并寫緩沖區的策略,8個寫操作就將寫緩沖區寫滿了,如果再有寫操作,CPU必須等待。如果采用合并寫緩沖區的策略,第3次和第7次寫操作合并到第1次寫操作中,第4次寫操作合并到了第2次寫操作中,這樣就避免了CPU因為寫緩沖區滿而等待;更重要的是,因為8次寫操作被合并成5次寫操作,只需要5個總線周期就可以完成本來需要8個總線周期才能完成的數據傳輸,大大減小了總線的負載。
合并寫緩沖區改變了被加入數據的那次寫操作的傳輸大小。當傳輸字節數超過8時,本來單拍執行的操作應該改為突發執行。因此指令FIFO相應數據項的TSIZ、TBST表項也應該作相應的修改。
當數據cache打開且采用寫回式的寫策略時,數據cache只有在塊替換時寫存儲器,每次寫32 Byte,輸出FIFO的data表項被填滿。這時,合并寫緩沖區將不起作用。
當數據cache打開且采用寫直達的寫策略時,處理器每次寫數據cache時都要同時寫存儲器。大/小監控、VxWorks BootRom、VxWorks操作系統運行過程中發生的寫緩沖區合并的情況如表2、3所示。其中:
寫操作合并的比例=被合并的寫操作數/總的寫操作數
訪存減少的比例=合并寫緩沖區減少的訪存操作數/總的訪存操作數
由以上數據可以看出,當數據cache采用寫直達模式時,合并寫緩沖區可以減少11.01%的寫操作,可以減少8.49%的訪存操作。
當數據cache關閉時,數據cache直接把LSU的load/store操作轉發給BIU,訪存操作都是單拍的。大、小監控、VxWorks BootRom、VxWorks操作系統運行過程中發生的寫緩沖區合并的情況如表4、5所示。
由以上數據可以看出,當數據cache關閉時,合并寫緩沖區可以減少10.96%的寫操作,可以減少5.13%的訪存操作。
在數據cache的兩種模式下,處理器寫存儲器的操作幾乎一樣。合并寫緩沖區減少的寫操作比例也幾乎一樣。對于讀存儲器的操作,因為數據cache的存在大大減少了處理器讀存儲器的次數,也大大減少了處理器的訪存總數。在數據cache的兩種模式下,合并寫緩沖區導致訪存減少的比例相差較大。
在多處理器系統中,cache采用寫直達模式可以更好地維護高速緩存一致性;在一些低功耗的應用場合,往往需要關閉cache。這時,合并寫緩沖區將大大提高處理器的系統性能。
5結束語
本文提出了一種基于多處理器環境下總線接口部件的優化設計方案。在設計中使用了增加犧牲緩沖區和合并寫緩沖區兩種策略。大量的仿真驗證實驗證明了設計方案在降低處理器訪存次數和減少總線負載方面是一種正確且行之有效的方法。
參考文獻:
[1]AMDAHL G M. Validity of the single processor approach to achieving large scale computing capabilities[C]//Proc AFIPS 1967 Spring Joint Computer Conf 30. Washington D C: Thompson Books, 1967:483-485.
[2]HENNESSY J L, PATTERSON D A. Computer architecture: a quantitative approach[C]. San Mateo: Morgan Kaufmann Publishers, 2002:3.
[3]JOUPPI N P. Improving direct-mapped cache performance by the addition of a small fully-associative cache and prefetch Buffers[C]//Proc of the 17th Int Symp on Computer Architecture(ISCA’90). New York, USA: ACM Press, 1990:364-373.
[4]IBM IBC, MOTOROLA INC. PowerPC Microprocessor family: the bus interface for 32-bit microprocessors[EB/OL].[2001-03].http://www-306.com/chips/techlib/techlib.nsf/techdocs/852569B 2005 OFF 7785256996007248B1.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”