文/圖黃博文
KNL的基本情況我們在2014年的《微型計算機》中就有過介紹,在此僅做簡單回顧。從Intel繪制的框架圖上很容易看出,KNL是一個标準的衆核處理器,位于中心大矩形内部的近40個小方塊(官方稱呼為TILE),除了用以連接PCIe3、MCDRAM、DDR4以外的小方塊以外,還剩36個小方塊,這36個小方塊中的每一個都内建兩個處理核心,每個處理核心内部又内建兩個向量處理單元,兩個處理器核共享一塊
2MB大小的二級高速緩存,每一個小方塊都配備了一個中繼站(官方稱為HUB),用以連接其他的核心模塊。HUB和各個核心之間的互聯(Interconnect)體現出了鮮明的片上網絡(NoC)特征。
粗看之下,這樣的結構特征與普通人用的個人電腦有着很大的不同,卻又有着一些神似。明顯的不同點是,一般的處理器不會集成這麼多的核心也不會使用這麼激進的片上互聯網絡。以目前Intel頂級的至強多核服務器級芯片為例,目前最高規格也隻有約20核心上下,而且不支持任意一個核心到周圍相鄰核心的點對點互聯,而是使用了縮減過的環網(ringbus),這說明KNL的片上互聯能力大大強于現有的多核處理器;雖然KNL和普通的個人電腦處理器一樣使用亂序多發射核心,但是KNL的亂序多發射能力經過比較大的精簡,同時比較倚重于向量執行,因此KNL的單線程性能會顯著落後于一般的個人電腦中使用的處理器,但是更激進的向量執行和加大了一倍的每核心超線程數量支持則會使KNL的并行計算能力大幅領先。這裡便引發了很多疑問,為什麼KNL不使用激進的亂序多發射設計來提高速度?為什麼要如此重視衆核以及向量執行呢?KNL到底是用來幹嘛的?
tips關于片上網絡
随着芯片集成度的指數級提高,現在的處理器内部會集成的核心數量以及各種各樣的功能單元數量也在增加,如何連接這些核心與組件就成了一個難題。如同計算機網絡連接了很多計算機一樣,如果把這種宏觀上的網絡級互聯能力搬到納米尺度的微結構當中,就形成了片上網絡。業界公認的下一代片上互聯微結構将會是片上網絡的舞台,片上網絡是目前業界的研究熱點之一,并且已經有一些産品将一些初具規模的片上網絡付諸實用,例如TILERA多核,Intel的至強融核,以及我國軍方研制的用以對抗美國技術封鎖的申威26010衆核處理器。
PC與超級計算機的淵源
XeonPhi這條産品線自從出現以來,一直活躍在高性能計算市場上。這裡的“高性能計算”和我們普通人接觸到的高性能手機SoC、高性能PC裡面的“高性能”雖然字面相同,但其實已經發展出了截然不同的兩種含義。XeonPhi關注的高性能計算,實質上是需要超大規模并行的科學計算領域,而普通人關注的高性能計算,多屬于并行度不高的串行計算或者是存在少量并行度的多媒體計算任務。雖然今天它們已經是字面相同而實際含義不同的貌合神離狀,然而五十年前,它們卻是一家。KNL與一般處理器的相同點和不同點之所以演變成如今的樣子,其實有着曆史性的原因。
現在個人電腦和智能手機微處理器的基本體系結構,其實與上世紀六十年代的第一代超級計算機有着莫大淵源。有人可能會說,現在所有的計算機都是馮諾伊曼體系結構,而當時的第一代超級計算機直接脫胎于馮氏體系結構的最早期實例之一的ENIAC,把PC和五十年前的超級計算機強行拉關系是不是有些沒話找話的味道?其實不然,現代處理器微結構中至關重要的一些技術,例如我們今天要重點關注的單指令多數據、亂序執行、超标量執行等等,都是早期超級計算機發展過程中的産物,亂序執行和超标量執行的初始設計被後世追認到了上世紀六十年代的CDC6600和IBMSystem360上,單指令多數據的前身向量執行(vectorprocessing)則被認為是CDC的部分原班人馬所設計的Cray1的遺産。停放于博物館中的Cray1向量型超級計算機,圖片來源于svedic.org。
IntelPPT中公布的KNL框架圖
最新的Intel至強E5V4系列使用的環網互聯結構,不難看出節點間的通信需要跨越的跳數遠多于完整網狀結構的KNL芯片。linpack
Linpack原先是JackDongarra,JimBunch,CleveMoler,GilbertStewart等人為上世紀七十到八十年代的超級計算機編寫的一套Fortran語言的線性代數函數庫,後來被改編為超級計算機的性能測試基準程序HighPerformanceLinpack(HPL)。盡管linpack在高性能計算的性能測試中廣泛使用,但是其度量準确性存在争議。
高性能計算與傳統結構的失和
讓我們把目光聚焦到高性能計算領域中活躍的linpackbenchmark上面來。
筆者從HPL(超級計算機top500的排名依據)中截取了其中一個性能關鍵點的源碼。這段源碼進行的實質工作是進行超大規模的矩陣乘加。這個規模有多大呢?Top500官方推薦的值是,矩陣存儲的空間應當占據整個超算系統内存的80%,也就是許多個TB乃至PB級别的數據量。這種計算任務的性質使得亂序執行技術完全失去了用武之地。我們來看看亂序執行的框架會如何處理這個問題。首先需要進行第一對數字的乘加,試圖從高速緩存中取出這一對數字,但高速緩存中沒有,發生了高速緩存缺失,于是從内存中取用;亂序執行引擎檢測到第一對數字的計算發生了停頓,而第二對數字的計算過程并不依賴于第一對的計算結果,而且也有空餘的執行資源,于是将第二對數字的計算任務提前開始處理,再試圖從高速緩存中取出這一對元素,還是缺失,于是第二對數字也繼續訪存過程,第三對數字的計算開始……持續到亂序執行引擎達到了所能hold的指令數量上界,亦或緩存子系統或者訪存隊列達到了同時服務請求數的上界等原因,工作徹底停頓,直到有一對數字從内存中返回,計算過程才得以繼續。一般來說亂序執行引擎能容納的指令數為100~200+條左右(指令融合可以進一步提高這個上界),緩存子系統能夠同時服務的并行缺失數比這個更少,一般在幾十個左右。
在這個過程中,亂序執行做了很多的無用功,因為在矩陣乘加這樣的計算任務裡,後續的操作幾乎總是不與先前的操作相關,因此總是能夠并行執行,并不需要亂序執行機制來發掘并行度。另外,由于所有的高速緩存缺失在時間軸上都是大部分重疊的,在這樣的場景下,緩存缺失帶來的訪存延遲可以盡可能地相互掩蓋,因此已經不再重要,最重要的問題是盡可能多地堆疊計算單元來并行執行指令,盡可能多地發出訪存請求,讓所有的緩存缺失和訪存代價相互重疊,将這一優勢發揮到極緻。一個将這一目标貫徹到底的順序執行處理器就可以在類似的并行場景下遠超過普通的亂序多發射處理器—這就是NVIDIA的GPGPU。NVIDIA的GPU能夠同時執行的并行指令數目多達上千個,并行處理的訪存請求數亦遠超過傳統的CPU,雖然每條指令的執行速度、緩存子系統的訪問延遲等遜于CPU,但是憑借着幾十倍的并行能力,超過普通的處理器并不在話下。Linpack中的一段關鍵代碼,截取自HPLv2.2開源版本的dgemm模塊
矩陣乘法示意圖。高亮的橫行于高亮的縱列參與運算,得到結果矩陣中高亮的一個塊。傳統框架的極限
所謂前有狼後有虎,一面是圍繞并行構建的GPGPU在這一問題上得心應手,另一面是傳統的CPU使用的亂序多發射框架已經不再适應高性能計算的需求。從本世紀初到現在,高性能計算使用的性能評測指标從GFLOPS跨越到TFLOPS又到PFLOPS,足足三個數量級,并且開始向上展望E級計算,但是傳統框架下的亂序多發射處理器要怎麼跟上這樣的發展需求呢?高頻率+高發射寬度嗎?
依賴高頻率來抹平差距并不是一個明智選擇,暫不談器件工藝物理極限的問題,這種底層技術對于CPU和GPGPU來說是共通的,CPU使用的高頻器件,GPGPU也能用從而很大程度上消弭了優勢。那麼高發射寬度呢?
翻閱上世紀八十年代末期至九十年代中期的論文,便不難發現,當時學術界與工業界熱衷于具備寬發射、長流水,亂序執行、分支預測能力的CPU,認定這将是未來的發展方向,這些技術的研究熱火朝天,有的學者甚至樂觀地展望,未來将出現每周期15發射以上的驚人前端發射寬度,這樣激進的寬發射CPU當然并未成為現實,作為對比,Haswell架構的發射寬度為4(因為可以發射融合微指令,所以實際等效發射寬度稍高),安騰2架構在編譯器調度的幫助下也隻能做到12發射。這種樂觀預期的存在很好地反映了當年的時代局限。九十年代微架構設計的主流觀點是,若想提高計算速度,加強CPU核心的執行能力是重點。在這樣的指導思想下,著名的IntelP6微架構誕生了,雙發射+長流水+亂序執行+分支預測一應俱全,核心頻率越來越高,邏輯越來越複雜,直至NetBurst架構的高頻奔騰4芯片折戟沉沙。
重新審視當時的失敗原因,主要有兩個。
其一,功耗牆(powerwall)。用以加強CPU核心執行能力的這些技術将大幅推高功耗,以亂序執行為例,每一條指令的發射和執行都需要經過一整套邏輯的檢查以确保流程正确,并占用額外的寄存器,這意味着每一條指令的執行都需要更多功耗。這種愈發激進的CPU設計在Netburst架構時代迎來頂峰,随後狠狠地撞上了功耗天花闆。前Intel副總裁PatrickGelsinger曾在2001年的國際固态電子電路會議上發表主題演講,警告說CPU的功耗密度如果繼續提高,不出幾年就将擺脫現有一切冷卻手段的束縛,徹底失去控制。更加不妙的是,仿真結果揭示,即便傾盡全力,給定無限多的芯片面積預算去設計一個發射寬度遠超當下,配備極強的亂序執行能力和分支預測器的CPU,其整數指令發射能力也不過提高區區幾倍,這樣的設計思路下,改進潛力已經不大。
其二,訪存牆(memorywall)。愈發激進的CPU設計将CPU核心的執行速度提得很高,存儲器系統已經越來越力不從心。提供足夠大的存儲容量和提供足夠快的響應速度在本質上是矛盾的,馮諾依曼早在1945年就斷言容量和速度的需求無法同時滿足,這位大師級人物不幸再度言中,存儲器系統越來越難以用足夠快的速度交付和接受指令與數據,引發了架構設計者們的擔憂。DEC公司Alpha架構的首席架構師理查德·賽特斯在1996年的《微處理器報告》上撰寫了一篇标題為《瓶頸在内存,愚蠢!》的驚世雄文,據他披露的測試結果,當時最出色的亂序超标量處理器若是管線填滿,理論上每周期可以完成兩條左右的指令,而實際執行時每四到五個周期才會有一條指令完成,落差幾乎達到十倍,花費學術界與工業界無數心血研究測試的超标量亂序執行并未如想象中那樣強大,優勢幾成泡影。這項測試非常有力地證明,整個執行模式存在極其嚴重的瓶頸,制約了整個CPU的性能,而這個瓶頸就在于訪存速度。花費如此大的精力設計的高性能CPU,卻花費了90%的時間等待存儲器系統的響應,這不能不說是一種莫大的諷刺。賽特斯不無悲觀地認為,在未來的處理器微架構設計中,存儲器系統将成為唯一的關鍵因素。
顯然,發射寬度不可能像核心數目一樣快速向上擴展。面對這些挑戰,業内已有一些較有遠見的架構師開始讨論另一種全新的架構設計方式,他們設想抛棄高能耗的複雜亂序執行核心,轉而采用設計精巧簡單,功耗較低的小核心,将設計重點放在提高對存儲器系統的延遲容忍上,依靠多核心多線程并行執行來躲避存儲器系統的延遲——這同樣是後來NVIDIAGPGPU的核心設計理念之一。無獨有偶,XeonPhi也有相同的考慮。DEC公司于1992年時所期望的CPU發展進程,當時預期2017年會出現20發射的CPU,而現在已經無望變成現實,寬發射亂序推測推測執行的傳統設計思路需要引入變化。XeonPhi的意義和革新
在XeonPhi問世之前,雖然業界包括Intel自身已經意識到了問題存在,但是出于經濟上的考慮,單獨為市場空間并不太大的高性能計算單獨開發芯片對于Intel來說處于模棱兩可之間。從經濟上來說最佳的處理方式(同時也是技術上來說妥協的方式)就是繼續使用針對傳統市場開發的舊體系結構下的芯片去應對已經分化出去的高性能計算市場。而XeonPhi是Intel為了對抗NVIDIA在高性能計算領域的強勢進攻、同時也為了自家産品在高性能計算領域的變革和轉型推出的全新産品線,它的問世标志着Intel認為已經來到了需要認真對待高性能計算市場的拐點。
從體系結構的角度來說,它的基本設計理念與GPGPU非常相似,以KNL來說,72核心的設計,正如同GPGPU大量堆積SM陣列、CUDA核心數目一樣是大幅度提高并行度的設計之一,從基本執行框架的角度看,CUDA所使用的單指令多線程模式其實也與Intel的單指令多數據同宗同源。放在這個背景上,弱化單核心性能、放棄激進的亂序多發射,提高超線程支持數目也就有了邏輯一緻的解釋。但基本框架的相似性也就帶來了下一個問題:一山是否能容二虎?作為後來者的XeonPhi在高性能計算領域并不是不可或缺的地位,更多的是給高性能計算提供了平行于GPGPU以外的另一種選擇。相對于體系結構領域半個多世紀的發展時間來看,GPGPU和Intel的至強融核設計都隻能說是尚未成熟的青少年,仍有許多問題需要進一步的研究,例如片上資源的劃分和平衡,搶占式調度,片上網絡的結構,硬件支持一緻性的必要性以及可擴展性等等,都不是能夠輕易給出答案的。在近期這段時間裡,GPGPU和至強融核将作為高性能計算領域裡面對同一類型問題的兩種選擇而并列存在,有可能其中一個被淘汰,也有可能二者進一步分化出不同的使用範圍,勝負還言之尚早。
此外,作為XeonPhi産品線的最新成員,KNL也具備一些頗為亮眼的特性。其一,KNL可以承擔主處理器的任務,能夠完整地負責啟動操作系統,這意味着,從理論上來說,使用KNL能夠單獨地構建起一套計算系統,像神威·太湖之光那樣在系統層面實現同構而芯片内部采用異構。其二,背靠x86發展起來的XeonPhi在編程上會占據一些優勢,同時秉承傳統處理器的硬件高速緩存一緻性維護,軟件的實現代價也可以得到降低。其三,作為老牌結構設計大家Intel的作品,KNL的體系結構也有許多值得玩味之處。例如文章開頭的KNL架構圖中展現的片上網絡互聯就需要大量的研究,例如PCIe3和DDR4内存控制器的接口在片上網絡中的布置、片上網絡的轉發和尋路策略,衆核一緻性總線的實現等等,無一不是心血的結晶。
除了以上三點以外,必須單獨提及的一點就是HMC的加入。這一點本來可以歸屬為體系結構的改進,但是HMC的意義足夠令它自己單獨得到一份關注。所謂HMC就是HighbandiwidthIn-PackageMemory的縮寫,也就是高帶寬片上内存。這種内存已經有比較長時間的研究曆史,并産生了多個變種技術,AMD在自家的旗艦級顯卡FuryX中使用的HBM就是一個例子。傳統的内存以内存條的形式插在主闆上,通常需要200個周期左右的訪問延遲,速度慢不說,更加要命的是,從内存搬運一個雙精度浮點數進入處理器内部需要的能耗,大約為進行一次雙精度計算的幾百倍,這意味着一次搬運數據的能耗需要幾百倍的計算量才能扯平,這樣一來大量的能耗就被浪費在數據的搬入搬出上面。HMC、HBM等技術就是在處理器片内集成一部分内存,相當于L4cache的存在,其訪問帶寬、延遲、能耗表現均大大優于片外内存。HMC的引入标志着Intel開始繼續吸納片上堆疊内存以及近内存計算領域的研究成果,它的意義遠不止多加了本地的8-16GB存儲容量這麼簡單。HMC的引入将有可能推動高性能計算的操作系統的任務調度部分重新調校,也為高性能計算領域的編程帶來了新的維度,程序員需要考慮把數據盡可能地保持在HMC當中,這一任務也可能随着技術的進步轉移給操作系統、編譯器或者是運行時的軟硬件協同來完成。HMC的引入是另一項可以在不遠的将來反哺回普通處理器上的技術成果,在高性能計算領域探索成熟的HMC将有可能部署回其他普通民用産品線例如個人電腦上面,來幫助未來的系統進一步完善。
KNL中新加入的高帶寬片上内存