MIPS R10000超標量微處理器

MIPS R10000超標量微處理器

MIPS R10000 採用64位第四代MIPS指令集體系結構的動態超標量微處理器。它在每個時鐘週期內能夠獲取解碼4條指令,並能夠動態地將它們發送到五級完全流水、低時延的執行單元中。在分支之前能夠推測獲取指令並執行。指令按順序逐步完成。儘管有時執行指令會發生故障,但是處理器仍然提供連續的內存的一致性和精確異常處理。

 

 

R10000 是爲了高性能,缺少存儲空間的大型應用而設計的。通過推測執行,它能夠儘早地計算內存地址並初始化高速緩存。它的分層、無鎖存存儲系統能夠通過兩級組聯寫回式高速緩存隱藏存儲時延。圖表1顯示了R10000系統配置,並列出了它的特點。


圖1 系統配置。簇總線直接連接4個芯片
無序超標量處理器十分複雜。爲了應付這種複雜性,R10000採用模塊化設計方法,擁有許多規則結構的控制邏輯,如活動列表、寄存器映射表和指令序列等。

設計原理

 
存儲帶寬和時延限制了許多程序的性能。因爲封裝和系統開銷限制了這些資源,處理器必須有效使用它們。

 

R10000 實現了寄存機映射和通過高速緩存相互重疊來操作的無鎖高速緩存。因此,如果一個指令沒用命中高速緩存,該指令就必須等待高速緩存填充操作,但其他指令就會繼續亂序執行。這會使內存使用增加且有效減少時延,因爲當處理器執行其他指令時,高速緩存填充操作就是早開始進行並且可以高達四個填充操作並行。這種高速緩存設計方式成爲無鎖式高速緩存,因爲高速緩存的太沖並不會阻塞後續的高速緩存行的存取操作。

處理器依賴編譯器支持的I/O優化的指令序列。這種技術尤其對於數據數組有效,如那些使用浮點的應用。對於這些隊列,一個複雜的編譯器能夠優化特定的高速緩存組織。然而,編譯器優化效果對於使用整形的標量應用不太有效,因爲編譯器難以預測哪些指令會使高速緩存未命中。

R10000設計包括基於操作可用性的動態序列指令執行等複雜硬件。這種硬件能夠立即適應高速緩存未命中而造成的指令延遲。這種處理器前瞻執行高達32個可能並行的指令。指令窗足夠大能夠無視將二級高速緩存填充操作時延。但只有指令窗很大能夠無視部分主存時延。

它是一個相對容易的非阻塞高速緩存加入到亂序處理器,因爲它已經包含了指令間協作依賴包含機制。

實現

我們利用0.35微米CMOS技術在一塊16.64×17.934毫米的芯片實現了最初的R10000處理器。這個298平方毫米的芯片包括了680萬個晶體管,其中它的主緩存陣列適用了440萬個晶體管。我們採用完全定製設計實現數據通路和時間要求嚴格的控制邏輯,廣泛採用動態鎖存型邏輯。我們使用靜態寄存器爲基礎的邏輯合成了非關鍵線路。

 

系統的靈活性

備用配置使R10000作爲單處理器或者中多處理器集羣廣泛應用在系統中。該系統採用的snoopy協議或者基於目錄的高速緩存已執行協議。R10000處理器的二級緩存範圍是512字節到16384字節。
 

操作概述

圖2顯示了一個框圖和一個R10000的流水時序圖。其中有六條獨立流水線。


 圖2 R10000框圖(a)和流水線時序圖(b)。框圖顯示了流水線從左到右的相對應的流水線時序

取值在流水線的1-3階段。在階段1中,R10000獲取並排列後四條指令;階段2,R10000進行解碼、重命名這些指令,同時爲跳轉和分支指令計算目標地址;階段3中,R10000將重命名的指令寫入序列,並讀取位狀態表來決定是否操作數是否已經完成。指令將會在序列中等待直到所有操作數準備完成。

當序列在階段3中執行,五條執行流水線開始執行。在第3階段後半處理器開始從寄存器文件中讀取操作數,並在第四階段開始執行。整數型流水佔據一個階段,裝載流水線佔據兩個,而浮點型流水佔據3個。處理器在下一階段前半部分向寄存器文件寫入結果。

整型和浮點型部分有單獨的指令序列、寄存器文件和數據通路。這種分離能夠最大限度減少導線長度,並允許完全並行操作。總之,兩個寄存器文件相對於整合單元更需要自由的寄存器,但他們體積小,因爲每個寄存器很少讀寫端口。

 

