簡報時代背景:距筆者打字時將近二十年前的2001年秋季微處理器論壇 (Microprocessor Forum),AMD技術長Fred Weber正式對世界揭露了其64位元x86指令集的全貌,也變相宣告了AMD盛世的來臨。
時至今日,64位元x86指令集—姑且不論叫做Intel64、AMD64還是x64—已經歷經將近二十年的光陰 (當筆者打字的時候),時下絕大多數作業系統與應用程式也幾乎64位元化,像nVidia更在2018年4月就宣佈停止提供32位元驅動程式。本期簡報王就帶著各位科科回到AMD公開x86-64指令集的現場。
x86指令集一直有著缺乏資料暫存器的宿疾,無論是整數邏輯運算、浮點運算、與SSE/SSE2都只有八個,而會破壞一個運算元 (如暫存器或某個記憶體位址) 資料的雙運算元格式 (例如A = A + B,原本的A資料會被蓋掉) 更讓這個問題雪上加霜。反觀以目標高效能應用的RISC指令集,如Power、SPARC、Alpha、PA-RISC、MIPS、以及ARMv8,清一色都是標準32個暫存器以及三運算元格式 (C = A + B),像Intel IA-64更是多達128個暫存器 (但這也是難以大幅提昇Itanium處理器時脈的潛在障礙)。
AMD透過刪除INC/DEC指令,硬是擠出空間實作REX prefix,提供64位元模式新增暫存器的指令編碼空間,讓x86指令編碼中所有可標定暫存器的3位元欄位,都擴展到了4位元,只要指令多出了REX Prefix這1個Byte,64位元x86處理器即可享受到倍增的資料暫存器。
所以當這張簡報登場時,不難想見眾人興奮的心情,即使還是明顯比不上那票RISC指令集。
不過,作業系統與應用程式不一定會用到新暫存器,代表REX並非「必備品」,當啟動新暫存器時,REX會無預警增加指令長度,提高最佳化指令解碼器設計的困難度。AMD發表x86-64時很多人拍手叫好,但實際上因過度重視對32位元的相容性與最低的硬體修改成本 (K8是由K7延伸出來的產物),AMD的擴充手段並不乾淨俐落,日後也同時造成所有 (實質上也就剩下那兩家) x86處理器廠商的困擾。
唯一可以肯定的是,微軟在這件事狠狠的捅了Intel一刀。在2002年微軟深陷反托拉斯風暴,時任AMD執行長的Jerry Sanders在法庭作證與微軟Bill Gates的電話對談內容 (還曾公布在微軟網站),坦承當AMD得知微軟不打算同時支援兩套不同的64位元x86指令集,暗示「如果微軟選了Intel,AMD就出局」,希望以推出Windows CE對應處理器 (Geode系列) 等條件,說服微軟不要選擇Intel的64位元備胎 “Yamhill”,冀望藉此讓AMD的市場佔有率從20%躍升至50%,與Intel平起平坐。
Intel自家的64位元x86指令集 “Yamhill” 的原始樣貌已不可考,裝死中的筆者也沒閒功夫去探勘堆積如山高的專利史籍,但光憑AVX帶給世人的印象,有如克勞賽維茲「戰爭論」唯一定稿的第一章,光靠想像即可深信Yamhill絕對比AMD x86-64緊緻有條理,且具備更佳的實作性與擴充性。Intel在邁進二十一世紀時,一同搞砸Itanium和NetBurst,再被微軟在x86-64補這一槍,讓他們花了近十年才從AMD手上奪回戰略主動權。微軟手上握有作業系統大權的講話份量,由此可見略見一斑。
首款支援x86-64指令集的K8 “Hammer”處理器整體架構,最大亮點還是整合DDR記憶體控制器與HyperTransport匯流排。
請各位科科多多仔細盯著不同區域的顏色,因為這和後面解釋管理運作流程息息相關,這也是複習計算機概論和了解指令管線運作細節的好機會。
管線分成四個區域:擷取指令、執行指令、存取L2快取、存取主記憶體。
從L1指令快取擷取指令並解碼成微指令。
執行單元在執行微指令時,也同時會動用位址計算單元 (AGU) 和存取L1資料快取。拜x86指令集有著非常複雜的定址模式,如何實做出高效能的位址計算器,一直是研發x86處理器的大麻煩。
存取L2快取時,透過標籤 (Tag) 獲得所需資料區塊的內部位址。後面就都是強迫大家回想起快取記憶體原理的內容了。
記憶體控制器內建在處理器內部,不僅縮短處理器核心存取記憶體控制器的延遲,更可以讓記憶體控制器與核心同時脈,進一步提高效能。
這在講動態分支預測,AMD利用「L1指令快取的資料被擠回L2時,L2的ECC形容浪費 (L1指令快取只有Parity偵錯,沒有ECC糾錯)」的特色,將分支選擇器「偷放」在這個欄位,以增強分支預測的記憶體位址涵蓋範圍,兼顧效能與成本,堪稱非常厲害的巧思。這裡也列出四種不同情況的指令擷取管線流程,從循序擷取、預測擷取、計算分支目標位址的擷取、到讓指令白跑的預測錯誤擷取,非常值得一看。
強大轉譯後備緩衝區與分頁描述器快取,足以應付分支密集且狂吃記憶體頻寬的伺服器端應用軟體。
讓實作多處理器環境與擴充記憶體容量更加容易的HyperTransport匯流排。
當北橋記憶體控制器都「包」在處理器晶粒之中,自然也不必擔憂雙核心甚至多核心連接記憶體控制器的頻寬,這也讓AMD打從一開始,就讓K8直奔原生雙核心的設計,更在2004年8月31日就公開雙核心樣品,隔年4月後準時登場,這是AMD x86處理器發展史上最重大的戰略勝利。
北橋記憶體控制器的運作流程,包含發出命令與傳輸資料。請注意,每個區塊的顏色依舊對應著前面的管線運作流程。
「快取資料一致性協定」對多處理器環境效能有著舉足輕重的影響,而AMD K8的MOESI協定則有著極為出色的表現。
桌機、筆電和工作站的單處理器系統組態概觀。
雙處理器。
四處理器。
八處理器。
接著就是我們所熟知的故事:AMD迎來x86伺服器市場曾一度擁有高達30%市占率的盛世。
硬科技:做為AMD全盛時期象徵的Opteron處理器:全盛期(2003-2007)
硬科技:做為AMD全盛時期象徵的Opteron處理器:逆轉期(2007-2010)
硬科技:做為AMD全盛時期象徵的Opteron處理器:崩潰期(2010-2017)
據傳AMD的Zen 4將會全面性支援AVX-512指令集,也會有更激進的微架構強化,意味著將與Intel全面決戰,也許Zen 4的簡報也會像二十年前這份一樣的在歷史上享有盛名吧,科科。
1 則回應
但實際上ms釋出x64相容的windows是在Linux AMD64版之後幾年的時間
在AM64變成x86_64被全世界相容 實際上ms扮演的角色微乎其微,畢竟大家已經多花了好幾年的時間開發AMD64 不可能還多花成本相容intel的版本 而且事實上intel的EM64T大部分也相容AMD64 也沒什麼必要相容它
然而K8的AMD64並非AMD取得市場的關鍵
完全是intel開發方向錯誤導致的
即便AMD沒有K8 而是繼續用K7架構 一樣會比intel的好賣
用K8的opteron也不是因為AMD64指令集而大賣,伺服器大部分還是用32bit去跑opteron
就單純k7架構下小改款的k8依舊比intel的netburst強很多
所以這篇用AMD64來看AMD市場佔額大幅度提高是很嚴重的錯誤
不管是個人終端 還是伺服器端
大範圍用上AMD64的時代已經是k10的事跟k8沒有太大關係,至於k10怎樣那就是另外一段故事了(事實上等到AMD64指令集普及的實際很多程式可應用時 也已經影響不了市場 intel有EM64T)