趙士彭 張立志 章隆兵
(*計算機體系結(jié)構(gòu)國家重點實驗室(中國科學(xué)院計算技術(shù)研究所) 北京100190)
(**中國科學(xué)院計算技術(shù)研究所 北京100190)
(***中國科學(xué)院大學(xué) 北京100049)
圖形處理器(graphic processing unit,GPU)[1]是計算機系統(tǒng)[2]中處理3D 實時圖形程序的專用加速芯片,已經(jīng)成為計算機系統(tǒng)中不可或缺的一部分。圖形處理器作為圖形加速器,在游戲、通用計算、圖像處理等領(lǐng)域都發(fā)揮著不可替代的作用。在現(xiàn)代計算機系統(tǒng)中,GPU 已經(jīng)變得越來越不可或缺,且變得越來越復(fù)雜[3-6]。
伴隨著圖形處理器性能的增長,數(shù)據(jù)量出現(xiàn)大幅提高[7-9],訪存的瓶頸也日益凸顯。目前的圖形處理器訪存子系統(tǒng)已經(jīng)嚴重限制了性能的提高,成為圖形處理器急需解決的瓶頸之一。
嵌入式圖形處理器由于其面積小、功耗低等特點,受到了很多廠商的追捧。在有限的面積上設(shè)計出更低功耗的圖形處理器也成為業(yè)界的研發(fā)方向之一。圖形處理器由于其訪存密集、數(shù)據(jù)量巨大,訪存子系統(tǒng)在嵌入式圖形處理器中急需改進。
綜上所述,鑒于訪存子系統(tǒng)對GPU 性能的嚴重制約,訪存性能也由于技術(shù)難度無法和計算速度匹配,嵌入式圖形處理器由于其面積和功耗等方面的限制,對于訪存子系統(tǒng)的制約更為嚴重,對訪存子系統(tǒng)的改進需求也更為迫切。
傳統(tǒng)的圖形處理器訪存子系統(tǒng)通常采用通用的cache 結(jié)構(gòu),采用增加二級cache 或三級cache的方式,提升cache 命中率,提升訪存子系統(tǒng)性能。又或者選擇增加cache 容量的方式,減少cache的缺失,提高訪存子系統(tǒng)性能。這些通用的提升訪存子系統(tǒng)性能的方式,均沒有針對圖形流水線的數(shù)據(jù)及訪存特點,針對性地定制化重新設(shè)計cache 結(jié)構(gòu)而提高訪存子系統(tǒng)的性能。
本文針對圖形處理器訪存的特點,對cache的結(jié)構(gòu)進行了優(yōu)化,并提出了一種基于鏈表方式的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計。通過對cache 結(jié)構(gòu)的優(yōu)化,有效地減少了面積,并降低了功耗。通過鏈表的設(shè)計方法,可以有效地合并具有相關(guān)性的訪存請求,消除訪存之間的相關(guān)性,不堵塞圖形流水線。同時,鏈表方式的設(shè)計,可以保證訪存請求的亂序執(zhí)行,更進一步提高訪存子系統(tǒng)的性能及效率。
本文通過分析圖形應(yīng)用的行為方式,適配并行圖形處理流水線的訪存需求,提出了一種屏幕分區(qū)方法。通過將屏幕進行有效的分區(qū),將訪存請求均勻地分散在cache的4 個bank 上,在消除cache 一致性問題的同時,避免了訪存請求過于集中于某一訪存流水線,導(dǎo)致負載不均衡。
本文在第1 節(jié)介紹了目前最具代表性的圖形處理器廠商訪存子系統(tǒng)結(jié)構(gòu)設(shè)計及參數(shù),分析了各大圖形處理器廠商對于訪存子系統(tǒng)的發(fā)展趨勢。第2節(jié)介紹了本文提出的面向嵌入式圖形處理器的訪存子系統(tǒng)設(shè)計。第3 節(jié)介紹了基于本設(shè)計的實驗結(jié)果及分析。第4 節(jié)對本設(shè)計進行了總結(jié)。
在當下處理器計算性能大幅提升的前提下,存儲結(jié)構(gòu)漸漸成為了處理器性能提升的主要瓶頸。圖形處理器的計算單元無論是數(shù)量還是速度上近幾年都得到了大幅度的提升,訪存的瓶頸也越來越凸顯。近幾年,Nvidia 和AMD 兩大圖形處理器廠商的白皮書都拿出相當一部分的篇幅講述訪存子系統(tǒng)結(jié)構(gòu)的改進以及帶寬的優(yōu)化。這兩家圖形處理器巨頭廠商對于訪存子系統(tǒng)的改進方案各有不同。AMD 選擇將cache 層級做得更加深入,增加了多級的統(tǒng)一cache。Nvidia 則選擇增大cache 容量,提高訪存性能。
Nvidia 和AMD 是目前行業(yè)領(lǐng)先的圖形處理器研發(fā)廠商,在行業(yè)內(nèi)具有引領(lǐng)作用。由于商業(yè)模式,二者均沒有公開其具體的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計,但通過其發(fā)布的白皮書也可分析出當前行業(yè)趨勢。Nvidia 自2012 年起共發(fā)布了4 種圖形處理器架構(gòu)的白皮書[10-14],分別是2012 年的Kepler 架構(gòu)、2014年的Maxwell 架構(gòu)、2016 年的Pascal 架構(gòu)以及2018年的Turing 架構(gòu)。AMD的訪存子系統(tǒng)結(jié)構(gòu)主要是GCN(graphic core next)系列架構(gòu)以及2019 年新發(fā)布的RDNA 架構(gòu)[15-19]。
表1 是Nvidia 各架構(gòu)白皮書中的訪存子系統(tǒng)結(jié)構(gòu)各項數(shù)據(jù)。由表1 中的數(shù)據(jù)可以看出,Nvidia 自Kepler 架構(gòu)開始,訪存子系統(tǒng)的結(jié)構(gòu)層次沒有發(fā)生很大的變化,但cache 容量出現(xiàn)大幅增加。圖1 是AMD 在白皮書中披露的訪存子系統(tǒng)結(jié)構(gòu)層次。從圖1 中可以看出,AMD 主要是改變了訪存子系統(tǒng)的結(jié)構(gòu)層次,cache的級數(shù)越做越深。圖2 是AMD的Vega 架構(gòu)與RDNA 架構(gòu)的cache 容量的比較。從圖2 可以看出,Icache 和Kcache的總?cè)萘考靶腥萘烤辛舜蠓岣摺DNA 架構(gòu)中的L0 cache 相當于Vega 架構(gòu)的L1 cache。新增加的L1 cache 與ROP(raster operation processors)單元共享。L2 cache 將copy engine 即DMA(direct memory access)進行了集成共享。
圖1 AMD 3 種訪存子系統(tǒng)層次圖
圖2 AMD 最新訪存子系統(tǒng)cache 容量
表1 Nvidia 4 種架構(gòu)訪存子系統(tǒng)及ROP 數(shù)據(jù)
通過比較AMD 與Nvidia 兩家行業(yè)領(lǐng)先廠商的訪存子系統(tǒng)結(jié)構(gòu),可以看出AMD 更傾向于將訪存子系統(tǒng)的結(jié)構(gòu)層次不斷做深,并逐漸采用統(tǒng)一的cache 結(jié)構(gòu)。AMD的GCN4 訪存子系統(tǒng)結(jié)構(gòu)沒有Nvidia的統(tǒng)一L2 cache,AMD的RDNA的訪存子系統(tǒng)結(jié)構(gòu)比Nvidia 做的更深更統(tǒng)一。Nvidia的訪存子系統(tǒng)結(jié)構(gòu)層級始終選擇統(tǒng)一的L2cache,SP(stream processor)擁有獨立的L1 cache,這和AMD的Vega架構(gòu)存儲結(jié)構(gòu)層次是一致的。
在AMD 在GCN4 及其之前的架構(gòu)訪存子系統(tǒng)層次中,SP 單元擁有獨立的存儲結(jié)構(gòu)層級,擁有獨立的L1 和L2 cache,不與其他單元共享。ROP 單元通過獨立的depth/stencil cache 和color cache 直接訪問顯存。命令處理器的指令等信息也直接訪問顯存。Vega 架構(gòu)則將L2 cache 做成統(tǒng)一的cache 結(jié)構(gòu),ROP 單元與命令處理器均采用該統(tǒng)一cache。AMD在最新的RDNA 架構(gòu)中則又進一步做深訪存子系統(tǒng)層次。SP 內(nèi)部采用L0 cache、Icache 和Kcache,并與ROP 單元采用統(tǒng)一的L1 cache。為了適配SP的只讀訪存特性,與ROP 統(tǒng)一的L1 cache 選擇做成只讀cache,ROP 單元的寫操作直接操作L2 cache。隨著AMD的訪存子系統(tǒng)結(jié)構(gòu)越做越深,Vega 架構(gòu)采用統(tǒng)一的L2 cache,并使L2 cache 容量增加至4 MB。RDNA 架構(gòu)的L0 cache 相當于Vega 架構(gòu)的L1 cache。新增加的統(tǒng)一L1 cache 容量大小為128 kB。越來越多的統(tǒng)一cache 出現(xiàn),所有的cache 行容量均出現(xiàn)不同幅度的增加。另一GPU 廠商Nvidia的訪存子系統(tǒng)層次則從2012 年發(fā)布的Kepler 起沒有再進一步做深,始終采用了與AMD的Vega 系列相同的訪存子系統(tǒng)結(jié)構(gòu)層次。但Nvidia的L2 cache 容量卻不斷增加。L1 cache 從Maxwell 架構(gòu)開始便采用1 個SM 內(nèi)部共享1 個L1 cache。Turing 架構(gòu)則為了通用計算更進一步將96 kB的L1 cache 拆分成64 kB的share cache 加上32 kB的L1 cache 或32 kB的share cache 加上64 kB的L1 cache 2 種結(jié)構(gòu)。
綜上所述,AMD 與Nvidia 提高訪存子系統(tǒng)性能的方法均是采用提高cache 容量以及增加cache的層級等通用的方式。這種方式的好處是方法更加通用,也可以對訪存子系統(tǒng)的性能起到提升的作用。但它未能針對圖形處理流水線的特點進行特定的優(yōu)化,也未能對面積、功耗等方面進行權(quán)衡。
本文采用針對圖形處理器訪存子系統(tǒng)的訪存特點,提出一種基于鏈表方式的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計和負載均衡設(shè)計。在提升訪存子系統(tǒng)性能的同時,該設(shè)計具有更小的面積,更低的功耗,更加符合嵌入式圖形處理器的訪存子系統(tǒng)要求。
圖形處理流水線的訪存請求具有一定的相關(guān)性。在圖元處理過程中,具有相關(guān)性的訪存請求必須要按序處理,并需要避免寫后讀(read after write,RAW)相關(guān)。這樣,訪存流水線將會堵塞等待,最終會導(dǎo)致圖形流水線的堵塞。
當進行cache 查找后,cache 缺失的請求會進入訪存的miss 隊列,并發(fā)出訪存總線請求。當前后2個訪存請求均需要讀取相同的像素塊時,2 個訪存請求就具有了相關(guān)性。為保證功能的正確性,后一個訪存請求必須要等待前一個訪存請求處理完之后才可以進行處理。這會堵塞圖形處理流水線,導(dǎo)致性能損失。
嵌入式圖形處理器對于面積和功耗的要求也更加嚴格,追求面積更小、功耗更低。通常的圖形處理器訪存子系統(tǒng)設(shè)計,采用了通用的cache 作為片上緩存。分析圖形處理流水線可知,為了優(yōu)化效率,不堵塞圖形流水線,訪存子系統(tǒng)需要在同一拍同時處理讀和寫請求,這樣才能達到完全流水。通常的訪存子系統(tǒng)設(shè)計需要在命中情況下達到全流水。傳統(tǒng)的圖形處理器訪存子系統(tǒng),采用通用cache 作為片上緩存,當發(fā)生讀或?qū)懻埱髸r,均需要查詢TagRAM,讀回填和寫請求都需要寫DataRAM。這樣為了滿足圖形流水線需求,則需要兩讀兩寫的四端口RAM 作為Tag 和Data的片上存儲,這樣做將會浪費大量的面積及功耗。
本文提出了一種基于鏈表方式的cache 結(jié)構(gòu)設(shè)計。本設(shè)計不僅取消了訪存的相關(guān)性,同時支持亂序訪存,提高了訪存效率的同時并減少了面積,降低了功耗。
本文提出的鏈表方式的設(shè)計,結(jié)合訪存miss的隊列,可以有效消除圖形處理流水線中訪存請求之間的相關(guān)性。圖3 是本文提出的鏈表方式設(shè)計,在訪存miss 隊列中加入像素塊的首地址以及指向下一個同地址請求的隊列項指針。當隊列中沒有相關(guān)的訪存請求時,則以正常按序發(fā)出訪存總線請求。當隊列中出現(xiàn)相關(guān)性的訪存請求時,則將指針指向當前的隊列項,更新為當前的隊列項號。每一次查找相關(guān)性請求均可通過鏈表的有效隊列進行并行查找,提高相關(guān)性請求的查找效率。為避免具有相關(guān)性的訪存請求多次發(fā)出總線請求,導(dǎo)致讀出顯存中的舊值引起訪存功能性錯誤,鏈表方式設(shè)計在查找出相關(guān)訪存請求后,后續(xù)的相關(guān)訪存請求不會再進行總線請求。
圖3 訪存子系統(tǒng)中的鏈表設(shè)計
本文提出的鏈表方式設(shè)計,不僅可以消除訪存中的相關(guān)性,更可以進行亂序訪存,進一步提高訪存子系統(tǒng)效率。圖形處理流水線中,雖然要求每一級流水級都需要嚴格按序處理,以防亂序?qū)е聢D形在深度測試及顏色混合時出現(xiàn)錯誤,但嚴格按序只需保證具有相關(guān)性的訪存請求進行按序處理;其余不具有相關(guān)性的訪存可以進行亂序處理,以提高訪存效率。本文提出的鏈表方式設(shè)計,可以通過有效隊列指針,保證具有相關(guān)性的訪存請求順序。同時,對不具相關(guān)性的訪存請求進行亂序訪存發(fā)射,更進一步優(yōu)化了訪存總線效率,提高訪存子系統(tǒng)的訪存效率。
通過鏈表方式設(shè)計,還可以支持無效寫合并(store fill buffer)優(yōu)化。當數(shù)據(jù)具有相關(guān)性時,根據(jù)圖形流水線的特點,后續(xù)數(shù)據(jù)的寫會對前一數(shù)據(jù)的寫進行覆蓋,導(dǎo)致前級流水的cache 回填(Refill)操作不需要關(guān)心、不需要使用。通過鏈表方式設(shè)計,可以等所有鏈表的指針寫操作均完成時,再進行合并的寫操作。
圖4 是本文提出的基于鏈表方式的片上緩存cache的結(jié)構(gòu)圖。根據(jù)圖形處理流水線的訪存特點,針對性地設(shè)計了一種片上緩存cache的結(jié)構(gòu)。當圖形流水線發(fā)出讀請求時,會進行讀cache的TagRAM進行查詢,若命中,則讀DataRAM。若未命中,當數(shù)據(jù)返回時,無需更新TagRAM,數(shù)據(jù)無需回填cache的DataRAM,直接送回圖形流水線,更新在鏈表之中。在cache 缺失進行回填TagRAM 時,需要先堵塞讀Tag 和Data 流水級將數(shù)據(jù)送入執(zhí)行級進行處理,待處理后將結(jié)果寫回DataRAM,并同時更新TagRAM。鏈表中,如果訪存請求存在相關(guān)性,則寫操作時直接前遞給下一流水級,待鏈表中所有相關(guān)性請求執(zhí)行后再進行寫請求更新cache。由于本設(shè)計是基于OpenGL 2.0的圖形處理流水線,深度和模版測試以及顏色混合無需浮點操作,無需考慮計算延遲,所以可以滿足流水性能。
圖4 片上緩存cache的結(jié)構(gòu)設(shè)計框圖
為了提高圖形流水線的處理效率,同時支持4倍多重采樣抗鋸齒(multi sampling anti-aliasing,MSAA)操作,圖形流水線通常采用4 條流水線并行處理。為了保證訪存子系統(tǒng)不會成為處理瓶頸,匹配圖形流水線,訪存子系統(tǒng)流水線也必然需要采用4 條并行處理。為了不引入一致性問題,同時平衡訪存子系統(tǒng)的負載,本文提出了一種訪存子系統(tǒng)的負載均衡設(shè)計。
在進行訪存子系統(tǒng)流水線時,本文提出了一種對屏幕進行分區(qū)處理的方法。圖形流水線是根據(jù)圖元進行光柵化后產(chǎn)生的像素點為基本單位進行處理,訪存子系統(tǒng)通常采用4 ×4 個像素點組成tile 或2 ×2 個像素點組成的quad 為基本單位進行處理。由于訪存的像素點都是通過圖元光柵化得到的,所以訪存請求具有一定的空間局部性。當這些訪存請求被發(fā)射到4 條并行的訪存流水線時,需要保證cache的一致性,即如果顯存數(shù)據(jù)同時在多條訪存流水線中擁有更新數(shù)據(jù),最終會導(dǎo)致深度測試和顏色混合出現(xiàn)錯誤,同時也會引起相關(guān)性等致命錯誤。本文提出的負載均衡設(shè)計是將屏幕按照4 ×4的tile或2 ×2的quad(MSAA的情況下)為基本單位,均勻分散在4 條訪存流水線中,保證每一個tile 或quad 四周的訪存數(shù)據(jù)不會落在同一訪存流水線中,充分地避免了cache 一致性和相關(guān)性帶來的錯誤。圖5 是本設(shè)計采用的屏幕分區(qū)方式,每一個tile 或quad 與四周的訪存數(shù)據(jù)均不在同一訪存分區(qū),四周訪存數(shù)據(jù)不會落在同一訪存流水線,對圖形流水線處理的圖元來說,分布更加均勻,不會出現(xiàn)某一訪存流水線堵塞而其他流水線空閑的情況,負載更加均衡。
圖5 負載均衡的屏幕分區(qū)設(shè)計
為了評估本設(shè)計的訪存子系統(tǒng)的性能、面積及功耗,本文采用現(xiàn)有的高性能圖形處理器,結(jié)合高性能圖形處理器的驅(qū)動設(shè)計,采用了Linux 圖形測試集,進行了本訪存子系統(tǒng)結(jié)構(gòu)設(shè)計的測試。
本文使用的GSGPU 圖形處理器主要由命令處理器(command processor,CP)、全局任務(wù)調(diào)度器(global task scheduler,GTS)、圖形處理集群(graphics processing cluster,GPC)、二級靜態(tài)緩存(L2 SCache)、內(nèi)存控制器(memory controller,MC)5 部分組成。其中圖形處理集群又由計算處理引擎(compute engine,CE)、幾何處理引擎(geometry engine,GE)、圖元處理引擎(primitive engine,PE)、局部任務(wù)調(diào)度器(local task scheduler,LTS)、流處理器集群(stream processor cluster,SPC)、輸出合并單元(output merge unit,OMU)6 部分組成。整體結(jié)構(gòu)如圖6所示。
圖6 GSGPU 圖形處理器的結(jié)構(gòu)框圖
搭載本設(shè)計的GSGPU 圖形處理器光柵化后的訪存基本單位是4 ×4的像素塊,所以在設(shè)計cache行時選擇了4 ×4的像素塊作為cache 行寬度。經(jīng)過性能與面積功耗權(quán)衡后,選取4 路組相連cache,容量大小選擇32 kB。
表2 是搭載本設(shè)計的GSGPU 圖形處理器訪存子系統(tǒng)的訪存請求及cache 命中率。本文選取了基準測試集中最典型的4 個測試用例,分別是2D 渲染測試的Effect 2D、陰影及反射測試的Shadow、折射及超多圖元測試Refract 以及復(fù)雜shader 程序的Jellyfish 測試。圖7 是搭載本設(shè)計訪存子系統(tǒng)的GSGPU 圖形處理器渲染效果圖。
表2 訪存子系統(tǒng)訪存請求及命中率
圖7 搭載本設(shè)計的GSGPU 圖形處理器渲染效果圖
從圖7 可以看出,本文提出的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計在功能上完全正確,訪存結(jié)果無誤。在針對2D渲染場景時,頂點數(shù)量雖然只有4 個,但訪存請求是根據(jù)像素點為基本單位進行計算。經(jīng)過光柵化成像素點后,訪存請求的數(shù)量也達到了8070 次。通過測試集的測試用例可以看出,即使再簡單的測試用例,渲染一幀的圖像,圖形處理器的訪存請求數(shù)量依然很多,訪存子系統(tǒng)的壓力依然巨大。所以,針對訪存子系統(tǒng)的優(yōu)化對于圖形處理器的性能提升具有很大的幫助。
通過表2 可以看出,搭載本設(shè)計的訪存子系統(tǒng)在少至8070 個的訪存請求、多至647 680 個的大量訪存請求下,均可以正常處理。在如此巨大的訪存請求下,鏈式邏輯設(shè)計可以完全消除訪存相關(guān)性,并亂序訪存提高性能,這將對訪存子系統(tǒng)和圖形處理器整體性能提升起到巨大的作用。由于圖形處理器的訪存請求通常不具備良好的時間局部性,所以在普通的圖形處理程序中,cache的命中率有限,后續(xù)也可通過預(yù)取等方式提升命中率。
本文采用Synopsys Design Compiler 對提出的訪存子系統(tǒng)的RTL 代碼進行綜合,工藝庫選擇C28SOI表3 和表4 分別是功耗綜合報告以及面積綜合報告。從綜合報告可以看出,本訪存子系統(tǒng)總功耗僅需1.45 W。當前,新發(fā)布的商用高性能嵌入式圖形處理器總功耗約為40 W 左右[23]。與之相比,在滿足性能需求的情況下,本設(shè)計完全滿足嵌入式圖形處理器對于功耗方面的要求。本訪存子系統(tǒng)面積也滿足當前嵌入式圖形處理器的設(shè)計指標。
表3 Synopsys Design Compiler 功耗綜合結(jié)果
表4 Synopsys Design Compiler 面積綜合結(jié)果
本文通過分析圖形處理流水線訪存請求的特點,提出了面向嵌入式圖形處理器的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計。本設(shè)計針對圖形處理流水線的訪存特點,對cache的結(jié)構(gòu)進行了優(yōu)化設(shè)計,大幅減少了訪存子系統(tǒng)的面積并降低了功耗,更適合嵌入式圖形處理器設(shè)計。本設(shè)計提出的基于鏈表方式的訪存子系統(tǒng)結(jié)構(gòu)設(shè)計,有效地消除了圖形流水線的訪存請求的相關(guān)性,當相關(guān)性訪存請求時不再堵塞流水線,還可以通過亂序訪存提升訪存性能和效率。本文提出了一種屏幕分區(qū)方式,適配并行圖形處理流水線,消除cache的一致性問題,使訪存負載更均衡。實驗通過搭載在GSGPU 圖形處理器,跑通圖形基準測試集,完成了正確性驗證。并通過Design Compiler 進行了面積及功耗方面的評估,達到了嵌入式圖形處理器的設(shè)計指標。本設(shè)計為提高嵌入式圖形處理器訪存子系統(tǒng)的性能設(shè)計提出了一個新的方向,也為嵌入式圖形處理器的訪存子系統(tǒng)設(shè)計提供了重要的參考。