取指令

對於良好的性能來說,處理器在更高帶寬下取指解碼比執行指令更爲重要。保證指令充滿序列非常重要,這樣就能夠亂序執行指令。最終,處理器取到比它能夠執行指令數還多的指令,因爲它摒棄預測分支發生錯誤的指令。

如圖3所示處理器在階段1中取指令。指令緩存包含了地址標誌和數據部分。實現兩路組相連,每一個部分都要有並行序列。處理器比較兩個變量地址轉換到物理地址來從正確的地址選擇數據。8項指令轉移查找緩存包括了主TLB的一個子集。




圖3  獲取指令——流水線第一階段

該處理器在16字指令高速緩存行中並行獲取四條指令。如圖4所示,我們通過對高速緩存的讀出放大器進行小的修改來實現。每一個讀出放大器的存儲陣列4位寬,還有4對1多路開關來選擇一列(其代表了一個指令)來獲取指令。R10000通過對每個獨立的指令進行單獨選擇信號來獲取。如果可能的話,指令可以輪換來保證它們能夠按順序解碼。這種順序能夠減少大量的依賴邏輯。



圖4 從指令緩存中非對齊獲取指令

通常,處理器在下一個週期中解碼所有四條指令,除非該隊列或活動列表已滿。爲了簡化順序讀取的時序,未及時解碼的指令仍要留在8位指令緩存中。

分支單元

分支指令經常發生,並且需要快速執行。然而,處理器通常直到解碼後的多個週期內也不能決定分支方向。因此,處理器預測了一個條件分支的方向,那麼將會沿着預測的路徑進行取指令。預測一個基於512項分支歷史表的2位算法。這個表有位11:3的分支指令的地址進行索引。仿真結果顯示,Spec92整型程序預測成功率爲87%。

在MIPS體系結構中,處理器在目的地址執行指令之前通常會跳轉或分支執行下面的指令。在一個流水線標量處理器中,目標指令從高速緩存中讀取目標指令時,這種延遲槽指令能夠無損耗的執行。這種技術在早起的RISC微處理器能夠有效提高分支。然而,對於一個超標量設計,它並沒有性能上的優勢,但我們仍然保留了R10000的兼容性。

當程序執行需要跳轉或分支時,該處理器拋棄所有已經超出延遲槽的獲取的指令。它加載跳轉目標地址進入程序計數器並在一個週期延遲之後從高速緩存中獲取新的多個指令。這裏介紹的“泡沫分支”週期中,R10000沒有解碼任何指令。

分支堆棧。當處理器解碼一個分支的時候,處理器將通過一個四目分支棧來保存它的狀態。它包含了備用分支地址、整型和浮點映射表的完整備份和雜項控制位。儘管堆棧作爲一個單一邏輯實體,它在物理上分佈更接近它的信息副本。

當分支堆棧已經滿了,處理器將會繼續解碼直到它遇到下一個分支指令。一直解碼,直到未決定的分支問題得到解決。

分支確認。即使有些分支即將要執行,處理器也會驗證每一個分支預測的確定條件。如果預測不正確,處理器會立即終止所有沿着錯誤預測路徑獲取的指令,並恢復其分支棧內的狀態位。

沿着錯誤預測路線獲取指令可能不需要高速緩存讀寫來啓動。在這種情況下,指令集高速緩存是無鎖的,而指令集高速緩存在處理器獲取正確預測路徑時需要填充完整。這樣進行填充高速緩存十分容易,因爲程序執行需要快速獲取其他分支方向,比如說一個循環的結束。

一個四位的分支標記——對應着分支堆棧的條目——會伴隨隊列中和執行流水線的每一條指令。這個標記表明待處理分支與指令之間的依賴關係。如果這些分支預測失敗了,當分支決策改變,處理器會立即中止這些指令。每當R10000改變分支的時候,它都會在流水線中重置相應的屏蔽位。

解碼邏輯

R10000處理器能夠在階段2中同時解碼映射4條指令,同時在階段3開始的時候將它們適當地寫入指令隊列。

當活動列表或者隊列滿了的時候停止解碼操作,但很少有取決於解碼指令類型的解碼限制。主要例外情況包括了整數除法和除法指令。它們的結果將會進入兩個特殊的寄存器——HI 和 LO。沒有其他指令有多個結果寄存器。我們不需要爲這些不常使用的指令設置太多了的邏輯,相反,它們在活動列表內佔據了兩個槽。當寄存器解碼這些指令的時候,它不會在同一週期內解碼其他後續指令。(此外,處理器也不能夠在一個週期內將一個整數乘法或除法指令當成第四個指令進行解碼。)

