方燕飛,劉 齊,董恩銘,李雁冰,過 鋒,王 諦,何王全,漆鋒濱
(國家并行計算機工程技術研究中心,北京 100190)
隨著計算機科學技術的高速發展,處理器計算能力不斷提升,超級計算機系統規模不斷擴大,高性能計算(High Performance Computing,HPC)開始邁入E 級(Exascale,E 為超級計算機運算單位,意為每秒百億億次)時代。在同一芯片內集成大量計算核心的眾核處理器[1-4]憑借超高的性能功耗比和性能面積比成為超算領域的主流處理器架構,2022 年12 月 第60 屆TOP500[1]榜單上的前10 臺超算 系統均采用眾核處理器為系統提供主要算力。
隨著數據科學和機器學習方法在HPC 應用領域的滲透和深度融合,HPC 應用對超算系統的運算能力和密集數據處理能力都提出了越來越大的需求。而隨著工藝和體系結構技術的發展,面向E 級超算系統的眾核處理器計算密度不斷提升,片上集成的運算核心數量不斷增加,眾多核心對存儲資源的競爭愈加劇烈,眾核處理器面臨的“訪存墻”問題越來越突出。E 級超算眾核片上存儲層次是緩解E 級系統內眾核處理器“訪存墻”問題,幫助HPC 應用更好地發揮E 級系統眾核處理器強大的計算優勢,提升實際應用性能的重要結構。然而,片上存儲器在整個處理器上的面積占比超過50%,功耗占比約為25%~45%[2],而且存儲容量非常有限。因此,如何充分利用E 級超算系統眾核片上面積,合理設計存儲層次,并從面向E 級計算的應用與軟件層面最大限度地發揮眾核片上存儲層次的優勢,是工業界和學術界的研究熱點。
片上存儲層次有多種組織方式,傳統多核處理器通常采用多級高速緩存(Cache)結構,而嵌入式處理器通常采用便簽式存儲器(Scratchpad Memory,SPM)結構來緩解“訪存墻”問題。Cache 具有硬件自動管理、性能優化顯著等優點,但隨著晶體管數量的日益增長,Cache 體系結構在現代眾核處理器中變得更加復雜,在面積、性能、功耗等方面都面臨挑戰,而且Cache 具有程序執行時間不可預知、軟件不可控等缺點。SPM 作為Cache 的替代或補充,在能源效率、時間可控性和可擴展性等方面具有明顯優勢,但其缺點是編譯器或程序員需要顯式地控制數據布局與傳輸,對于軟件優化和用戶編程具有很大挑戰。為了充分利用Cache 和SPM 的優勢,在性能、功耗、面積、可編程性等方面取得更好的平衡,面向E 級超算的眾核片上存儲層次的結構變得比多核和嵌入式處理器的存儲層次都更加豐富且復雜,軟硬件及應用層面都有許多關鍵技術值得研究和突破。
本文按照不同的組織方式將片上存儲層次分為多級Cache 結構、SPM 結構和SPM+Cache 混合結構,并總結3 種結構的優缺點。分析國際主流GPU、同構眾核、國產眾核等面向主流E 級超算系統的眾核處理器片上存儲層次設計現狀與發展趨勢,并從眾核共享末級Cache(Last Level Cache,LLC)管理與緩存一致性協議、SPM 空間管理與數據移動優化、SPM+Cache 混合結構的全局視角優化等角度綜述國際上的存儲層次設計與優化相關軟硬件技術的研究現狀。
在過去的近二十年中,隨著集成電路設計與制造技術的快速發展,處理器頻率以每年50%~100%的速度增長,然而主存的速度增長每年只有6%~7%[5],處理器與主存速度差異越來越大。為了緩解處理器和主存之間的速度差,在寄存器與主存之間引入了一種比主存速度更快、容量更小的靜態隨機存取存儲器(SRAM)作為臨時存儲,形成片上層次化存儲結構,也稱作片上存儲層次。E 級超算系統采用包括寄存器、高速緩存、主存、外存的多級存儲體系結構。眾核處理器作為E 級系統的計算節點,其片上存儲結構是E 級超算系統存儲體系結構中的一個重要組成部分,是緩解眾核處理器“訪存墻”問題,幫助HPC 應用更好地發揮眾核處理器計算優勢,提升實際應用性能的重要結構。在當前主流眾核處理器中,片上存儲層次形式多樣,按照SRAM 的組織方式可以分為多級Cache 結構、SPM 結構和SPM+Cache 的混合結構等。
在通用處理器上,SRAM 通常被組織為Cache。在通用多核處理器上常有3~4 級Cache,不同層次的Cache,其容量、延時和功率不同,從主存到寄存器,越往上Cache 的層次越低,容量越小,訪問延時越低。比如IBM 的Z15[6],每個核心私有L1 數據Cache和指令Cache,一個數據和指令共用的L2 Cache,所有核共享一個大容量的L3 Cache,此外,還有一個更大容量的片外L4 Cache。但隨著片上核心數量的不斷增加,受功耗面積等制約,多核Cache 的層次在減少,比如下一代IBM Telum[7],將取消L4 和L3 Cache,物理上只支持L1 和L2 Cache,同時借助更高級的技術實現邏輯上的共享L3 Cache。在當前主流的眾核處理器上,由于片上核心數量眾多,片上互連結構復雜,為更有效揮地發Cache 的作用,眾核大多采用2 級Cache 結構,如圖1 所示,各核心私有L1 Cache,L2 Cache 作為末 級Cache 被所有 核心共享,而且L2 Cache 大多容量較大,由多個Bank 組成,通過高速NoC 互連實現核心間共享。

