有別於80x86世界多年來遲遲缺乏公定版本的亂象 (到現在「AVX-512之亂」還是沒有停止的跡象),關於作為電腦最基礎「語言」的指令集架構,SPARC一直都有統一的標準。也因此,SPARC指令集相容處理器的發展史,踏滿了眾多廠商的足跡,讓歷代SPARC處理器的型號總數,海放同時期的IBM Power (不算PowerPC)、DEC Alpha、HP PA-RISC以及MIPS (如果只算高階伺服器產品線的話) 等老對手。但這也讓公認當代最強大的SPARC指令集相容處理器,並非出自於創造SPARC的Sun,而是來自日本Fujitsu的SPARC64家族。
硬科技:從Linux大神的抱怨瞧瞧Intel是不是真的做錯了(上)
硬科技:從Linux大神的抱怨瞧瞧Intel是不是真的做錯了(下)
如果科科們還記得現在x86指令集相容處理器的戰場,扣掉Intel AMD加上台灣VIA的Centaur,還有一間俄羅斯的Elbrus。他們所屬的MCST公司,全名就叫做「Moscow Center for SPARC Technologies (莫斯科SPARC技術中心)」,持續研製著一系列被應用在俄系軍事武器的SPARC處理器。蘇聯解體之後,成立於1992年的MCST就跟Sun有長達數年的深度合作,範圍涵蓋了UltraSPARC處理器架構、Solaris作業系統、編譯器和多媒體函式庫。
據說,原本先找上門洽談想與俄國人合作的是惠普HP,那時HP和Intel正展開IA-64指令集與Itanium處理器的研發,但「蘇聯超級電腦之父」Boris Babayan早在1989年,就跟Sun創辦人Scott McNealy碰頭了。畢竟美國人也對冷戰對手的技術深感興趣,更何況「世界上第一個非循序指令執行的RISC處理器」不是1990年的IBM Power1 (僅限於浮點運算指令),或著1993年的IBM PowerPC 601。在1978年完成的蘇聯Elbrus-1,就已經是使用結合超純量、非循序執行與預測執行的RISC處理器了,比美國人整整領先了13年。各位科科的眼睛絕對沒有看錯。
硬科技: 「簡報王」和他們的產地 被VIA併購的Centaur篇
硬科技:鎖定5G邊緣伺服器應用的VIA新世代處理器CHA是什麼?
接著我們回到主題,瞧瞧SPARC指令集究竟有哪些有趣的特色。SPARC指令集全名裡面那個「可延展 (Scalable)」,起因於獨特的「暫存器框格 (Register Window)」,這玩意亦可見於Berkeley RISC、AMD Am29000、Intel的i960與Itanium,即使名稱可能有點不同。像Itanium就稱之為暫存器堆疊 (Register Stack)。
當處理器碰到中斷 (如外部I/O呼叫)、例外 (像算術溢位)、或行程切換 (多工應用環境),須將當前的執行狀態,包含所有可存取的暫存器,都以事先定義好的資料結構回存到記憶體中,如x86指令集的TSS (Task Status Segment),當恢復先前的狀態時,再從記憶體載入回處理器。
近代的程式架構都高度模組化,不同副程式之間的呼叫動作 (Subroutine Call),也會造成頻繁的內文交換 (Context Switch,亦可稱為「程序切換」或「上下文交換」,每次筆者翻譯這名詞的中文都會頭皮發麻),增加暫存器和記憶體間的資料傳輸量。
過於龐大的「程式看得到」的暫存器檔案,也會增加處理器的電路複雜度與內文交換的負擔,並傷害提昇處理器運作時脈的延展性。所以資料暫存器也往往不是多多益善,最起碼對汎用處理器來說的確是如此。
那該如何降低內文交換的負擔,減少多餘的內容值交換?以「空間換取時間」的「暫存器輪擺式移位」Register Window為此而生。ARM指令集的Banked Register也是類似的作法。Intel Itanium處理器的「語言」IA-64指令集也具備相同的機制,但將其名為為Register Stack,看似比較貼切。
Register Window藉由「重疊」不同程序使用的暫存器,即可交換不同程序的資料,但「軟體眼中隨時可見」的暫存器數量仍為32個,8個全域 (Global),剩下24個用來作為Register Window,8個輸入 (In),8個區域 (Local),8個輸出 (Out),邏輯上可視為一個巨大的堆疊,Register Window指標器 (CWP) 一次移動16個暫存器的距離,前一個程序的輸出變成下一個程序的輸入。當程序切換時,無須將專屬於特定程序的8個區域暫存器搬到記憶體,也減少了暫存器和記憶體之間的資料搬移量。
因此SPARC指令集相容處理器的「實際」通用暫存器數量是可變動的,從「力求最低成本」的嵌入式應用,到「重視多工效率」的伺服器和工作站,一般介於72到640之間。假如想要追求副程式之間互通有無的效率,也願意付出比較多的硬體製造成本 (像8個Register Window的UltraSPARC I,144個暫存器擁有多達7個讀取埠和3個寫入埠),Register Window數量就多多益善。但假若想要減少電路成本、又想縮短發生內文交換的處理負擔,那就少一點剛剛好。SPARC全名中的「可延展」其意在此,和日後被人稱道的「多處理器延展性」反倒是一點關係都沒有。
SPARC指令集看起來好像很厲害,但實際上的效能表現與市場優勢究竟如何?也許就會讓很多科科們失望了。