指令的讀取和修改操作確實控制着寄存器的連續執行。處理器僅僅能夠運行這些少數在流水線爲空時在內和操作系統模式的指令。這些限制對於處理器的整體性能並沒有任何影響。

寄存器映射

圖5顯示了R10000的寄存器映射硬件。爲了打亂原有程序指令的執行順序,處理器必須記錄寄存器操作數、內存地址和條件位的依賴關係。(條件位是指爲浮點比較指令設計的靜態寄存器的8位。)爲了確定寄存器的依賴關係,R10000適用了寄存器重命名。它決定了內存地址依賴於地址隊列。它設定了在其值確定解碼時每一個條件位操作。如果不是確定的值,它將通過浮點比較指令的標誌來重命名該位,並確定其值。


圖5,寄存器重命名,流水線第二階段。R10000在預解碼指令階段進行重新排列,並在填充階段將指令寫入緩存中。高速緩存中的指令格式包含一個額外的4字段單元

從一個程序員的角度來看,指令應該在程序內順序執行。當一個指令裝入一個新值並傳入它的目的寄存器,新值就能夠立即被隨後的指令使用。然而,一個超標量處理器能夠同時執行多條指令,指令的值也不能夠立即傳給後續指令。通常,下一個指令必須等待它的操作數有效,但可能後續指令的操作數都能使用了。

R10000通過亂序指令後續指令獲得更高的性能,但程序員是看不到這些指令的重新排序。任何亂序產生的結果在先前指令完成時都是暫時的。這些指令執行,其結果也會作爲處理器的狀態。到指令完成之前,如果預測錯誤或分支異常都可以終止進行。它的邏輯目標寄存器的內容都可以通過恢復以前的映射來恢復原來的數據。

對於多數處理器來說,對硬件寄存器文件中的引用指令區和物理寄存器的邏輯寄存器數據並沒有區分。每一個指令區直接對應相應的寄存器。然而,我們的重命名策略動態映射邏輯寄存器數據到物理寄存器的數據。處理器會將每一個新的結果寫入一個新的物理寄存器。映射後,處理器僅通過比較物理寄存器數據獲取依賴關係,同時也不再需要考慮指令順序。同時,這些物理寄存器和邏輯寄存器與物理寄存器的映射關係對於程序員也會是不可見的。

R10000執行在解決先前指令所有的依賴關係之後纔會動態執行指令。也就是說每一條指令必須等待所有的操作數計算出來才能夠執行。無論最初的指令序列如何,R10000都能夠執行該序列。爲了正確執行指令,處理器必須判斷每一個操作寄存器是否已經準備好了。因爲邏輯寄存器的數據可能是模棱兩可的操作值,所以這是十分複雜的。禮服,如果多個指令同時在一條流水線中執行相同的邏輯寄存器,這個寄存器很可嗯呢該同時多次加載不同的值。

每一個物理寄存器都會在空閒列表的每一個任務後寫一次。物理寄存器寫入的時候一直是忙碌狀態。如果後續指令需要它的值,這條指令會等到物理寄存器寫入。當寄存器寫入之後,指令還在準備且它的值也不會改變。當一個後續指令改變了與它一致的邏輯寄存器時,程序不會在需要舊值,就餓物理寄存器也會重新使用。因此,物理寄存器經常是不確定的值。

處理器中一個有33個邏輯整型寄存器(1至31號、Hi和Lo)和64個物理整型寄存器。(沒有整形寄存器0,零操作字段表示零,一個零目的域表示未存儲的結果。)同時,處理器有32個邏輯浮點寄存器(0至31號寄存器)和64個物理浮點寄存器。

寄存器映射表。單獨的寄存器文件存儲處理器獨立重命名的整形和浮點型寄存器。整型和浮點型映射表包含了當前邏輯寄存器映射到物理寄存器的信息。處理器使用5位的指令域選擇邏輯寄存器。在相應寄存器文件中通過六比特位地址來識別物理寄存器。

浮點表通過一個32×6位的多路RAM中寄存器f0至f31映射。整形表通過一個33×6位的多路RAM中的寄存器r1至r31、Hi和Lo來映射。(對於整型乘法和除法指令的隱藏目的寄存器Hi和Lo有特殊的訪問邏輯。)

這些映射表有16個可讀端口和4個寫端口同時映射4條指令。每一個指令讀取單個操作數和一個目的寄存器的映射。處理器在指令隊列中寫入當前操作數映射和新目的映射,同時活動列表保存了此前目的映射。