圖1 眾核處理器上的兩級Cache 存儲結構Fig.1 Two level Cache memory hierarchy on manycore processor
Cache 的設計越來越復雜,且受到面積和功耗的限制,而與Cache 相比,SPM 的功耗和面積比Cache低40%以上[5],因此很多眾核處理器將片上SRAM組織成由軟件管理的便簽式存儲器。例如早期由IBM、Sony 和 To shiba 共同開發的 Cell[8]處理器,由1 個跟 Power 處理器(PPE)兼容的主處理器和8 個協處理器(即SPE)組成,其中每個SPE 帶有256 KB SPM。又 如Adapteva Epiphany[9]的64 核 心眾核處理器,每個計算核心帶有軟件管理的SPM。再如“神威·太湖之光”超算系統采用的申威高性能眾核處理器SW26010[10],由4 個控制核心和256 個從核心組成,每個從核心帶有160 KB 的SPM。通常,片上的多個計算核心之間通過片上網絡(NoC)互連,每個核心除了可以訪問本地SPM 之外,還可以通過NoC 訪問遠程的SPM,并且訪問延遲與核心間的距離成正比。眾核片上核心訪問遠程核心SPM通常有兩種方式:一種是由底層體系結構支持的共享SPM 方式;另一種是通過RMA 等方式顯式地訪問遠程核心的SPM。前者對用戶透明,后者需要調用RMA 接口顯式編程。有的處理器上的核心還配備直接內存訪問(DMA)引擎,用于在片外內存和本地SPM 之間傳輸批量數據。圖2 顯示了基于SPM的眾核架構[11]存儲結構示意圖。每個核心包含一個統一的SPM 用于指令和數據,每個SPM 持有應用程序要使用的全局地址空間的不同部分。雖然SPM可以同時作為代碼和數據的片上緩存,但在高性能計算領域,為了減少對代碼管理的復雜度,眾核處理器通常會在片上提供指令Cache,而只有數據是采用SPM 結構進行緩存,典型的如SW26010。本文后續討論的眾核片上存儲層次也默認都是有指令Cache 的。
隨著SPM 逐漸被用在GPU、通用處理器及高端處理器上以代替一級數據Cache,在一些高性能計算機體系結構中,甚至采用多級軟件管理存儲層次代替傳統多級Cache 存儲層次[12]。
由于傳統的SPM 控制器不包含任何輔助管理數據的邏輯電路,SPM 中的所有數據必須經由軟件顯式管理,沒有管理邏輯電路帶來的額外代價,在相同容量下,SPM 面積和單次訪問的能耗都小于Cache。Cache 由于在發生沖突等情況下訪問時間會大幅增加,因此Cache 具有不確定性的命中時間,SPM 無法像Cache 那樣由硬件自動完成緩沖數據的換入換出操作,因此SPM 不存在訪問缺失的情況,始終能夠保證一個很小的固定時鐘周期數的訪問時間,從而保證了程序的確定性。但是SPM 的容量有限,而且由于不能自動完成數據從主存到SPM 的映射,因此對編譯器和用戶編程帶來了很大挑戰。表1給出了Cache 與SPM 特點的對比,兩者各有優缺點,而且優勢互補。

表1 Cache 與SPM 的特點對比Table 1 Comparison of features of Cache and SPM
為了更好地適應不同應用的需求,充分利用Cache 與SPM 的優勢,越來越多的眾核處理器片上存儲結構開始采用SPM+Cache 混合的方式來追求一種平衡設計。NVIDA 公司面向通用計算領域的GPU 上的存儲層次就是SPM+Cache 混合的典型代表,從其第二代GPU 架 構Fermi[13]開 始,為了提 升GPU 的計算效率,引入了L1 和L2 Cache,SPM 結構的共享存儲器(Shared Memory,SMEM)容量也變得更大,圖3 給出了典型的Fermi 架構的存儲層次,每個SM 有一個私有的L1 Cache 和SMEM,容量分別為48 KB 或16 KB,所有流式多處理器(SM)共享768 KB L2 Cache。自Fermi 之后的每一代架構都繼承了Cache+SPM 的混合結構。NVIDIA GPU 一直保留SMEM 功能,由軟件負責實現數據的讀寫和一致性管理,有利于CUDA 多線程間數據重用,對于圖形計算等數據流處理類應用可以挖掘極致的性能。而后引入的兩級 Cache 結構,使GPU 在HPC 領域的適應性明顯加強,沒有使用SMEM 的應用程序以及無法預知數據地址的算法,都可以從L1 Cache 設計中顯著獲益。

