舒 兵,任秀江,張清波,陳芳園
(江南計(jì)算技術(shù)研究所,江蘇 無(wú)錫 214083)
微處理器的發(fā)展已經(jīng)進(jìn)入了眾核時(shí)代,NVIDIA的通用圖形處理器(GPGPU)是典型的GPU眾核架構(gòu),它在片上集成了大量簡(jiǎn)單的計(jì)算核心,通過簡(jiǎn)單運(yùn)算部件的聚合提供超高計(jì)算性能。NVIDIA的Fermi[1]、Kepler[2,3]架 構(gòu) 的 處 理器等是其中的典型代表。GPGPU大量的計(jì)算核心提供了并行加速的能力,適合數(shù)據(jù)的并行處理。隨著2007年NVIDIA統(tǒng)一軟件并行編程模型CUDA[4,5]的 推 出,在NVIDIA GPU上 的 應(yīng) 用 與研究越來(lái)越多,廣泛涉及生物、物理、天文、信號(hào)、醫(yī)藥、勘探等各個(gè)科學(xué)研究和工程領(lǐng)域。NVIDIA GPU的片上存儲(chǔ)結(jié)構(gòu)比較復(fù)雜,包括Register File和多級(jí)Cache結(jié)構(gòu)以及Shared Memory等,這種復(fù)雜的存儲(chǔ)結(jié)構(gòu)可有效提升GPU對(duì)應(yīng)用的適用性。
統(tǒng)計(jì)資料表明,眾多科學(xué)領(lǐng)域的數(shù)據(jù)量隨時(shí)間呈指數(shù)增長(zhǎng),且基數(shù)較大。以科學(xué)研究為例,生物醫(yī)學(xué)、天文觀測(cè)、信號(hào)處理、互聯(lián)網(wǎng)絡(luò)等等研究領(lǐng)域每年都會(huì)產(chǎn)生PB甚至ZB量級(jí)的數(shù)據(jù),并且還在以指數(shù)函數(shù)的速度增長(zhǎng)。除了數(shù)據(jù)量大的特點(diǎn),這一類的數(shù)據(jù)一般還具有非結(jié)構(gòu)化、可分性好、復(fù)用率較低、實(shí)時(shí)性要求等等特點(diǎn)。具有上述特點(diǎn)的應(yīng)用可稱之為數(shù)據(jù)密集型應(yīng)用,對(duì)于數(shù)據(jù)密集型應(yīng)用的處理大多集中在檢索、查詢、分析與挖掘這些方面,統(tǒng)稱為數(shù)據(jù)密集型計(jì)算DIC(Data Intensive Computing)。數(shù)據(jù)密集型應(yīng)用的計(jì)算訪存比相對(duì)偏低,存儲(chǔ)器操作成為應(yīng)用性能的瓶頸,處理這類應(yīng)用的重點(diǎn)在于數(shù)據(jù)的存儲(chǔ)和傳輸。未來(lái)是數(shù)據(jù)的時(shí)代,數(shù)據(jù)密集型應(yīng)用將占據(jù)越來(lái)越重要的比例,從處理器存儲(chǔ)架構(gòu)方面提升該類應(yīng)用的性能具有現(xiàn)實(shí)意義。
本文主要通過分析數(shù)據(jù)密集型典型應(yīng)用自身的數(shù)據(jù)特點(diǎn)及其在GPU上的數(shù)據(jù)映射關(guān)系,通過GPGPU-SIM所模擬的NVIDIA GT200、Fermi這兩種架構(gòu)上的應(yīng)用表現(xiàn)分析GPU存儲(chǔ)結(jié)構(gòu)對(duì)該類應(yīng)用的影響,對(duì)適應(yīng)數(shù)據(jù)密集型應(yīng)用的GPU眾核處理器存儲(chǔ)層次設(shè)計(jì)提出了建議,進(jìn)而為通用眾核處理器存儲(chǔ)層次優(yōu)化提供參考。
Fermi架構(gòu)的CUDA核心數(shù)高達(dá)512個(gè)。512個(gè)CUDA核心組成16個(gè)流式多核處理器(SM),每個(gè)SM包含32個(gè)CUDA核心。芯片內(nèi)部還包含六個(gè)64位的DRAM通道,每個(gè)通道的訪存帶寬約為32GB/s。GigaThread全局調(diào)度器負(fù)責(zé)分配線程塊給SM。
SM中的計(jì)算核心分為四組,其中兩組是流處理器陣列,每組包含16個(gè)CUDA Core,另外一組由16個(gè)load/store單元組成,還有一組四個(gè)特殊功能單元。另外,F(xiàn)ermi架構(gòu)添加了對(duì)完整IEEE754-2008標(biāo)準(zhǔn)的支持,多個(gè)核心協(xié)同支持雙精度浮點(diǎn)運(yùn)算。
SM中,連續(xù)編號(hào)的32個(gè)并行線程組成一個(gè)warp,作為線程調(diào)度單元。每個(gè)SM擁有兩個(gè)warp調(diào)度器和兩個(gè)指令調(diào)度單位,并且兩個(gè)warp可以同時(shí)執(zhí)行和處理。Fermi的雙warp調(diào)度器支持同時(shí)選擇兩個(gè)warp,并從每個(gè)warp向16個(gè)CUDA核心、16個(gè)加載/存儲(chǔ)單元,或四個(gè)SFU發(fā)出操作指令。因?yàn)閣arp是獨(dú)立執(zhí)行的,F(xiàn)ermi的調(diào)度器并不需要檢查指令流內(nèi)的依賴性。使用雙warp調(diào)度模型,F(xiàn)ermi可獲得接近峰值的硬件性能。
為與SM中計(jì)算單元的數(shù)目增多相適應(yīng),F(xiàn)ermi架構(gòu)中單SM中的寄存器文件規(guī)模也有了相應(yīng)的增加,從GT200中的16 384個(gè)增加到了32 768個(gè)。由于CUDA編譯器通常為每個(gè)線程分配10~20個(gè)寄存器[6],因而更多的寄存器通常意味著SM上可同時(shí)運(yùn)行更多的線程,硬件的利用率也就更加充分。G80和GT200的每個(gè)SM都有16 KB的共享存儲(chǔ)器SMEM(Shared MEMory)。在Fermi架構(gòu)中,每個(gè)SM擁有64KB的片上存儲(chǔ)空間,可以配置成48KB的SMEM和16KB的L1 Cache、或16KB的SMEM和48KB的L1Cache。L1Cache與Shared Memory的可配置關(guān)系增加了編程的靈活性和對(duì)應(yīng)用的適應(yīng)性,是在GT200基礎(chǔ)上的一項(xiàng)重要?jiǎng)?chuàng)新。Fermi的L2Cache大小為768KB,由所有的SM所共享。
GPGPU-SIM[7]于2007年由Fung W等人研發(fā),它是一款時(shí)序精確的GPU性能模擬器。它模擬了NVIDIA統(tǒng)一架構(gòu)GPU,并且對(duì)G80、GT200、Fermi等都有很高的模擬精度,針對(duì)不同型號(hào)的GPU都有相應(yīng)的配置文件,參數(shù)修改方便。軟件方面,這款模擬器配合CUDA編程模型,很好地支持了PTX(Parallel Thread eXecution)虛擬指令集和OpenGL。
與硬件結(jié)構(gòu)相對(duì)應(yīng),GPGPU-SIM的功能模塊由三個(gè)部分組成:著色器SC(Shader Core)、互連網(wǎng)絡(luò)(Interconnection Network)以及存控(Memory Controller)。著色器核心通過片上互連網(wǎng)絡(luò)連接到各個(gè)存儲(chǔ)模塊(存控)。
結(jié)合數(shù)據(jù)密集型應(yīng)用的特點(diǎn),本文選取訪存指令占總指令百分比在20%以上的應(yīng)用作為數(shù)據(jù)密集型應(yīng)用的典型代表。為使測(cè)得的訪存指令百分比具有代表性和滿足數(shù)據(jù)密集型應(yīng)用訪存密集的特點(diǎn),本文對(duì)應(yīng)用程序的總指令數(shù)也設(shè)置了一個(gè)標(biāo)準(zhǔn)——1M條以上。
本文選取的應(yīng)用均來(lái)自于GPGPU-SIM v3.1.1的基準(zhǔn)測(cè)試程序[8]及CUDA SDK3.1[9]的程序。根據(jù)應(yīng)用領(lǐng)域及其計(jì)算訪存比的特點(diǎn),選取如下六個(gè)應(yīng)用程序作為典型算法進(jìn)行分析:
(1)高級(jí)加密標(biāo)準(zhǔn)AES;(2)離散余弦變換DCT;(3)快速沃爾什變換FWT;(4)拉普拉斯變換LPS;(5)矩陣乘MatrixMul;(6)神經(jīng)網(wǎng)絡(luò)算法NN。
上面選取的六個(gè)應(yīng)用程序分別涉及密碼、圖像、信號(hào)、數(shù)學(xué)等各個(gè)科學(xué)計(jì)算領(lǐng)域,較全面地涵蓋了數(shù)據(jù)密集型應(yīng)用的范疇,根據(jù)數(shù)據(jù)密集型應(yīng)用的特點(diǎn),本文設(shè)定訪存總指令數(shù)大于1M、訪存百分比為20%以上的應(yīng)用屬于數(shù)據(jù)密集型應(yīng)用,刪選的結(jié)果即如表1所示。
Table 1 Basic parameters of programs表1 選取的應(yīng)用程序基本參數(shù)
根據(jù)指令所使用的存儲(chǔ)部件不同,對(duì)應(yīng)用程序的存儲(chǔ)指令進(jìn)行分類統(tǒng)計(jì),如圖1所示。圖中“Param”指的是通過GPU內(nèi)核call傳輸?shù)膮?shù),即所謂的Cache命中。
Figure 1 Sort instruction in programs圖1 應(yīng)用程序存儲(chǔ)指令分類
可配置的L1Cache和Shared Memory結(jié)構(gòu)是Fermi存儲(chǔ)層次最大的亮點(diǎn),給編程帶來(lái)了較大的靈活性,也增加了Fermi結(jié)構(gòu)對(duì)應(yīng)用的適應(yīng)性和通用性。通過圖1對(duì)應(yīng)用程序存儲(chǔ)指令的分類,可以看出除NN外,另外幾種應(yīng)用都與Shared Memory有密切的關(guān)系。本節(jié)選取了SMEM分別為16KB、32KB、48KB和64KB四種情況,其中SMEM為48KB是基礎(chǔ)情況。測(cè)試結(jié)果進(jìn)行歸一化得到應(yīng)用加速比,如圖2所示。
測(cè)試結(jié)果顯示,有些應(yīng)用對(duì)共享存儲(chǔ)器(或L1 Cache)大小并不敏感,如FWT和DCT;而有的程序在共享存儲(chǔ)器和L1Cache處于某些配置時(shí)性能最好,其他配置下性能下降,如LPS;還有一些應(yīng)用隨Shared Memory的變化呈現(xiàn)遞增或遞減的變化,如MatrixMul和AES。下面逐一分析這六個(gè)應(yīng)用程序性能變化與硬件存儲(chǔ)架構(gòu)的關(guān)系。
(1)AES。
Figure 2 Speedup under different SMEM configurations圖2 不同SMEM配置下應(yīng)用程序加速比
根據(jù)圖1中AES存儲(chǔ)指令的分類可以看到,AES有80%的存儲(chǔ)指令來(lái)自于SMEM,另外近20%的指令是訪問Constant Memory和Texture Memory,訪問Local Memory和Global Memory的諸如Load、Store等操作幾乎可以忽略,而L1 Cache、L2Cache主要服務(wù)于Load、Store等操作,因此L1Cache、L2Cache對(duì)AES的影響幾乎可以忽略。其次,UByte4所占的字節(jié)數(shù)為4+1×4=8,Shared Memory需要的存儲(chǔ)空間大小為256×8×6=12KB。SMEM大于12KB就可以滿足程序的要求,所以SMEM增大,AES性能變好,但當(dāng)SMEM達(dá)到32KB或以上時(shí),SMEM再增大時(shí)AES性能基本不變。
對(duì)于AES在SMEM為較小的16KB時(shí),性能也達(dá)到了288.741 9,一方面是因?yàn)?6KB的SMEM已經(jīng)基本滿足12KB的應(yīng)用程序需求;另一方面,本模擬采用的是L1Cache和SMEM總和固定,L1Cache容量也能起到SMEM容量補(bǔ)充的作用。因此,在16KB配置下,性能還是比較高的。
(2)DCT。
該應(yīng)用的性能都隨SMEM的增大有輕度的下降。DCT只需要兩個(gè)8×8Blocks的Shared Memory存儲(chǔ)空間,即8×8×2×4=1KB(CUDA中一個(gè)單精度浮點(diǎn)數(shù)據(jù)占四個(gè)字節(jié))。測(cè)試的SMEM配置中SMEM大小對(duì)該應(yīng)用程序是足夠的,所以SMEM的增大對(duì)應(yīng)用程序的影響幾乎可以忽略。但是,SMEM增大的同時(shí)L1Cache隨之減小,這個(gè)應(yīng)用有一定量的Load/Store和Param指令(約12%),這些指令對(duì)L1Cache有一定的依賴性。因此,L1Cache的減小會(huì)導(dǎo)致這兩個(gè)應(yīng)用程序性能的損失,但這種損失被大容量的L2 Cache所彌補(bǔ),因此最后表現(xiàn)出的現(xiàn)象是性能的微幅下降。
(3)FWT。
FWT一條線程負(fù)責(zé)四個(gè)數(shù)據(jù)為一組的基-4 FWT計(jì)算(加減運(yùn)算),程序中輸入數(shù)據(jù)的規(guī)模是223個(gè)浮點(diǎn)數(shù)據(jù),共享存儲(chǔ)器中以一個(gè)基-4FWT的四個(gè)輸入數(shù)據(jù)的首地址索引進(jìn)行存儲(chǔ),占一個(gè)單精度浮點(diǎn)的存儲(chǔ)空間。因此,共需要221×4B=8MB的存儲(chǔ)空間才能一次性加載所有輸入數(shù)據(jù)。但是Fermi的SMEM最大為64KB,遠(yuǎn)遠(yuǎn)小于8MB。因此,F(xiàn)ermi采用分塊存取。Fermi一次流水調(diào)度兩個(gè)warp(雙warp調(diào)度),一個(gè)warp有32個(gè)線程,一個(gè)線程需要存儲(chǔ)一個(gè)float數(shù)據(jù)(一組的四個(gè)數(shù)據(jù)的首地址),所以雙warp需要讀取64×4B=256B的數(shù)據(jù),這個(gè)大小遠(yuǎn)小于SMEM最小情況的16KB。每次流水線從全局存儲(chǔ)器拷貝256B的數(shù)據(jù)塊到SMEM,并且通過預(yù)取傳送可以達(dá)到隱藏訪存延遲的目的;另外,存入共享存儲(chǔ)器中的原始數(shù)據(jù)經(jīng)過計(jì)算之后原位存儲(chǔ),這樣達(dá)到了存儲(chǔ)空間的最大化利用,并且大量的Load/Store(40%)操作擁有較高的Cache命中(Param),這也對(duì)FWT的性能起到了積極的作用。上述兩個(gè)因素是FWT性能不隨SMEM明顯變化并且其IPC可以達(dá)到較高水平的根本原因。
(4)LPS。
當(dāng)SMEM為32KB或48KB時(shí),LPS性能最好;而SMEM為64KB(沒有L1Cache)或者SMEM為16KB時(shí),LPS性能損失達(dá)到35%~38%。LPS使用SMEM存儲(chǔ)空間,共需(32+2)×(4+2)×3×4≈2.4KB共享存儲(chǔ)器空間。所以,SMEM不是應(yīng)用性能的限制因素,SMEM為64KB時(shí),沒有L1Cache,LPS有35%左右的Load/Store和Param指令,L1Cache的缺失勢(shì)必導(dǎo)致LPS性能的下降,而且下降的幅度恰好接近35%,與存儲(chǔ)指令的分類數(shù)據(jù)完全吻合;SMEM為16KB時(shí),L1Cache大小為48KB,此時(shí)兩個(gè)存儲(chǔ)結(jié)構(gòu)大小完全滿足需求。但是,LPS性能仍然下降,這是因?yàn)長(zhǎng)1Cache較大時(shí),GPU需要花費(fèi)較多的額外周期,以完成管理Cache等操作,而且L1 Cache越大,這種額外開銷越明顯,因此體現(xiàn)在性能上為IPC下降。
(5)MatrixMul。
該應(yīng)用的表現(xiàn)與DCT比較類似,性能隨SMEM增大而微幅下降。因?yàn)镸atrixMul需要兩個(gè)16×16的Blocks的存儲(chǔ)空間,用于存儲(chǔ)兩個(gè)相乘矩陣的塊數(shù)據(jù),因此需要的存儲(chǔ)空間為:16×16×2×4=2KB。SMEM大小足夠滿足應(yīng)用程序的需求,但6%的Load/Store以及Param操作使得IPC隨L1Cache減小而下降,同時(shí)大容量L2 Cache會(huì)縮小這種變化,所以性能表現(xiàn)出微幅下降。MatrixMul與DCT不同之處在于MatrixMul的絕對(duì)IPC很低,原因在于該應(yīng)用的CUDA程序是與GT200相適應(yīng)的,當(dāng)在Fermi上運(yùn)行時(shí),F(xiàn)ermi存儲(chǔ)部件結(jié)構(gòu)不同造成對(duì)齊訪問機(jī)制失效,產(chǎn)生了嚴(yán)重的Bank沖突,因此IPC非常低下。
(6)NN。
該應(yīng)用比較特殊,它沒有與Shared Memory的交互操作,它的存儲(chǔ)指令有97%屬于Load/Store和Param操作(其中Load指令就占近80%),剩下的3%左右是Constant Memory的訪存操作,所以當(dāng)把L1Cache取消時(shí),NN的IPC性能只有原來(lái)的20%,其他情況下L1Cache都大于或等于16KB,完全滿足要求,因此性能基本不變??梢灶A(yù)見,當(dāng)L1Cache低于某一臨界值時(shí),隨著L1Cache的減小,NN的性能將會(huì)有顯著的損失,這是因?yàn)榇藭r(shí)L1Cache成為其性能的主要限制因素。另外,NN的IPC非常低,只有35左右。與MatrixMul的性能低下原因不同,NN性能較低是因?yàn)榘罅浚?0%)的Load操作,此類操作與片外存儲(chǔ)部件交互,延遲很高,達(dá)到了400~500個(gè)cycles,因此性能非常差。
L2Cache由所有SM所共享,通過片內(nèi)互連網(wǎng)絡(luò)與DRAM連接,主要用于緩存從Global Memory中獲取的數(shù)據(jù)。當(dāng)SM需要讀取輸入數(shù)據(jù)時(shí),首先從L1Cache中查找,若未命中,則到L2 Cache中查找,L2Cache未命中才會(huì)從Global Memory中讀取。L1Cache和L2Cache的命中率一般都可以達(dá)到80%左右,作為片內(nèi)存儲(chǔ)器,L2 Cache一般采用訪問速度較快的SRAM設(shè)計(jì),訪存速度遠(yuǎn)快于片外存儲(chǔ)器,且容量一般比L1 Cache大得多,彌補(bǔ)了L1Cache容量不足和DRAM訪問速度慢的缺點(diǎn)。為了測(cè)試L2Cache對(duì)數(shù)據(jù)密集型應(yīng)用的影響,實(shí)驗(yàn)中選取了L2容量從0到1 536KB等多個(gè)大小,其中L2Cache為768KB是基礎(chǔ)情況。歸一化后的結(jié)果如圖3所示。
L2Cache作為連接DRAM和L1Cache的紐帶,補(bǔ)充了DRAM訪問延遲高和L1Cache容量小的缺點(diǎn)。從測(cè)試的結(jié)果來(lái)看,各個(gè)應(yīng)用都對(duì)L2 Cache有一定的性能表現(xiàn),其中DCT、FWT、LPS和NN的曲線相對(duì)比較明顯,AES和MatrixMul則對(duì)L2Cache不太敏感。具體的原因做如下分析:
(1)AES和MatrixMul。
Figure 3 Speedup under different L2configurations圖3 不同L2配置下應(yīng)用程序加速比
從圖3可以看出,這兩個(gè)應(yīng)用對(duì)L2Cache不太敏感。主要是因?yàn)檫@兩種應(yīng)用的存儲(chǔ)指令絕大多數(shù)為Shared Memory的讀寫指令,其中AES的這類指令占到了總存儲(chǔ)指令的80%,而Matrix-Mul則高達(dá)近95%,這兩種應(yīng)用是六個(gè)應(yīng)用中Shared Memory指令所占百分比最高的兩種。這種指令分布決定了它們對(duì)L2Cache乃至L1 Cache都不敏感,但這兩類應(yīng)用畢竟存在少量的Load/Store以及Param指令,所以當(dāng)取消L2 Cache時(shí),它們的性能又會(huì)有所下降,并且下降幅度隨這三類指令所占百分比呈線性遞減。
(2)DCT和NN。
DCT和NN的性能隨著L2Cache從無(wú)到有、從小到大在宏觀上呈現(xiàn)出增長(zhǎng)的趨勢(shì)。這與它們的Load/Store、Param指令所占百分比較高有直接關(guān)系。比如,DCT的這類指令占到了23%多,NN的這類指令占到了90%以上,所以這兩種應(yīng)用是六個(gè)應(yīng)用中對(duì)L2最敏感的應(yīng)用。在細(xì)節(jié)方面,DCT的IPC在L2Cache低于192KB時(shí)處于低水平平緩狀態(tài),達(dá)到768KB時(shí)增幅較大,此后L2 Cache增大,其性能依然上升;而NN則隨著L2 Cache增大性能平緩上升,在L2Cache超過768KB后性能保持穩(wěn)定不變。造成這種現(xiàn)象的原因與它們的存儲(chǔ)指令數(shù)量有關(guān),如表2所示。
Table 2 Load/Store、Param instructions of DCT and NN表2 DCT和NN的Load/Store、Param指令
DCT的Load/Store、Param指令是NN的三倍多,并且兩者都是對(duì)單精度浮點(diǎn)數(shù)據(jù)進(jìn)行操作。更多的存儲(chǔ)指令需要更大的Cache才能達(dá)到較高的命中率。所以,L2Cache較小時(shí),對(duì)DCT的影響比較小,并且處于一個(gè)較低的水平,而對(duì)NN而言,L2Cache較小時(shí)就可以比較明顯地影響其性能;當(dāng)L2Cache增大到一定程度時(shí),L2Cache對(duì)DCT的影響開始凸顯,隨L2Cache增大其性能也明顯提升,而對(duì)于NN,L2Cache漸漸達(dá)到飽和,所以其性能趨于平緩。
(3)FWT和LPS。
這兩種應(yīng)用的性能表現(xiàn)有一定相似性,當(dāng)L2 Cache不存在或者L2Cache較大(大于或等于768KB)時(shí),其性能都是最高的,而當(dāng)L2Cache處于中間值時(shí),兩者的性能都有一定的損失,如L2 Cache為24KB時(shí),F(xiàn)WT相比于基礎(chǔ)情況性能損失了13.4%,LPS損失了7.3%。L2Cache為0時(shí),L1Cache完全可以滿足Load/Store等指令的需求,并且節(jié)省了L2Cache的管理開銷,因而性能沒有降低;當(dāng)L2較小時(shí),如24KB,L1Cache與L2 Cache的大小處于同一個(gè)數(shù)量級(jí),也就是說(shuō),L1 Cache只能部分映射到L2Cache,這樣會(huì)導(dǎo)致大量的MISS,直接影響應(yīng)用的性能,這就是為什么L2 Cache從無(wú)到有時(shí),性能不升反降的原因。
L2Cache的大小主要與工藝有關(guān),由于L2 Cache結(jié)構(gòu)比DRAM要復(fù)雜得多,因此成本很高,在芯片上所占的面積也很大,因此一般片上二級(jí)Cache容量不能做得很大,F(xiàn)ermi的L2Cache大小為768KB,平均每個(gè)SM可分?jǐn)偧s50KB的L2 Cache;最新的Kepler架構(gòu)擁有1 536KB的統(tǒng)一L2Cache,每個(gè)SM可分?jǐn)偧s100KB的L2Cache,相比于Fermi整整提高了一倍,但是Kepler的核心數(shù)目是Fermi核心數(shù)目的6倍。所以,GPU核心計(jì)算能力的提升和二級(jí)Cache層次的存儲(chǔ)容量提升是不匹配的,存儲(chǔ)不能匹配計(jì)算。另外,F(xiàn)ermi或Kepler每個(gè)SM分?jǐn)偟腖2Cache容量與片上L1Cache與SMEM總體容量相比遠(yuǎn)沒有達(dá)到數(shù)量級(jí)的提升,其二級(jí)存儲(chǔ)容量對(duì)一級(jí)存儲(chǔ)容量的包容不是很明顯,因此本實(shí)驗(yàn)數(shù)據(jù)從總體上看,L2大小從0到1 536KB,六個(gè)應(yīng)用性能變化總體不是很大。
本文通過對(duì)六個(gè)數(shù)據(jù)密集型應(yīng)用在NVIDIA的GT200、Fermi、Kepler三代GPGPU上的大量實(shí)驗(yàn),對(duì)比了不同存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)對(duì)數(shù)據(jù)密集型應(yīng)用性能的影響。通過分析,對(duì)于數(shù)據(jù)密集型應(yīng)用的GPU眾核存儲(chǔ)層次優(yōu)化提出一些建議:
(1)對(duì)于數(shù)據(jù)密集型應(yīng)用,L1Cache/SMEM、L2Cache和片上存儲(chǔ)器(紋理Cache、常量Cache等)的總?cè)萘渴侵陵P(guān)重要的,隨著集成電路工藝的進(jìn)步,片上存儲(chǔ)的容量需要不斷提升。
(2)從Fermi到Kepler的體系結(jié)構(gòu)的變化來(lái)看,片內(nèi)存儲(chǔ)容量的擴(kuò)大沒有很好地與片內(nèi)計(jì)算性能的提升相匹配,甚至有若干倍的差異,這種差異達(dá)到一定程度會(huì)對(duì)某些數(shù)據(jù)密集型應(yīng)用的性能產(chǎn)生較大的影響。所以,隨著片上計(jì)算性能的提升,單位計(jì)算所得到的片上存儲(chǔ)容量需要得到進(jìn)一步重視。
(3)GPU的訪存事務(wù)(合并訪問機(jī)制)就是通過多個(gè)線程同時(shí)訪問存儲(chǔ)空間的同一個(gè)Bank達(dá)到隱藏訪存延遲的目的,對(duì)于數(shù)據(jù)量較大,SMEM不夠滿足一次性加載所有輸入數(shù)據(jù)的數(shù)據(jù)密集型應(yīng)用(例如FWT),分塊存取和預(yù)取技術(shù)可以很好地隱藏訪存延遲并且實(shí)現(xiàn)SMEM的最大化利用。
(4)應(yīng)用開發(fā)以及性能優(yōu)化與硬件結(jié)構(gòu)是密不可分的,應(yīng)用程序需要契合存儲(chǔ)層次進(jìn)行合理的代碼設(shè)計(jì)。對(duì)于數(shù)據(jù)密集但規(guī)則訪問的一些應(yīng)用,采用片上存儲(chǔ)器模式(SMEM)而不是Cache模式,可以使應(yīng)用開發(fā)者更容易進(jìn)行性能優(yōu)化。
(5)考慮到眾核或GPU的可編程性,對(duì)于一些數(shù)據(jù)密集但不規(guī)則的應(yīng)用,創(chuàng)新存儲(chǔ)層次與Cache設(shè)計(jì),可以提高其適應(yīng)性。Fermi提出的可配置L1Cache/SMEM是一個(gè)偉大的創(chuàng)新,同時(shí)在Kepler架構(gòu)上進(jìn)一步提高了二級(jí)Cache的容量,這些都對(duì)擴(kuò)展GPU的適應(yīng)性、開放性和可編程性十分有益。
[1] NVIDIA Corporation.NVIDIA’s next generation CUDA compute architecture:Fermi[Z].Version 1.1.2009.
[2] NVIDIA Corporation.GeForce GTX 680:The fastest,most efficient GPU ever built[Z].Version 1.0.2012.
[3] NVIDIA Corporation.NVIDIA’s next generation CUDA compute architecture:Kepler GK110—The fastest,most efficient GPU ever built[Z].Version 1.0.2012.
[4] NVIDIA Corporation.NVIDIA CUDA reference manual[Z].Version 3.2Beta.2010.
[5] NVIDIA Corporation.NVIDIA CUDA API reference manual[Z].Version 4.2.2012.
[6] Cai Jing.GPGPU architecture key technology demonstration and simulator research and extension[D].Changsha:National University of Defense Technology,2009.(in Chinese)
[7] Aammodt M,Bakhoda A,F(xiàn)ung W.Tutorial on GPGPU-Sim:A performance simulator for massively multithreaded processor research[C]∥Proc of the 42nd Annual IEEE/ACM International Symposium on Microarchitecture,2009:1.
[8] Che Shuai,Boyer M,Meng Jia-yuan,et al.A benchmark suite for heterogeneous computing[C]∥Proc of IEEE International Symposium on in Workload Characterization,2009:1.
[9] NVIDIA Corporation.NVIDIA CUDA SDK3.1code samples[EB/OL].[2011-05-16].http://docs.nvidia.com/cuda/cuda-samples/index.html.
附中文參考文獻(xiàn):
[6] 蔡晶.GPGPU體系結(jié)構(gòu)關(guān)鍵技術(shù)論證及模擬器研究與擴(kuò)展[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),2009.