空閒列表。整形和浮點型空閒列表包含了當前未分配的物理寄存器列表。應爲處理器同時解碼執行4條指令,其中列表包括了4個並行8位長的循環FIFO列表。

活動列表。活動列表記錄了處理器正在執行的所有指令,並附加每個處理器解碼的指令。當指令之行結束之後或者錯誤的分支預測和異常導致指令中止,活動列表會移除這些指令。活動列表也包含4個並行8位長度循環FIFO列表能夠執行高達32個指令。

每個指令都通過5位標誌同活動列表的地址比較來確認。當一個執行單元完成一條指令時,指令會將它的標誌送入活動列表,並標記它的完成位。

活動列表包含了邏輯目的寄存器號和沒一條指令的舊物理寄存器號。一條指令的完成會生成新的映射,所以舊的物理寄存器需要返回空閒列表來重新被使用。

然而, 當異常發生時,隨後的指令並不會完成。相反,處理器會將舊的映射關係從活動列表中保存起來。R10000不會用相反的順序來每個週期映射4條指令,以防止兩次重命名爲相同的邏輯寄存器。儘管這樣比儲存分支慢,但這種意外比分支預測還要罕見。處理器通過重新讀取指針返回新的物理寄存器到空閒列表。

忙位表。對於每一個物理寄存去,整型和浮點型忙位表都包含一位來顯示是否寄存器當前含有有效值。每個表都採用一個64×1的多端口RAM。當空閒列表內移除相應寄存器號時,忙位表會設置改位爲忙。當執行單元將值寫入到寄存器中,忙位表會重置該位。十二個讀寫端口確定每四個新解碼指令的三個操作數狀態。序列採用其他三個端口來記錄特殊的指令,例如整型浮點型寄存器文件的移動。

指令序列

R10000會依據類型將每條解碼指令除了跳轉和無操作數指令放入三個指令隊列中的一個。只要有空間,序列就能夠接受新指令的任意組合。

該芯片的週期時間束縛着我們對序列的設計。例如,我們想要通過兩個寄存器文件讀取端口獲取每一個發出的指令來避免延遲仲裁和複用操作數總線。

整型隊列。整形隊列包含了不定序的16個條目,當指令解碼時會分配一目到每一個整形指令中。只要指令發送到ALU中,序列就會釋放對應的條目目。

對於一個指令,只有一個ALU能夠獲取執行優先權。因此,分支和移位指令會優先使用ALU1,整型乘法和除法指令優先使用ALU2。爲了更簡單點,隊列中的位置比指令實現對於指令發送更有優先權。然而,輪詢請求電路會提升舊指令請求ALU2的優先權。

圖6顯示整型隊列條目的內容。對於一個指令,只有一個ALU能夠獲取執行優先權。因此,分支和移位指令會優先使用ALU1,整型乘法和除法指令優先使用ALU2。爲了更簡單點,隊列中的位置比指令實現對於指令發送更有優先權。然而,輪詢請求電路會提升舊指令請求ALU2的優先權。

圖6整型指令隊列,僅有一個發送端口。隊列能夠同時發出兩條指令。

操作數C含有狀態位的值或通過浮點比較指令來設置其值的標誌。總體而言,16目中的每一個都包含了6位比較碼。

隊列中將功能碼和立即值發給執行單元。如果一個指令因爲錯誤的分支預測而中止,分支會標記其目的地。在處理器在該階段完成指令的時,標誌會在活動列表中設定完成位。

整型的單週期延遲說明發雜的整型序列時序和邏輯。在一個週期內,序列必須發出兩條指令,檢測哪些操作數就緒並請求相關指令。圖7a顯示了這個過程。

爲了實現兩個週期的負載延遲,假設負載竟會成功完成,依賴於一個整型負載的結果必須暫停發出。當負載錄取數據緩存時,相關指令必須在執行的前一週期發出。如果由於緩存未命中或依賴問題造成裝載失敗,相關依賴指令的發送必須被中止。圖7b顯示了這一過程。

圖7 釋放寄存器依賴整型隊列(a)和指令的試探性發送依賴於早期裝載的指令

地址隊列。地址隊列含有16條目。不同於其他兩個隊列,地址隊列是可以保留期指令的原始順序的循環FIFO隊列。當處理器解碼每一條裝載存儲指令時,隊列會分配一個條目,當處理器完成該指令時,隊列會移除該條目。隊列使用指令順序來決定內存依賴,最早的指令獲取優先權。