圖3 Fermi 存儲層次示意圖Fig.3 Schematic diagram of Fermi storage hierarchy
眾核處理器系統根據其片上存儲層次中是否包含SPM 可以分為4 類:1)沒有SPM 的純Cache 系統;2)只 有SPM 的不可Cache 系 統;3)擁 有SPM 和Cache 的混合系統;4)SPM 和Cache 混合且容量可配置的系統,可以配置成純SPM 模式、純Cache 模式、或者SPM 與Cache 混合的模式,而且SPM 與Cache的容量可以有多種組合配置。典型的混合存儲結構為核心私有1 級Cache 和SPM(容量可配置),所有核心共享MB 級大容量L2 Cache 的結構。
片上存儲層次的設計除了組織方式外,還有一個必須關注的物理部件,即片上高速互連網絡NoC(如富士通A64FX[3]、申威眾核處理器均設計了NoC)。片上高速網絡增強了核間數據交互能力,間接提高了單核心Cache 或者SPM 的數據重用能力,降低了主存訪問壓力,是硬件高效組織共享末級Cache 和共享SPM 的關鍵,也是應用算法和系統軟件充分共享利用片上資源的重要途徑,因此,在片上存儲層次的設計與使用中,必須考慮片上網絡的結構特點。
作為通用加速卡的GPGPU 憑借其卓越的計算能力,已經在HPC 領域扮演著越來越重要的角色。NVIDIA 通用GPU 作為最主流的通用眾核加速卡,已經廣泛應用于HPC 領域,比如第60 屆Top500 排名前10 的超算中有5 臺都采用NVIDIA 的GPU 進行加速。而AMD 和Intel 的通用GPU 也分別作為美國的3 臺E 級系統上的加速卡為系統提供主要算力。下文將分別分析上述3 個面向HPC 的主流GPU 架構存儲層次現狀及其發展趨勢。
2.1.1 NVIDIA Hopper 架構的存儲層次
NVIDIA GPU 的架構從Tesla 到Hopper 已經發展了9 代,為了適應GPU 計算能力的不斷提升,其片上存儲層次也在不斷發展。自Fermi 架構采用SPM+Cache 混合的片上存儲結構之后,后續的架構在存儲層次上的設計沒有較大的變革,其變化主要表現在各級存儲在容量上的變化、SMEM 與L1 Cache 結合方式上的變化等。直至第7 代Volta 架構,其片上存儲方式較前幾代架構又有了比較重大的變化。Volta 架構將數據Cache 與SMEM 從功能上做到一個存儲體(memory block)中,使得兩種緩存方式均達到了其訪問的最好性能。SMEM 與L1 Cache 的總容量為128 KB,且容量可以有多種靈活的配置。第8 代Ampere 架構的片上存儲方式繼承了Volta 架構的片上存儲方式,但將存儲空間總大小擴大至192 KB/SM(采用Ampere 架構的典型GPU為A100[14])。A100 的L2 Cache 容量擴展到40 MB,是V100 的7 倍,并且支持駐留優先級設置,可以提高持續訪問數據駐留Cache 的權利,從而減小DMA帶寬需求。此外,Ampere 增加了異步拷貝指令,可以直接從L2 Cache 以及DRAM 中批量傳輸數據到SMEM 中,而在前一代架構Volta 中,需要通過一個全局加載指令從L1 Cache 到寄存器中,然后再用Store-Shared 指令從寄存器中傳到SMEM 中,圖4 展示了Ampere 與Volta 的存儲結構變化。從最新一代Hopper 架構H100 和Ampere 架構A100 的對比來看,最近的兩代存儲架構方面沒有大的變化,只是H100的SLM 容量增加到256 KB,且H100 從硬件對TMA(Tensor Memory Accelerator)的功能上做了更多的支持。

圖4 Ampere 與Volta 的存儲結構變化Fig.4 Storage structure changes of Ampere and Volta
從NVIDIA 9 代GPU 架構的存儲層次發展趨勢來看,Cache+SPM 的混合結構是其片上存儲層次的一個創新解決方案,混合結構可以更好地兼顧面積、性能、功耗及好用性,以滿足不同領域應用的多樣化需求。對于某些應用,Cache 仍然是保證系統通用性和應用性能的關鍵結構,而SPM 結構為某些HPC 應用挖掘極致性能提供了更多可能。對于有些更復雜的應用,則既需要SMEM 也需要Cache,因此支持Cache 與SMEM 容量的靈活配置,可以進一步提高對不同類型應用的適應性。進一步地,為方便程序員或者編譯系統挖掘應用數據訪問特性,Hopper 架構引入了線程塊集群(Thread Block Cluster,TBC)和分布共享內存(Distributed Shared Memory,DSMEM)概念,同一線程塊集群內的SM 之間可以共享訪問SPM,而無須通過Global Memory 交互數據,從而提高數據交互效率。此外,硬件上提供了只讀數據緩存的Read-Only Data Cache 以及異步拷貝指令,都可以進一步降低訪存時延、提升帶寬利用率,雖然這些設計會增加軟件管理和編程復雜度,但是為應用或編譯系統充分挖掘片上緩沖性能提供了更多手段。
2.1.2 AMD CDNA2 架構的存儲層次
AMD CDNA2 是AMD 在2021 年11 月新發布的GPU 架構,其設計目標是科學計算和機器學習領域的應用。最新TOP500 排名第1 的美國E 級超算系統Frontier 采用的加速卡AMD MI250X 正是基于AMD CDNA2 架構的AMD Instinct MI200 構建的。AMD MI250X 采用MCM 技術封裝了兩個AMD Instinct MI200 GCD。
每個AMD Instinct MI200 GCD 包含112個計算單元(Compute Unit,CU),最低級別的內存層次結構位于CU 內部,如圖5 所示,每個CU 包含一個16 KB L1數據Cache 和64 KB SPM 結構的本地共享存儲器,另有一個4 KB 共享SPM 結構的全局共享存儲器。整個GCD 共享一個由32 個Slice 構成的16 路組相連結構的L2 Cache,總容量為8 MB。
2.1.3 Intel Xe 架構的存儲層次
美國E 級計劃中的Aurora 超算系統采用 Intel Xe 架構的GPU,Xe 架構是Intel 繼Gen 9 和Gen 11 之后的最新一代GPU 架構。Gen 9 和Gen 11 都是采用3 級Cache 結構,在片上使用共享本地內存(Shared Local Memory,SLM),是一種SPM 結構。作為一級數據緩沖,沒有通用的L1 數據Cache。Gen 11 相對Gen 9 在存儲層次上的改進特點是將SLM 帶入了子Slice 單元,使得SLM 更接近執行單元(EU),以便在同時訪問L3 Cache 時減少數據的爭用。SLM 更接近EU 也有助于減少延遲并提高效率,如圖6 所示。
Intel 的Xe 架構是對前兩代Gen 9 和Gen 11 架構上的進一步升級,Intel Xe 架構不僅全面提升了執行單元的規模,從存儲層次發展來看,Xe 架構保留了Gen 11 相 對Gen 9 在SLM 上的改 進,即 將SLM 帶 入SubSlice,并且Xe 架構相對Gen 11 進一步新增了L1數據Cache。Xe 架構還支持端對端壓縮,L2 Cache的容量也有大幅提升。目前發布的Intel Xe 架構GPU Ponte Vecchio 支 持 512 KB 的 SLM 與L1 DCache 動態可配的一級緩沖,二級Cache 增加到64 MB。從不同代系的發展來看,在追求兼顧性能與好用性的目標中,Intel 的GPU 存儲層次設計也逐步采用SPM+Cache 的混合結構。
目前TOP500 排名第2 的日本的Fugaku/Post-K超算系統,采用的是富士通A64FX 處理器[3]。
A64FX 處理器采用同構眾核處理器體系結構,片上集成52 個同構核心,包括48 個計算核心與4個輔助核心,如圖7 所示,所有核心分為4 個組,每組13 個核心,一組核心稱為一個CMG。在A64FX 處理器芯片中,多個CMG 通過片上網絡連接。富士通的A64FX處理器為了減小芯片大小,采用兩級Cache的結構,每個核心私有64 KB 一級Cache,一個CMG 的所有核心共享一個8 MB 二級Cache。A64FX 采用類似于環形拓撲網絡的片上網絡,以支持CMG 之間的內存一致性協議,從而可以使用多個CMG 執行共享內存程序。