當處理器還原一個錯誤的分支預測時,地址隊列會移除所有通過恢復寫指針來恢復的分支解碼指令。隊列使用類似在整型隊列邏輯將指令發送到地址計算單元,所不同的是這兩個邏輯只包含了兩個寄存器操作數。

地址隊列比其他的隊列都複雜。如果裝載存儲指令具有內存地址依賴或數據緩存中缺失,地址隊列需要重試操作。

兩個16位×16位的矩陣追蹤內存訪問的相關性。每一行每一列對應着隊列的條目。第一個矩陣通過追蹤相同的緩存集避免了不必要的緩存顛簸(虛擬地址135)。無論哪一種方式,都可以用於亂序執行指令。但是存在對於相同緩存集的不同線路兩個或兩個以上隊列條目,另一個方式是保存訪問緩存集的最舊的條目。第二矩陣追蹤裝載了作爲掛起存儲指令相同字節的指令。它通過比較雙字地址和8比特位字節標記匹配。

每當外部接口訪問數據高速緩存時,處理器都會比較索引和隊列中所有掛起條目。如果一個裝載條目和填充地址匹配,它就會直接將填充數據放入它的目的寄存器中。如果一個條目匹配了無效指令,那麼該條目狀態會被清除。

雖然地址隊列亂序執行裝載存儲指令,但他還是保持着連續存儲器的一致性。然而,外部接口能夠通過在指令裝載到寄存器後裝載指令完成之前使緩存行無效來違反存儲器一致性。在這種情況下,隊列創建一個加載指令的軟異常。這種異常會清空流水線,中止裝載和其他後續指令,因此處理器不適用舊數據了。之後,處理器會中止異常,從中止加載指令開始正常運行。(這種策略保證了前行進程,因爲舊指令會在其他指令完成後立即完成。)

存儲質量要求地址隊列和活動列表之間的具體協調。當存儲指令完成後,隊列必須精確地寫入緩衝。

MIPS架構通過加載鏈接(LL)和條件存儲(SC)指令來模擬內存原子操作。因爲不需要鎖定內存,所以這些指令不需要複雜的系統設計。在典型的序列中,處理器通過LL指令加載一個值,測試並修改它,之後再通過SC指令有條件的存儲。只要在緩存中的值和鏈接詞沒有衝突,SC指令就能夠寫入內存。處理器使用1或0加載其結果寄存器顯示內存是否寫入。

浮點隊列。浮點隊列包含16目。同整型隊列相似,但浮點隊列不包含立即值。由於額外的佈線延遲,浮點負載有三個週期的延遲。

寄存器文件

整數和浮點寄存器文件都包含64個物理寄存器。執行單元直接從寄存器文件讀取寫回操作數。結果可能繞過寄存器文件進入操作數寄存器中,但沒有獨立結構,如保留站或寬數據路中的重排序緩衝器。

整型寄存器文件有7個讀端口和3個寫端口,包括了2個專用的讀端口、每個ALU的一個專用寫端口和2個專用於地址單元的的讀端口。整型寄存器第七個讀端口處理存儲、跳轉寄存器和轉向浮點指令。第三個寫端口用於處理裝載、分支鏈接和轉回浮點指令。

一個段的64字×1條件文件顯示是否對應的物理寄存器的值是非零的。它的三個寫端口能夠同時操作三個整型寄存器文件。它的兩個讀端口允許整型浮點型條件移動指令來測試單個狀態爲非整個寄存器。在寄存器文件中,該文件使用的面積比兩個額外的讀端口還少。

浮點寄存器文件含有五個讀端口和三個寫端口。加法器和乘法器都各含有兩個專用讀端口和一個單獨的寫端口。第五個讀端口處理存儲和移動指令。第三個寫端口處理加載和移動指令。

整型執行單元

每個週期中,整型隊列能夠發送出兩條指令到整型執行單元中。

整型ALU。兩個ALU各包含一個64位加法器和邏輯單元。此外,ALU1包含了一個劉思偉轉換器和分支條件邏輯,ALU2包含了一個部分整型乘法陣列和整型除法邏輯。圖8顯示了ALU1框圖。每一個ALU都有兩個能夠從寄存器文件裝載操作數的64位操作數寄存器。爲了達到一週期的延遲,寄存器文件的三個寫端口會通過旁路進入操作數寄存器。



圖8 ALU1框圖

整型隊列控制所有的ALU。它提供了功能代碼、立即值和旁路控制等。

整型乘法和除法。ALU2迭代計算整型乘法和除法。如上文提到 的,這些指令包含了兩個目的寄存器——Hi和Lo。對於乘法指令,Hi和Lo包含了雙精度的高低兩部分。對於除法,它們包含了餘數和商。

ALU2 使用Booth算法計算整型乘法——即通過乘法器的每兩位產生部分結果。這種算法每個週期產生並累計四個部分積。ALU2在指令發出的第一個週期和最後存儲結果的兩個週期工作。

爲了計算整型除法,ALU2使用一種不需要存儲的算法每週期計算一位。ALU2在整個操作都是工作的。表格1列出了普通整形指令的等待時間和重複率。


 


浮點執行單元

圖9顯示了浮點執行單元的尾數數據路徑(指數邏輯沒有畫出)。加法器和乘法器有三級流水線。兩個單元都是具有單週期重複率完全流水線。結果能夠繞過兩個或三個週期的延遲。所有的浮點操作數將從浮點隊列中發出。

圖9 浮點執行單元框圖

在浮點寄存器文件中採用IEEE標準574的單精度或雙精度格式封裝浮點值。執行單元和所有內部旁路使用明確存儲隱藏位和分離出11位指數和53位尾數的非壓縮格式。讀取時操作數解壓縮,結果在寫回之前壓縮。壓縮與解壓縮依據單精度和雙精度的選擇,並通過雙輸入多路複用器來實現。這種邏輯是在執行單元和寄存器文件之間的。

浮點加法器。加法器做浮點加法、減法、比較和轉換操作。第一階段內減去操作數的指數,選擇較大的操作數,然後在55位右移對齊較小的尾數。第二階段是根據操作盒操作數的跡象,增加01減去尾數。

數量級大的加法會產生進位,正常傳值的情況下需要右移一位。通常,處理器需要對結果進行四捨五入。爲了避免額外的延遲,一個雙進位鏈加法器能夠同時產生+1和+2的兩種和。如果操作數需要右移後正常化,處理器會選擇+2鏈。

另一方面,一個大數量級的減法可能引起大量的消除,產生高階零的結果。前導零預測能夠決定電路中有多少由減法產生的高階零。它的輸出控制着一個55位左移正常化結果。

浮點乘法器。乘法器在完全雙精度序列中完成浮點乘法。因爲乘法器沒有加法器忙碌,所以乘法器包括執行移動和條件移動操作的多路轉換器。

在第一個週期中,單元會使用布斯算法改寫53位乘法器的尾數、選擇27位部分結果(通過布斯算法的加密,僅有一部分結果需要乘法器的兩位操作)。壓縮樹使用(4,2)陣列來進位保存加法器,加法器計算四位得出兩個和與進位輸出。在第二週期期間,使用一個106位的進位傳播加法器來獲得106位的和與進位值。

浮點除法和平方根。兩個獨立的迭代單元計算浮點除法和平方根操作。每一個單元都使用SRT算法在每個迭代週期生成兩位。除法單元通過每個週期生成四位來級聯每一週期的兩個階段。

這些單元與乘法器共享寄存器文件端口。每個操作數先佔據兩個週期。第一個週期會先發出指令,並從寄存器文件中讀取操作數。操作結束後,單元會利用第二個週期將結果寫入寄存器文件。

表格2列出了常用浮點指令的延遲和重複率。

存儲器層次結構

內存延遲對於處理器性能影響極大。爲了高效運行大型項目,R10000利用兩級組相聯高速緩存實現了一個無鎖的內存層次結構。芯片上的主要指令和數據高速緩存能夠在低延遲高帶寬下同時工作。芯片同時也控制着一個大型的外部二級高速緩存。所有的高速緩存使用LRU替換算法。

同時所有的主緩存都是用虛擬索引地址和一個物理地址的標誌。爲了最大化降低延遲,處理器能夠同時利用TLB進行地址轉換和連入主緩存。因爲每個緩存通路都有16Kb大小(最小虛擬頁的4倍大),兩個虛擬索引位和物理地址標誌位大小不同。這種技術是爲了簡化高速緩存的設計。使用該設計的緩存性能好,同時在程序利用並立的虛擬索引指向同一個頁時也表現良好。處理器存儲這兩個虛擬地址位作爲二級緩存標誌位的一部分進行保存。二級緩存控制器能夠檢測到任何的錯誤,並確認主緩存只保留了每一個緩存列唯一副本。

加載、存取單元。 圖10所示加載、讀取單元和數據緩存的框圖。地址隊列加載、讀取指令到地址計算單元和數據緩存中。當該緩存不忙,裝載指令能夠同時進入TLB、緩存標誌數組和緩存數據數組中。這種分佈接入的結果造成了雙循環加載延遲。