圖7 A64FX 片上存儲層次Fig.7 On-chip storage hierarchy of A64FX
富岳采用的A64FX 存儲層次設計是以應用和編程軟件需求牽引的一種協同設計。比如其CMG 內核心數量、一二級Cache 的容量以及Cache line 的大小等參數設置,都是在模擬富岳的重點目標應用程序性能的前提下給出的,在功率、面積和性能之間取得更好的權衡。為了提高目標應用程序的性能,采用增強型的緩存功能設計,比如采用組合聚集操作技術,使間接加載的數據吞吐量加倍,采用二級緩存數據重用優化技術提高緩存帶寬。純Cache 結構具有更好的應用適應性,但同時也面臨可擴展性問題。
2.3.1 MT-3000 異構眾核處理器存儲層次
國防科技大學推出了一款自主設計的面向新一代天河超算系統的異構眾核處理器MT-3000[12]。
MT-3000 采用多區域加速架構,其結構如圖8 所示,CPU 內包含16 個通用處理器核心和4 個加速域,采用混合存儲器層次結構。
MT-3000 的每個通用CPU 核含有支持高速緩存一致性 的兩級私有Cache,L1 Cache 被L2 Cache 包含,L2 Cache 容量為512 KB。每個加速域包含24 個控制核心和384 個加速核心,采用兩級SPM 結構,其存儲層次如圖8 所示,每個加速域含有1.5 MB 的域內共享內存(DSM)和48 MB 的高速共享內存(HBSM),其中DSM 只能由加速域內的核心訪問,而HBSM 被本加速域的所有核心及通用域的16 個CPU 核共享。片上含有兩級高速互連網絡,每個加速域內采用全連接網絡,而16 個通用核心間通過二維Mesh 網相連,16 個通用核心可以訪問4 個加速域的HBSM。MT-3000 加速域支持軟件管理的垂直存儲一致性,將加速域內的DSM(6 MB)、HBSM(共48 MB)、DDR4 存儲(共32 GB)三級存儲架構,通過高速DMA 和片上網絡連接,提供了高帶寬的數據傳輸和核間數據交互能力。
2.3.2 申威眾核處理器存儲層次
用于“神威·太湖之光”的申威26010 眾核處理器[10,15],片上采用純數據SPM 的結構。SW26010 包含4 個核組,每個核組有64 個運算核心,每個運算核心私有128 KB SPM。而面向E 級系統的新一代申威眾核處理器[16]開始采用SPM+Cache 混合的片上存儲結構。該眾核處理器包含6 個核組,每個核組有64 個運算核心,每個運算核心有256 KB SRAM,支持SPM與L1 Cache 混合且容量可配置的使用方式,64 個運算核心的SRAM 還可以通過片上NoC 互連組織成共享SPM 空間,片上存儲模型如圖9 所示。運算核心可以RMA 或者遠程load/store 的方式訪問同一核組內遠程運算核心的SPM 空間,也可以通過DMA 將主存空間數據批量傳輸到私有或者共享的SPM 空間上。