圖10 地址計算單元和數據緩存框圖

地址計算。R10000使用兩個64位寄存器或者一個寄存器和16位即時空間來計算虛擬內存地址。這導致了ALU或數據緩存器繞過了寄存器文件到操作數寄存器中。此時TLB會將這些虛擬地址轉換成爲物理地址。

內存地址轉換(TLB)。MIPS4代體系結構定義了64位尋址。實際實現中採用最大尋址寬度來降低TLB和緩存標誌隊列的開銷。R10000全相連轉換旁氏緩衝器將44位虛擬地址轉換成40位物理地址。這種TLB設計與R4000設計相同,但我們將R10000提升到64個條目。每一個條目映射一組虛擬頁,並獨立選擇在4Kb到16Mb之間的4個隨意大小的頁面。TLB包括了能夠比較虛擬地址的內容可尋址處理器(CAM部分)和一個包含相應物理地址的RAM部分。

主指令緩存。一個32K的指令緩存包含了8192個指令字,每一個都預先解碼成一個36位的格式。處理器在解碼擴展格式上比原來的指令格式更加快速。特別是,額外四位即功能單元能夠執行指令。這種預先解碼也能夠重新排列操作數(和目的地),爲每一個指令選擇字段放在相同的位置上。最後,處理器修改一些OpCode來簡化整型解碼和浮點目的寄存器。

並行處理器同時從緩存行裏獲取四個指令,同時緩存命中邏輯所要選擇的指令。這些指令不需要一致的四字地址,但他們不能夠交叉在16字緩存行裏。(參見圖3)

主數據緩存。數據緩存爲了增加帶寬插入了兩個16Kb大小的槽。處理器依靠以下四個需求通道處理每個槽的標誌和數據數組:

外部接口(填充數據,插入等),

爲新的計算地址進行標誌檢查,

 重新加載指令,和

獲取存取指令。

爲了簡化接口和減少所需要的緩衝,外部接口設置了隊列的優先級。它的請求法正在高速緩存讀寫的兩個週期之前,所以處理器能夠依靠管道分配剩餘資源。

數組緩存有8個字行大小,這是一個爲了方便的妥協。更大的字長會減少標籤RAM隊列面積和適度降低未命中率,但在填充高速緩存時會消耗更多的帶寬。設置成一個8個字大小,二級緩存的帶寬就能夠支持三到四個重疊填充。

每一個數據緩存的兩個槽包括了兩個邏輯隊列來支持雙向組關聯。然而不同於平時的設置,緩存通路在這些有效支持不同帶寬通路的隊列中輪換,如圖11所示。

 

圖11 數據緩存內的通路設置

處理器同時從兩個高速緩存通路讀取相同的雙字,因爲它能夠並行檢測緩存標誌,並能夠從正確的緩存通路里讀取數據。處理器將正確的通路上的雙字丟棄。外部接口通過兩個雙字並行填充或寫入四字。因爲處理器事先知道了正確的緩存,所以能夠實現。

這種安排有效地使用了緩存讀出放大器。每一個放大器包括一個4-1多路複用裝置,因爲每個放大器都有4列存儲單元。我們通過改變邏輯選擇實現了這個特性。

二級緩存。我們使用外部同步靜態RAM芯片來實現512Kb到16Mb、雙路組相連的二級緩存。根據系統需求,用戶能夠配置二級緩存通路是16字或者32字。

 組相連設置能夠減少衝突失誤、增加可預測性。然而對一個外部緩存來說通常需要特別的RAMS或者許多接口引腳來解決組相連。相反,R10000僅用標準同步SRAM和一個額外的地址引腳實現了雙向虛擬組相連二級緩存。

圖12顯示了高速緩存如何利用管道填充。一組RAM包括了兩條高速緩存通路。一個片載位隊列能夠追蹤每個緩存組的最近使用。在主高速緩存未命中之後,將會通過這條路在二級緩存中讀取兩個四字大小的數據。讀取其中一個四字時會一起讀取標誌位。通過額外的地址引腳綁定的方式,另一個替換路的標籤會隨着第二個四字一起讀取。



 圖12 從組相連的二級緩存中填充數據。在這個例子中,二級緩存的時鐘同處理器內部時鐘一致。實際中,二級緩存時鐘慢一些。

三個例子會發生:如果第一路命中,數據會被立即數用,如果是替換路命中,處理器會再次讀取二級緩存。如果都沒有命中,處理器會在內存中查找數據填充二級緩存。