圖9 新一代申威眾核處理器存儲層次Fig.9 The storage hierarchy of the new generation of Shenwei manycore processors
為更好地適應不同數據訪問特征的HPC 應用的需求,提升主存數據的訪問效率,系統支持主存空間訪問可以配置成可Cache 和不可Cache 兩種屬性。但為了降低編程復雜度,這種屬性通常對用戶透明,用戶程序主存數據默認都是可Cache 的,編譯器或者運行時可以利用主存不可Cache 空間結合DMA 進行訪存優化,減少維護Cache 一致性的開銷。
表2 以眾核計算核心的視角總結了各主流眾核處理器的片上存儲層次。富岳A64FX 同構眾核采用兩級Cache 結構,MT-3000 異構融合架構中的加速域 采用純SPM 結 構,而NVIDIA、Intel、AMD的面向E 級系統的GPU 以及申威的最新一代異構眾核處理器SW260x0 均采用SPM+Cache 混合的結構。可見目前的HPC 主流眾核片上存儲層次結構并不單一,這是由多種因素導致的,不同處理器面向的應用領域需求不同,追求的設計目標不同,各自的技術積累也不同。但是,從橫向的比較和各處理器自身縱向的發展趨勢,以及從HPC 與數據科學、機器學習不斷融合發展帶來的應用需求變化來看,SPM+Cache 的混合結構最可能成為今后HPC 眾核處理器片上存儲層次設計的主流選擇。另外,從表2 最后一列的分析可以看出,雖然主流GPU 都采用了的SPM+Cache 結構,但每一款GPU的SPM 和Cache 的功能細節也各有不同,例如NVIDIA H100 的L1 只能為Cache CUDA 對應的Local 空間的數據,Global 空間數據只能緩存進L2 Cache。H100 還支持同一TBC 內SM 遠程訪問共享SPM,新的存儲層次特性也給HPC 編程帶來新挑戰。而AMD MI250X GPU 支持的CU 私有SPM和L1 DCache 是SIMD 單元專用的,如果HPC 程序員要深度優化程序性能,則必須要充分利用好這些存儲結構特性。