大型外部緩存需要用糾錯碼來保證數據完整性。R10000保存了一個9位的ECC碼和每四字大小的奇偶校驗位。額外的校驗位能夠減小延遲,因爲他們能夠快速檢測並阻止無效數據的使用。如果處理器檢測到一個矯正錯誤,它會試着重新通過雙週期校正通路讀取數據。

我們能夠配置接口來爲讀取修改通路。儘管這樣會使延遲增大,但它允許冗餘鎖步處理器在校驗誤差存在的情況下保持同步。

系統接口

R10000通過64位分離事務系統總線與數據地址多路複用來和外界通信。這種總線能夠連接高達8個讀請求的四個R10000芯片。

系統接口良好的支持了併發請求和亂序操作。高速緩存填充在高達四個來自二級緩存或主存的未付讀請求下也是無鎖的。這些都是有未命中處理表來控制的。

緩存緩衝區包含了四個未付讀請求地址。從這些請求中返回的存儲數據都被存在四目傳入緩衝區內一片與他們能夠在某一命令下能夠被讀取。傳出緩衝區有高達五個Victim塊寫回內存。當總線連接的二級緩存無效時,緩存需要寫入第五條目中。

一個8目集羣緩衝在系統鍾先生追蹤所有未完成的操作。如果必要的話,它要通過查詢或令緩存行無效來確保緩存一致性。

當無緩存的裝載、儲存指令成爲指令通道中第一個時,爲緩存的裝載、存儲保指令都會執行。出其裏通常爲圖形或其他設備寫入使用無緩存保存。這樣的序列通常含有大量的順序同一地址訪問。這種無緩存的緩衝會自動收集他們進入32字大小的塊內來保護總線帶寬。

時鐘。一個芯片上的鎖相環生成所有的時間與外部接口時鐘同步。爲了系統設計和靈活升級,獨立時鐘分頻器能夠給用戶五個二級緩存和七個系統接口時鐘頻率的選擇。爲了提供更多的選擇,我們的時鐘基於管道時鐘兩倍的振動的鎖相環。當管道運轉在200MHz時,鎖相環運轉在400MHz。同時,用戶可以配置系統接口以200、133、100、80、66.7、57或50MHz下運轉。此外,用戶可以單獨配置二級緩存的頻率爲200MHz或66.7MHz。

輸出驅動。數組緩衝驅動芯片輸出針腳。用戶可以單獨配置每一組低壓CMOS或HSTL標準。每一組緩衝設計都有獨特之處。

圖13表明了這些緩衝是如何連接的。系統接口緩存包含了額外的開放通道下拉晶體管,還需要提供驅動HSTL2類多路總線的額外電路。


圖13 時鐘和輸出驅動

我們設計二級緩存數據緩衝來減少切換時的重疊電流峯值,爲了近200個信號能夠同時切換。

緩存地址緩衝使用快速標誌極電晶體來快速驅動多個分佈式負載。緩存時鐘緩衝以最小的輸出延遲來驅動低阻抗微分信號。低抖動延遲單元精準地對齊所有的時鐘。這種延遲是靜態配置的以校正印刷在電路板上的時鐘網的傳播延遲,所以這些在高速緩存中的時鐘與處理器內部時鐘同時到達上升沿。

測試性能。爲了經濟生產,一個微處理器芯片必須能夠容易在高錯誤覆蓋率下進行測試。R10000通過10個128位線性反饋移位寄存器來觀察內部信號。這些內部測試點將芯片分爲三個完全觀察部分。

寄存器是獨立結構才能夠對處理器邏輯或對添加一個明顯負載觀察信號無影響。寄存器使用處理器時鐘來保證同步行爲並避免任何特別始終請求。寄存器對於調試和生產設施用處極大。

性能

我們現在在SGI挑戰服務器上裝載200MHz的R10000微處理器,而其他幾個供應商也會因爲R10000的特別設計開始在系統中使用R10000處理器。我們規劃瞭如下的一個系統——200MHz R10000微處理器,4Mb的二級緩存(200MHz),100MHz 的系統接口總線和180ns的內存延遲。該系統性能表現如下:

    ·SPEC95 整型(最高值) 9

    ·SPEC95 浮點型(最高值) 19

這些數據是我們在R10000運行在上文中提到的設計系統中所表現的性能指標。我們按照MIPS Mongoose編譯器早期版本編制的這些基準。

一個高效的超標量微處理器R10000具有快速時鐘和無鎖組相連內存子系統的特點。它的設計強調了併發性和隱藏延遲技術在大型真實程序中的高效運用。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章