表2 主流眾核處理器片上存儲層次Table 2 On-chip storage hierarchy on mainstream manycore processor
眾核是構建E 級超算系統的主要計算節點,為E級超算系統提供主要算力來源。如何充分發揮眾核處理器片上眾多核心的計算能力,一方面需要硬件層面開展眾核片上存儲結構設計,另一方面需要面向E 級計算的應用和軟件開展相關優化技術,以充分利用眾核片上存儲層次特點。當前面向E 級的主流眾核處理器采用的片上存儲層次結構多樣,各具優缺點,本文從多級Cache、SPM 以及SPM+Cache 混合3 種結構分別探討當前主流軟硬件設計與優化技術。
隨著片上核心數量的不斷增大,片上互連結構日趨復雜,要使Cache 結構在片上眾多核心競爭的環境下能繼續高效工作,必須解決好兩方面問題:共享末級Cache(LLC[11])的高效管理問題和Cache 一致性問題。
3.1.1 LLC 的管理策略
眾核片上典型的Cache 結構為:核心私有一級Cache,L2 Cache 作為LLC 由所有核心共享。在眾核環境下LLC 會同時接收來自于多個線程的訪存請求,而線程間的數據訪問特征有可能各不相同,大量并發線程間的相互干擾會影響LLC 的使用效率。因此,如何管理片上LLC 資源是影響眾核處理器訪存性能的關鍵因素。傳統LLC 的替換與插入策略的研究已經比較成熟,包括使用LRU 作為替換策略的插入策略、動態插入策略(DIP)、線程感知的DIP 策略,還有后續提出的靜態重引用間隔預測策略、動態重引用間隔預測策略和線程感知的動態重引用間隔預測策略。但是,這些傳統的LLC 管理策略在眾核系統下已無法高效工作。文獻[17-20]提出了在CMP的競爭線程之間動態劃分共享LLC 的策略,文獻[21-22]則進一步考慮了多線程間的共享數據行為的影響,并將其融入到LLC 的管理策略。上述技術大多針對同構眾核系統,而文獻[23-24]針對異構眾核系統開展了LLC 管理策略研究。文獻[25]在前人基礎上提出了適合片上異構眾核處理器的動態LLC 替換策 略DIPP(Dynamic Insertion/Promotion Policy)。該替換策略核心思想是通過限制GPU 核能夠獲取的Cache 資源,達到降低程序間的線程干擾,降低程序的失效率和提升系統整體性能的目的。
隨著CMP 上處理器核心數量的不斷增大,非一致Cache 體系結構(NUCA)成為當前CMP 上大容量低延遲Cache 的主要組織結構。NUCA 結構中的LLC 由于容量較大,通常分為多個Cache 存儲體(bank),所有bank 置于芯片中央,通過NoC 在邏輯上組織成一個被所有核心共享的統一的末級Cache。NoC 是組織LLC 的重要互連方式。隨著NoC 規模的擴大,一方面,網絡延遲正在成為緩存訪問延遲的主要來源,另一方面,不同核心之間的通信距離和延遲差距正在增大。這種差距會嚴重導致網絡延遲不平衡,加劇緩存訪問延遲的不均勻程度,進而惡化系統性能。文獻[26]分別針對無沖突延遲和競爭訪問提出了非一致性存儲映射和非一致鏈路分布的設計方法。文獻[27]提出了一種新的面向公平性和位置感知的NUCA 方案,以緩解網絡延遲不平衡的問題,實現更統一的緩存訪問。文獻[28]提出一種位置敏感的LLC,通過感知Cache 行位置和利用GPGPU 的核間通信來緩解GPGPU 片上網絡瓶頸,減少訪存延遲。文獻[29]將LLC 淘汰的Cache 塊保存在NoC 的路由器上,當有核心請求這塊數據時,由NoC 直接響應這個請求。這些研究都充分利用了NoC 的特點,為基于NoC 的NUCA 數據訪問的不平衡性問題提供了多種解決方案。
3.1.2 眾核片上緩存一致性協議
當多個處理器核的高速緩存保持從主存獲取的同一數據對象的本地副本時,即使其中任何一個高速緩存修改了同一數據對象的值,也會導致高速緩存和共享內存之間共享數據的全局視圖不一致,這個問題稱為緩存一致性。在眾核處理器中,為管理共享緩存中的讀寫操作,以便在所有處理器核心之間維護一致性,而執行的一組特定規則稱為緩存一致性協議。緩存一致性協議可分為目錄協議[30]和監聽協議[31]兩大類,基本作用是發現共享數據塊的狀態。傳統的緩存一致性協議設計復雜,開銷較大,無法滿足眾核處理器共享存儲系統追求高效、低功耗、可擴展的設計目標。國際上有大量面向片上眾核系統低開銷可擴展的Cache 一致性協議研究。文獻[32]提出了可擴展到千核規模的融合一致性Cache,在統一物理內存的基礎上,采用兩級目錄的融合一致性設計。文獻[33]提出了SCD 框架,它依賴于高效的高關聯緩存實現一個可擴展到數千個內核的單級目錄,精確地跟蹤共享集,并且產生可忽略的目錄引起的失效。國內也有許多研究者在Cache一致性協議功能擴展和性能優化等方面開展了研究。文獻[34]針對共享存儲系統提出一種沒有目錄和間接訪問、沒有眾多一致性狀態和競爭的簡單高效的Cache 一致性協議VISU,解決了制約目錄協議可擴展性的目錄開銷問題。文獻[35-36]提出了一種具有表達力的、區域高效的目錄緩存設計,并分別在64、256 核系統上進行了評估。文獻[37-38]提出了基于時間的硬件一致性協議,即庫緩存一致性(Library Cache Coherence,LCC),它通過暫停對緩存塊的寫入,直到它們被所有共享者自失效為止,從而實現順序一致性。
當可伸縮一致性在通用芯片多處理器中得到廣泛研究時,GPU 體系結構具有一系列新的挑戰。引入傳統的目錄協議會給現有的GPU 應用程序增加不必要的一致性通信開銷。此外,這些協議增加了GPU 存儲系統的驗證復雜性。文獻[39]描述了一個基于時間的GPU 一致性框架,稱為時間一致性(TC),它利用系統中的全局同步計數器來開發一個簡化的GPU 一致性協議。同步計數器使所有一致性轉換(如緩存塊失效)能夠同步發生,從而消除所有一致性通信和協議爭用,達到減少GPU 一致性的開銷的目的。文獻[40]提出CPU-GPU 硬件緩存一致性不要同時實現統一共享內存和高GPU 性能的思想。文獻[41]針對CPU-GPU 系統開發了異構系統一致性協議(HSC),以緩解GPU 內存請求的一致性帶寬效應。文獻[42]提出一種軟件輔助硬件一致性(SAHC)來擴展Cache 一致性以適應異構處理器。系統軟件通常具有跨CPU 和GPU 共享數據模式的語義知識。這些高級知識可用于在異構處理器中跨面向吞吐量的GPU 和對延遲敏感的CPU 提供緩存一致性。SAHC 提出了一種混合軟硬件機制,該機制僅在需要時才使用硬件一致性,同時使用軟件知識過濾掉大部分不必要的一致性通信。
從上述研究可以看出,眾核上的Cache 一致性協議設計工作圍繞可擴展和低開銷的設計目標,針對典型數據共享模式和眾核處理器體系結構開展軟硬件協同設計,提出的大多是一種有裁減的弱一致性協議。
SPM 結構的特點是完全將數據的布局與傳輸交給軟件,面向SPM 結構的眾核程序的編程與優化,必須解決好程序數據的布局與傳輸兩個關鍵環節。
3.2.1 基于SPM 的堆棧空間管理
在只有SPM 結構的眾核系統上,軟件必須顯式地管理每個核心本地SPM 的進出數據,包括全局數據、堆空間數據、棧空間數據的管理。當核心對應的所有數據都能在本地SPM 上放下時,程序執行效率非常高。當核心程序對應的數據總量超出本地SPM容量時,必須進行顯式數據管理才能使SPM 發揮出較好的性能。對全局數據而言,用戶通常可以將其分為兩種,一種是可以完整放入SPM 中的變量,另一種是無法放入SPM 空間的全局數據(數據容量超過SPM 空間,或者SPM 空間已滿),用戶可以在程序需要數據之前通過DMA 引入數據到SPM,在不再需要數據之后將其返回到全局內存。當程序的全局數組總容量超過SPM 空間時,程序員需要考慮哪些數組布局在SPM,哪些數組布局在主存并通過DMA 進行傳輸。對于C/C++程序來說,全局靜態數據是可以在編譯時確定容量的,而其棧空間或者堆空間數據其大小是可變的,并且與輸入數據有關,用戶通常沒有有效的方式來管理堆數據和棧數據。由于堆棧數據的訪問是程序中內存訪問的重要部分,因此必須有高效的堆棧管理手段來發揮SPM 的性能。
基于SPM 的存儲層次對程序員提出了很高的要求,需要對算法和片上存儲層次特點都有非常準確的把握,而且程序實現起來工作量也很大。為此,國際上開展了許多面向軟件管理的存儲層次的編譯優化研究,一類是面向SPM 的靜態分配技術[43-45],通過采用啟發式或者整數線性規劃等算法,確定哪些數據布局進SPM,哪些放置在主存中,還有一類是動態分配技術[46-49],包括軟件Cache 技術、基于圖著色算法的SPM 分配與自動DMA 技術等。文獻[50-54]專門針對眾核系統面向SPM 的堆棧空間管理開展了長期深入的研究。在棧空間管理方面,他們最初提出了局存容量受限的眾核處理器上的棧數據管理的方案[50],支持在SPM 上的任意空間上管理任何任務的棧數據,并正確管理所有棧指針,但是其管理開銷較高,并且管理沒有得到優化。在此技術上,文獻[54]對棧數據管理做了進一步優化,并減少其管理開銷。在堆空間管理方面,文獻[51-52]提出了一種半自動的、可擴展的堆數據管理框架,通過提供簡單直觀的編程接口來幫助用戶實現自動管理堆數據,隱藏了軟件緩存堆數據的復雜性。之后又在文獻[53]中進一步提出一種全自動、高效的堆數據管理框架,通過一個編譯和運行時系統,實現在有限的本地內存眾核體系結構中自動管理無限大小的堆數據。文獻[48]在上述框架基礎上進一步開展了3 種通用優化,使得堆管理框架更加高效。
3.2.2 基于SPM 的片上數據移動
為了更好地發揮SPM 的結構優勢,HPC 領域的主流眾核系統片上存儲結構設計通常會提供DMA來加強SPM 與主存間數據的傳輸效率,同時利用NoC 實現片上眾多核心間SPM 的互連,增大單核心可見的SPM 容量。SPM 的容量、DMA 訪存帶寬、NoC 通信帶寬都是眾核系統實現核心數據高效傳輸與訪問的重要資源,復雜的眾核應用需要通過對核心數據進行合理高效的劃分、映射與傳輸,才能實現上述片上資源的高效率用。比如通過循環變換等技術可以增加SPM 數據的重用率,減少數據進出SPM的頻率。核心間基于NoC 的數據傳輸帶寬要比從主存到SPM 的DMA 帶寬高很多,可以結合應用訪存特征合理分配數據與任務,使得多核心間可通過遠程內存訪問(Remote Memory Access,RMA)命令或者RLD/RST 共享SPM 上的數據,發揮NoC 的優勢,提升SPM 數據在片上的重用率,這些方法都可以降低應用程序對單個核心的SPM 容量需求,緩解DMA訪存壓力。上述工作對用戶編程和編譯器優化提出了巨大挑戰。國際上有許多工作圍繞SPM 結構特點開展高效性與好編程性的研究,從不同角度提出了許多面向SPM 高效編程的優化方案、框架、運行時庫及編譯優化,為用戶開發高效的SPM 眾核程序提供編程優化指導或者編譯優化支持。
文獻[55]針對SPM 用于多線程應用程序時遇到的挑戰,提出了協調數據管理(CDM),這是一個編譯時框架,可以自動識別共享/私有變量,并將這些變量及這些變量的拷貝(如果需要)一起放置到合適的片內或片外存儲器中,同時考慮NoC 爭用。另外,還開發了一個精確的整數線性規劃(ILP)公式以及一個迭代的、可伸縮的算法,用于將多線程應用程序中的數據變量放置在多個核心SPM 上。文獻[56]提出了一個用于優化異構多核體系結構上SPM 和主存之間的多線程數據傳輸的編譯時框架MSDTM,該框架通過應用程序分析和依賴性檢查來確定數據傳輸操作的分配,并通過所設計的性能模型來推導數據傳輸的最佳粒度。文獻[57]提出一個名為UniSPM 的框架,使用低開銷的遞歸啟發式算法來解決NP-hard 的映射問題,為基于NoC 的SPM多核多階段多線程應用程序提供統一的線程和數據映射框架。文獻[58]針對眾核平臺存儲層次特點提出了一種基于運行支持庫的OpenMP 數組私有化的編譯優化方法,對可重用數據進行私有化,充分利用有限的SPM 資源減少DMA 通信,以提升程序執行效率。文獻[59]針對“神威·太湖之光”超算系統上支持DMA 的SPM 存儲結構,提出了一種基于帶寬感知的OpenCL 程序循環平鋪方法,對傳統的僅帶寬和僅容量考慮的循環平鋪方法進行了改進,有效提升了帶寬利用率和SPM 重用。文獻[60]基于SPM提出了一種新的GPU 資源管理方法EXPARS,通過將寄存器文件擴展到SPM 內存,通過未被充分利用的SPM 來支持額外的寄存器分配,在邏輯上提供了一個更大的寄存器文件。文獻[61]針對申威眾核處理器核心的SPM 存儲結構特點,開展了基礎函數庫的內存延遲優化,提出一種有效的自動數據轉換方法和一種表查找方法來優化基礎函數庫的訪存延遲。
相比純Cache 或者純SPM 結構的存儲層次,混合結構具有兩者的優勢。原本SPM 結構下最棘手的程序堆棧空間管理問題在混合結構下可以得到很好的緩解——堆棧空間可以直接放在主存,基于Cache 進行緩存。而原本引起嚴重Cache 沖突的數據可以優先布局進SPM,或者利用DMA 加SPM 緩沖的方式避免數據進入Cache。因此,混合結構下存儲層次的優化,重點在于如何聯合Cache 和SPM 開展全視角優化以獲得一加一大于二的性能。
國際上針對混合結構的片上存儲層次優化開展了一系列研究。文獻[62]利用DMA 實現SPM 數據的動態換入換出,從而避免了傳統動態優化技術利用數據Cache 實現數據搬運可能造成的對數據Cache 的污染問題,并利用類似虛擬內存管理的思想,將部分動態申請且頻繁引起數據Cache 沖突的堆棧數據和堆數據的連續虛地址空間重定位到SPM中獲得系統性能和能耗的收益。文獻[63]研究了6 種不同的SPM 分配算法來優化混合SPM 緩存結構的性能或能耗,并通過實驗證明感知Cache 的SPM分配比不感知Cache 的SPM 分配具有更好的性能或能耗的結論。文獻[4]認為在混合體系結構中可將頻繁使用的數據分配給SPM 以進行快速檢索來降低對緩存的訪問頻率,因此可將混合SPM+Cache 的Cache 行更主動地置于低功耗模式,在不顯著降低性能的情況下減少更多的泄漏能量。文獻[57]提出一種編譯器技術將應用程序數據對象映射到SPMCache,以整個程序優化為目標,根據SPM 和Cache大小以及應用程序的動態需求進行數據分配。文獻[64]提出一種Cache 和SPM 參數可動態配置的可重構片上統一存儲器(RcfgMem),通過動態調整Cache 的關聯度和SPM 的容量等片上存儲資源的參數,可以適應不同的應用程序或同一應用程序在不同階段對存儲層次的需求,在不損失系統性能的前提下達到降低系統能耗的目的。文獻[65]通過一種軟硬協同的方式支持SPM 到主存的映射,實現SPM與主存間的自動隱式數據傳輸,減輕用戶顯式調用DMA 傳遞數據的編程負擔,并通過支持重映射和利用SPM 壓縮存儲機制提升SPM 空間的利用率,同時又避免了Cache 結構下訪問TLB 所需的延遲開銷和Cache 不命中開銷。
在眾核體系結構日益復雜的趨勢下,眾核片上存儲層次的設計與優化使用面臨許多關鍵技術挑戰,需要開展軟硬件協同設計。下文從硬件、軟件和算法3 個層面的未來發展進行展望:
1)硬件設計層面。隨著E 級系統眾核處理器上集成的核心數量越來越多,片上互連能力越來越復雜,傳統的多級Cache 或者SPM 將無法滿足新興眾核結構上存儲層次的發展需求,眾核處理器片上存儲層次會越來越豐富。從存儲層次結構發展趨勢上來看,Cache 與SPM 混合的結構因其更好的應用適應性而更可能成為未來眾核片上存儲層次的主流結構。而如何基于片上網絡實現眾核心間SPM 的數據共享、數據批量傳輸以及可擴展的Cache 橫向一致性都將是未來片上存儲結構的重要研究方向。總之,面向超大規模E 級系統的眾核處理器片上存儲層次的設計需圍繞系統的整體設計目標開展,未來非常有必要針對大量目標應用場景進行數據訪問特征分析,并結合片外內存訪問帶寬、片上網絡結構、片上可用面積、整體功耗控制等條件開展平衡設計。
2)軟件設計層面。從編譯優化角度來看,可以對應用程序核心數據容量、數據訪問粒度和重用情況開展分析,并建立好的訪存收益評估模型,為數據分配合理的實際地址空間(SPM 或者主存)以及為主存數據訪問選擇高效的傳輸方式(DMA、RMA、Cache 模式);在編程語言設計角度,可以為專家級用戶提供顯式的存儲層次描述手段,方便用戶直接控制核心數據的布局與傳輸,或者指導編譯器開展相應的編譯優化與程序變換工作,從而提升眾核片上存儲層次的易編程性與高效性;在編程框架設計角度,可以針對領域應用特征,開發多平臺統一的編程框架接口,底層針對不同的眾核處理器片上存儲層次特點,開展具體的優化實現,從而提升應用面向不同片上存儲結構的性能可移植性;在運行時支撐庫的角度,應該針對目標平臺的存儲層次特點開展領域典型算子庫的設計與實現,為應用程序開發提供平臺相關的高效API 接口支撐。
3)算法與程序設計層面。就HPC 用戶層面而言,需要針對具體的目標平臺上的存儲層次特點,結合應用核心運算特征,開展高效的眾核并行算法模型設計。并行算法模型需要根據應用的核心任務數據量和訪問特征研究線程間無關并行、線程間流水并行、基于共享內存或片上通信的多線程協同并行、主從異步并行等方式,再基于具體的并行模式開展數據布局與傳輸方案設計。而應用程序級的優化則需要結合目標平臺眾核片上存儲層次的具體特點,比如SPM 的容量大小、共享范圍、訪問帶寬和延時,再進一步結合程序核心循環的數據訪問方式、數據量等開展數據布局優化、SPM 數據重用優化、批量數據傳輸優化、基于SPM 緩沖的數據傳輸與計算重疊優化等,從而使應用程序能夠更好地發揮出存儲層次的優勢,提升應用效率。
本文闡述了3 類常見的片上存儲結構及特點,分析了國際主流GPU、同構眾核及國產眾核等面向主流E 級超算系統的眾核處理器片上存儲層次設計現狀與發展趨勢,并總結了國際上的存儲層次設計與優化相關軟硬件技術的研究現狀。后續將針對具體的應用領域,對應用獲得的性能與片上存儲結構類型及各種結構參數的定量關系方面開展研究,從而為眾核片上存儲層次的軟硬件設計給出更具體的參考依據。