中圖分類號:TP183 文獻(xiàn)標(biāo)志碼:A 文章編號:1001-3695(2025)08-026-2446-06
doi:10.19734/j. issn.1001-3695.2024.11.0502
GPU-based parallelization of Winograd convolution algorithm
Wang Xin?,Zhen Xueru (KeyLboratodedrotroghstr(tcto)gUsitui)
Abstract:This paper proposedaninovativeWinogradparalelconvolutionalgorithmbasedonGPU toaddress theproblemof excessivecomputationalloadinmodernconvolutionalneuralnetworks.Thealgorithmusedload-balanced task mapping,optimized thedataloadingstrategyto hidelatency,andcombined thedynamic padding methodtofullexplore thesynergybetwen theWinogradconvolution algorithmandtheGPUarchitecture.Experimentalresultsshowthatonmultipleconvolutionallayers of the classic convolutional l network model ResNet,the proposed algorithm outperforms the standard Winograd convolutionalgorithmintheNVIDIAcuDNN8.3.Olibrary.Itachievesaspeed-upratioofupto2.46ontheTuringarchitecture RTX 2080Ti GPUand maintainshigh computational accuracy.Compared with the standard Winograd convolutionalgorithm based on GPU,the algorithm significantly improves the efficiency of convolutional computation.
Key Words:Winograd algorithm;parallel computing;CUDA;convolutional neural network
0 引言
卷積神經(jīng)網(wǎng)絡(luò)(convolutionalneuralnetwork,CNN)作為深度學(xué)習(xí)(deeplearning,DL)中的核心技術(shù),已經(jīng)在圖像分類[1]和目標(biāo)分割[2]等多個領(lǐng)域得到了廣泛應(yīng)用。CNN的關(guān)鍵優(yōu)勢在于其卷積層能夠自動提取數(shù)據(jù)的局部特征,并通過多層結(jié)構(gòu)逐漸提取出更高層語義信息,其中卷積操作在整個神經(jīng)網(wǎng)絡(luò)的計算過程中約占 90% 的時間[3],因此加速卷積計算對提升深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練與推理效率至關(guān)重要。
為了應(yīng)對CNN中日益龐大的卷積計算需求,越來越多的研究聚焦于各類硬件平臺上優(yōu)化卷積計算,如圖形處理單元(graphicsprocessingunit,GPU)、中央處理單元(centralproces-singunit,CPU)[4]和現(xiàn)場可編程門陣列(fieldprogrammablegatearray,F(xiàn)PGA)[5~9]等,其中,GPU平臺因其強大的并行處理能力,已成為加速卷積計算的主要平臺之一。當(dāng)前主流的卷積算法包括基于GEMM的卷積算法[10]、基于FFT的卷積算法[1]和基于Winograd的卷積算法[12]等,其中,基于Winograd的卷積算法因其能顯著降低乘法操作次數(shù)被廣泛使用,尤其是處理 3×3 卷積核時,Winograd卷積算法展現(xiàn)出更高的計算效率。
目前已有眾多研究著眼于在GPU架構(gòu)上實現(xiàn)Winograd卷積算法。Wei等人[13]針對Winograd非融合卷積的高效實現(xiàn),提出了獨立應(yīng)用程序的分組生產(chǎn)者——消費者鏈以及一系列特定軟件技術(shù),包括提高內(nèi)存訪問效率的專用接口-內(nèi)核數(shù)據(jù)格式、線程束特化和利用shuffle指令等優(yōu)化方法。Jia等人[4]提出了一種基于MegaKernel的Winograd卷積算法的核融合技術(shù),通過靜態(tài)任務(wù)映射算法將任務(wù)分配到GPU線程塊,并構(gòu)建任務(wù)調(diào)度程序以維護(hù)正確的任務(wù)依賴關(guān)系。Yan等人[15]針對單精度 F(2×2,3×3) Winograd卷積算法在NVIDIAVolta和Turing架構(gòu)GPU上的高效實現(xiàn)問題,通過構(gòu)建SASS匯編器TuringAs進(jìn)行匯編級別優(yōu)化,并重新設(shè)計工作負(fù)載分區(qū)和數(shù)據(jù)布局等方法。Liu等人[16]提出在NVIDIAAmpereGPU上利用張量核心來優(yōu)化混合精度 F(6×6,3×3) Winograd卷積,通過設(shè)計特殊的數(shù)據(jù)布局和優(yōu)化各計算步驟來加速卷積。Castro等人[17]針對 3×3 內(nèi)核的應(yīng)用,提出僅用CUDA實現(xiàn)的Open-CNN方法。Guo等人[18]根據(jù)AMDGPU體系架構(gòu)的指標(biāo),提出了最優(yōu)數(shù)據(jù)布局、網(wǎng)格劃分和塊劃分的方法,并利用矩陣核心實現(xiàn)了具有操作融合的流水線算法。Zhang等人[19]針對NHWC格式的 N 維卷積加速問題,提出Im2col-Winograd算法,通過將 N 維卷積分解為一維卷積,利用一維Winograd卷積算法降低卷積計算的空間復(fù)雜性和數(shù)據(jù)訪問的不連續(xù)性。童敢等人[20]針對部分核融合的Winograd卷積,提出利用批量矩陣乘法和張量核心進(jìn)行異步計算。
然而上述研究工作存在一些局限性。一方面,部分研究采用匯編語言編寫關(guān)鍵代碼,開發(fā)人員在特定應(yīng)用場景下很難靈活調(diào)整匯編級別算法的實現(xiàn);另一方面,這些研究利用了與部分GPU架構(gòu)不兼容的特性。此外,在Winograd卷積自身的實現(xiàn)上,由于Winograd算法的計算過程復(fù)雜,如何高效利用GPU的并行計算能力和資源,仍有待進(jìn)一步研究。
針對上述問題,本文提出一種基于GPU的改進(jìn)Winograd并行卷積算法,旨在確保精度的前提下,提高卷積計算效率。具體而言,本研究的貢獻(xiàn)包括以下三個方面:
a)負(fù)載均衡的任務(wù)映射機制。提出一種基于GPU硬件架構(gòu)的負(fù)載均衡任務(wù)映射機制。通過對計算任務(wù)進(jìn)行分塊,并將低效的矩陣計算轉(zhuǎn)換為批量矩陣計算,優(yōu)化了線程塊和網(wǎng)格的劃分,確保每個GPU計算單元的負(fù)載均衡,從而減少計算資源的空閑時間,顯著提高了并行度。
b)分段加載下的延遲隱藏方式。針對GPU內(nèi)存帶寬的瓶頸問題,提出一種分段加載下的延遲隱藏方法。通過利用GPU多層級內(nèi)存系統(tǒng)進(jìn)行數(shù)據(jù)分段加載,并結(jié)合雙緩沖或多緩沖技術(shù),在數(shù)據(jù)加載期間實現(xiàn)計算與數(shù)據(jù)加載的重疊,從而有效減少等待時間,進(jìn)一步提升GPU的計算效率。
c)動態(tài)填充策略。針對Winograd算法中傳統(tǒng)數(shù)據(jù)靜態(tài)填充方法所帶來的內(nèi)存開銷問題,提出一種動態(tài)填充策略。該策略在計算過程中根據(jù)需求進(jìn)行零填充,而非在數(shù)據(jù)初始時進(jìn)行固定填充,從而避免了額外的內(nèi)存開銷,并提高了算法的靈活性和適應(yīng)性。
通過上述優(yōu)化,本文提出的Winograd卷積算法在NVIDIAGPU架構(gòu)上實現(xiàn)了顯著的性能提升。實驗結(jié)果表明,與NVIDIAcuDNN庫中的Winograd卷積算法相比,本文算法在多個典型輸入場景下實現(xiàn)高達(dá)2.46的加速比,同時保持良好的計算精度。
1背景
1.1 NVIDIAGPU架構(gòu)
CPU作為傳統(tǒng)的計算單元,擅長處理復(fù)雜的串行任務(wù),然而由于其計算核心數(shù)量有限,CPU的計算能力和帶寬在處理大規(guī)模并行任務(wù)時成為性能提升的瓶頸。相比之下,GPU具有大量的計算核心和高速的存儲帶寬,能夠在單個時鐘周期內(nèi)處理大量的并行任務(wù),適合卷積操作和大規(guī)模矩陣計算等密集型任務(wù)。
NVIDIA 推出的 CUDA(compute unified device architecture)編程模型為GPU編程提供了一組高效的應(yīng)用程序編程接口(ap-plicationprogramminginterface,API)和庫,使得用戶可以方便地在GPU上實現(xiàn)并行算法,也促使越來越多的研究應(yīng)用于GPU。
本研究使用的平臺基于NVIDIA的GPU硬件架構(gòu),架構(gòu)細(xì)節(jié)如圖1所示。該架構(gòu)由多個流式多處理器(streamingmulti-processor,SM)組成,每個SM包含一系列計算資源和內(nèi)存資源,包括流處理器(streamingprocessor,SP)、載入-存儲單元(load-storeunit,LDST)、特殊功能單元(special function unit,SPU)以及紋理單元(textureunit)等。流處理器是主要的計算單元,用于執(zhí)行整數(shù)和浮點計算,載入-存儲單元負(fù)責(zé)與內(nèi)存的數(shù)據(jù)交互,特殊功能單元則用于處理常見的數(shù)學(xué)函數(shù)。每個SM的資源協(xié)同工作,使得GPU可以同時處理成千上萬的并行線程。
在多級內(nèi)存層次結(jié)構(gòu)上,L2緩存(cache)和高帶寬的動態(tài)隨機訪問內(nèi)存(dynamicrandom-accessmemory,DRAM)由所有的SM共享,距離計算核心更近的內(nèi)存層級(如共享內(nèi)存和寄存器)具備更低的訪問延遲和有限的內(nèi)存容量,適合存放經(jīng)常被訪問的中間計算數(shù)據(jù)。而L2緩存和全局內(nèi)存盡管有更大的容量,但訪問帶寬較低,因此在實際使用時應(yīng)盡量減少全局內(nèi)存的訪問頻率,并優(yōu)先將臨時數(shù)據(jù)加載到共享內(nèi)存和寄存器中。高效利用GPU的多級內(nèi)存層級能夠顯著改善算法的性能。例如,在卷積計算或矩陣乘法等常見的并行計算任務(wù)中,合理利用共享內(nèi)存可以顯著減少從全局內(nèi)存獲取數(shù)據(jù)的次數(shù),降低數(shù)據(jù)傳輸延遲,并提高計算密度。通過合理的內(nèi)存分配和訪問優(yōu)化,可以進(jìn)一步釋放GPU的計算潛能,實現(xiàn)較高的計算吞吐量。
圖1NVIDIAGPU架構(gòu) Fig.1NVIDIA GPU architecture
1.2Winograd卷積算法
Winograd算法最初由Winograd提出,旨在減少有限脈沖響應(yīng)(finite impulse response,F(xiàn)IR)濾波器的計算量。2016 年,Lavin等人首次將Winograd最小濾波算法應(yīng)用于卷積加速中,相比直接卷積,基于最小過濾算法的Winograd卷積算法顯著降低了卷積神經(jīng)網(wǎng)絡(luò)層的算術(shù)復(fù)雜度。
為了更好地說明,將二維Winograd卷積表示為 F(m×m r×r) ,其中 m×m 為輸出數(shù)據(jù)塊 o 的大小, r×r 為卷積核 的大小,輸入數(shù)據(jù)塊 d 的大小為 (m+r-1)×(m+r-1) 。在Winograd卷積計算時,相鄰塊之間會有 r-1 個元素重疊,每個通道生成
個塊,其中 H 為圖像的高度, W 為圖像寬度,每個通道的結(jié)果相加得到最終的結(jié)果,二維Winograd卷積塊的計算方法如式(1)所示。
其中: ? 表示逐元素乘積, 和 BT 是變換矩陣。這些變換矩陣對于給定的 ?m 和 r 并不是唯一的。以 F(2×2,3×3) 為例 ,AT,G 和 BT 分別可以表示為
根據(jù)二維Winograd卷積塊的計算式(1),Winograd卷積運算描述為以下四個步驟:
a)卷積核變換(filter transformation,F(xiàn)Trans): U=GgGT (20號b)輸入變換(input transformation,ITrans): V=BdBT 0c)元素級乘法(element-wise matrix multiplication,EWMM) :M=U?V d)輸出變換(output transformation,OTrans): Y=ATMA 。
相比直接卷積算法需要 m×m×r×r 次乘法運算,二維Winograd卷積算法所需乘法次數(shù)為 (m+r-1)×(m+r-1) 。例如, F(6×6,3×3) 需要 (6+3-1)×(6+3-1)=64 次乘法,而直接卷積需要 6×6×3×3=324 次乘法,使用Winograd卷積算法相比用直接卷積計算的算法復(fù)雜度降低了 80.25% :同樣地, F(4×4,3×3) 和 F(2×2,3×3) 的算術(shù)復(fù)雜度分別降低了 75% 和 55.56% 。較大的矩陣形狀相比于較小的矩陣形狀減少了更多的逐元素乘法次數(shù),能帶來更顯著的算法復(fù)雜度降低,但較大的矩陣形狀也會帶來更多的精度損失。本文將討論限制在 F(2×2,3×3) 的Winograd卷積計算,這是實踐中常見的情況。
1.3 內(nèi)核融合
傳統(tǒng)Winograd卷積算法的GPU實現(xiàn)是在每一個GPU內(nèi)核(kernel)中運行每個階段,如圖2(a)所示,Winograd卷積由四個階段組成,所以整個卷積由四個內(nèi)核實現(xiàn),這種實現(xiàn)被稱為非融合方法。由于不同的計算階段具有不同的算術(shù)強度,并且它們共享中間數(shù)據(jù),所以內(nèi)核融合提供進(jìn)一步加速的機會。根據(jù)這四個內(nèi)核的融合程度,在GPU上的融合實現(xiàn)可以劃分成融合和部分融合兩種方法。如圖2(b)和(c)所示,融合方法是在一個內(nèi)核中實現(xiàn)四個步驟的計算,而部分融合方法將濾波器轉(zhuǎn)換劃分為一個獨立的內(nèi)核進(jìn)行計算。
圖2非融合、融合和部分融合
在非融合方法中,中間數(shù)據(jù)在GPU的片外內(nèi)存(全局內(nèi)存)和片上內(nèi)存(共享內(nèi)存和寄存器)中來回傳輸。例如,輸入數(shù)據(jù)在kernel2中完成數(shù)據(jù)轉(zhuǎn)換后需要存儲到全局內(nèi)存,隨后在kernel3中再次從全局內(nèi)存加載,作為EWMM階段的輸入,這種頻繁的內(nèi)存訪問顯著增加了延遲。相較之下,融合方法可以減少一些不必要的數(shù)據(jù)移動,并充分利用片上共享內(nèi)存實現(xiàn)中間數(shù)據(jù)的高效重用。在融合方法中,每個塊的中間數(shù)據(jù)存儲在對應(yīng)線程塊的共享內(nèi)存中,然而當(dāng)中間數(shù)據(jù)規(guī)模太大超出共享內(nèi)存容量時,必須在全局內(nèi)存中重新計算或者存儲這些數(shù)據(jù),這會導(dǎo)致顯著的性能下降。部分融合方法在保留融合方法優(yōu)點的同時,有效地利用了片上內(nèi)存和全局內(nèi)存,從而克服了共享內(nèi)存容量的限制。
本文采用部分融合方法,使用兩個獨立的內(nèi)核來進(jìn)行卷積核轉(zhuǎn)換和其他步驟的計算,不同的內(nèi)核根據(jù)其數(shù)據(jù)負(fù)載采用不同的數(shù)據(jù)映射。
2 優(yōu)化策略及實現(xiàn)
2.1負(fù)載均衡
GPU擅長處理高并行度和高計算強度的任務(wù),然而EWMM的計算強度較低,無法掩蓋內(nèi)存訪問的延時,會極大影響GPU的運行效率。通過數(shù)據(jù)重排的方式將EWMM轉(zhuǎn)換成批量矩陣乘法(batchgeneralmatrixmultiplication,BGEMM),可以在GPU上有效執(zhí)行。如圖3所示,輸人數(shù)據(jù)和卷積核數(shù)據(jù)分別進(jìn)行轉(zhuǎn)換和數(shù)據(jù)重排,將沿 c 維度規(guī)約計算的EWMM轉(zhuǎn)換成BGEMM;然后進(jìn)行輸出數(shù)據(jù)重排,再進(jìn)行輸出轉(zhuǎn)換,最后將結(jié)果寫回到目標(biāo)地址中。
為了實現(xiàn)計算的并行性和局部性,需要將整個任務(wù)劃分成多個塊(block),每個塊作為獨立的子任務(wù)執(zhí)行,并且應(yīng)避免塊之間的數(shù)據(jù)依賴。塊的大小不僅應(yīng)有利于內(nèi)存訪問,還應(yīng)避免突破硬件的限制。唯一的數(shù)據(jù)依賴部分是通道方向上每個卷積核的累積,這部分可以用單個塊處理。每個網(wǎng)格(grid)組織為 (N/BN)×ntiles×(K/BK) 個塊,其中 BN 和 BK 分別代表在N 方向和 K 方向上的處理范圍, ntiles 表示二維輸人數(shù)據(jù)分成大小為 α×α 的塊個數(shù),相鄰塊之間重疊為 r-1,ntiles 的計算公式如式(3)所示。
ntiles=(ΓH/m?)×(ΓW/m?)
圖3基于BGEMM的Winograd卷積 Fig.3Winograd convolution based on BGEMM
由于每個塊需要處理通道方向上的數(shù)據(jù)和卷積核,但實際情況中很難確保所有需要的數(shù)據(jù)可以一次性加載和計算,所以將通道劃分成大小為 BC 的段,每個塊組織為 BN×BC 個線程(thread)。每個塊每次處理 BK×BC 個卷積核塊和 BN×BC 個數(shù)據(jù)塊,每次迭代計算一個小塊,并將結(jié)果累積到寄存器中,直到沿所有通道完成迭代,最終結(jié)果被寫回共享內(nèi)存(sharedmemory,SMEM)中。任務(wù)映射方法如圖4所示。
圖4負(fù)載均衡的任務(wù)映射方式
Fig.4Task mapping for load balancing
由于每個線程塊的SMEM有限, BN,BK 和 BC 的設(shè)置應(yīng)該在最大化SMEM占用率的同時又不超過其內(nèi)存容量的上限。NVIDIARTX2080Ti的共享內(nèi)存為 64KB ,當(dāng)數(shù)據(jù)為單精度(float)類型,使用 F(2×2,3×3) 的Winograd卷積計算時, BN, BK 和 BC 的設(shè)置應(yīng)滿足
2.2分段加載下的延遲隱藏
在實現(xiàn)GPU上的Winograd卷積計算時,直接從全局內(nèi)存頻繁訪問數(shù)據(jù)會導(dǎo)致顯著的訪問延遲,此外單個線程在執(zhí)行矩陣乘法運算時的計算密度較低,無法隱藏數(shù)據(jù)加載的延遲,導(dǎo)致GPU的效率較低。為了解決上述問題,本文提出了基于分段加載的延遲隱藏方法,以利用GPU的不同內(nèi)存層級來實現(xiàn)高效的延遲隱藏。
首先將輸入數(shù)據(jù)塊和卷積核數(shù)據(jù)塊從全局內(nèi)存分段預(yù)取到線程塊的共享內(nèi)存中,這種分段加載的實現(xiàn)充分考慮到了共享內(nèi)存資源的限制。在本文實驗平臺NVIDIARTX2080Ti的SM上,每個線程塊的共享內(nèi)存最大為 64KB ,無法一次性容納全部的輸入數(shù)據(jù)和卷積核數(shù)據(jù),因此每次僅加載一部分?jǐn)?shù)據(jù)用于計算,確保計算過程中共享內(nèi)存不被占滿。這種分段加載的方式不僅降低了訪問全局內(nèi)存的開銷,也減少了由于一次性加載過多數(shù)據(jù)而造成的存儲資源浪費。
在分段加載的數(shù)據(jù)被存儲在共享內(nèi)存中后,共享內(nèi)存中的數(shù)據(jù)再次被分段傳輸?shù)郊拇嫫骶彌_區(qū)進(jìn)行計算,以便在計算時盡量減少訪問延遲。在矩陣計算的時間能夠覆蓋單次數(shù)據(jù)加載時間的情況下,每個線程使用兩個寄存器緩沖區(qū)(buffer1和buffer2)交替進(jìn)行數(shù)據(jù)加載和矩陣計算的并行化操作,以減少線程等待數(shù)據(jù)加載的時間。如圖5所示,當(dāng)寄存器緩沖區(qū)buffer1正在加載下一階段的數(shù)據(jù)時,寄存器緩沖區(qū)buffer2已經(jīng)完成數(shù)據(jù)加載并可以執(zhí)行矩陣乘法計算。
圖5分段加載的延遲隱藏 Fig.5Delayed hiding of segmented loading
在某些情況下,矩陣計算的時間無法覆蓋單次數(shù)據(jù)加載時間,會出現(xiàn)計算操作等待數(shù)據(jù)加載的問題,導(dǎo)致SM處于空閑狀態(tài),利用率較低。為了進(jìn)一步優(yōu)化這種情況,可以引入更多的寄存器緩沖區(qū)來進(jìn)一步隱藏數(shù)據(jù)加載的延遲,多個緩沖區(qū)的數(shù)據(jù)加載可以在數(shù)據(jù)預(yù)取時完成,從而避免計算操作等待數(shù)據(jù)加載的情況。當(dāng)引入三個及以上的寄存器緩沖區(qū)時,整個計算流程可以分為多個階段(stage)。在每個階段,每一步的數(shù)據(jù)加載都與兩步的矩陣乘法計算并行,進(jìn)一步隱藏了數(shù)據(jù)加載的延遲。
2.3 動態(tài)填充
在卷積神經(jīng)網(wǎng)絡(luò)的計算中,填充操作是確保輸出數(shù)據(jù)尺寸符合預(yù)期的關(guān)鍵步驟,尤其在輸人維度無法被卷積塊大小整除時,填充用于保證卷積塊劃分的完整性。傳統(tǒng)的靜態(tài)填充方法通過對輸人數(shù)據(jù)進(jìn)行預(yù)處理,顯式地將原始數(shù)據(jù)與填充數(shù)據(jù)重新排列。然而這種方式需要大量的計算資源和內(nèi)存空間,并引入獨立的內(nèi)核進(jìn)行操作,進(jìn)而導(dǎo)致整體計算效率下降。為解決這些問題,本文引人了動態(tài)填充策略,通過讓每個線程獨立處理其負(fù)責(zé)的塊內(nèi)填充操作,避免了靜態(tài)填充帶來的額外開銷。
首先使用一個16位的標(biāo)志位(mask)來記錄塊中每個元素是否參與全局內(nèi)存數(shù)據(jù)加載。若某元素參與計算,則相應(yīng)的mask位設(shè)為1,反之則設(shè)為0。通過在卷積操作的邊界處進(jìn)行動態(tài)判斷,動態(tài)填充確保僅加載有效數(shù)據(jù),并對無效位置自動填充為0。這種機制不僅顯著減少了內(nèi)存訪問開銷,還有效優(yōu)化了邊界處理,尤其在輸人數(shù)據(jù)尺寸不能整除卷積塊大小的場景中表現(xiàn)尤為突出。
雖然該策略增加了核函數(shù)中的分支條件,但在同一線程塊中,所有線程通常面臨相同的邊界情況。也就是說,在同一次執(zhí)行中,所有線程束(warp)中的線程都遵循相同的分支路徑,從而實現(xiàn)了最佳的執(zhí)行效率。
2.4基于GPU的并行化實現(xiàn)
綜合上述優(yōu)化策略,對于NCHW數(shù)據(jù)格式的輸入數(shù)據(jù)和KCRS數(shù)據(jù)格式的卷積核數(shù)據(jù),啟動卷積核變換內(nèi)核FX,設(shè)置網(wǎng)格維度為 dim3(K/BK,C/BC) ,線程塊維度為 dim3 ( BN BC)。使用Winograd卷積的并行化計算主要流程如下:
a)啟動Winograd主變換內(nèi)核Winograd_kernel。根據(jù)負(fù)載均衡策略,將輸入數(shù)據(jù)映射到 (N/BN)×ntiles×(K/BK) 個線程塊內(nèi),每個線程塊內(nèi)的 BN×BC 個線程并行計算。內(nèi)核Winograd_kernel的具體步驟如圖6所示,當(dāng)使用 F(2×2,3× 3)的Winograd卷積計算時,每個線程塊分配大小為 16×BC× 0 BN+BK)×sizeof (float)的共享內(nèi)存。
b)從全局內(nèi)存中預(yù)取輸入數(shù)據(jù)塊和卷積核數(shù)據(jù)塊,分別加載到共享內(nèi)存img_tile和filter_tile。主循環(huán)按照輸入通道 c 進(jìn)行迭代,每次迭代處理 BC 個通道的數(shù)據(jù)。
c)在主循環(huán)內(nèi)部,首先加載并變換一個輸入數(shù)據(jù)塊到共享內(nèi)存input_smem,同時加載兩個卷積核變換塊到共享內(nèi)存filter_smem。當(dāng)線程塊內(nèi)所有線程執(zhí)行完畢后,再分段預(yù)取輸人數(shù)據(jù)和卷積核數(shù)據(jù)到寄存器緩沖區(qū)中,然后 BC 個warp循環(huán)執(zhí)行寄存器緩沖區(qū)預(yù)取和乘法計算。
d)當(dāng)所有輸入通道迭代處理完畢后,將輸出結(jié)果從寄存器加載到共享內(nèi)存中,并進(jìn)行輸出結(jié)果變換和存儲回全局內(nèi)存。
圖6主變換內(nèi)核的計算流程
Fig.6Workflowofmain transformkernel
3實驗結(jié)果與分析
3.1 實驗環(huán)境
為了測試算法的精度和加速效果,使用 ResNet 中包含 3× 3卷積核的卷積層作為測試樣例,其卷積層的參數(shù)如表1所示。
表1ResNet卷積計算相關(guān)參數(shù)
Tab.1Parameters related to ResNet convolutional computation
實驗的硬件環(huán)境為NVIDIARTX2080TiGPU,軟件環(huán)境為cuDNN v8.3.0 和NVCC編譯器,使用cuRand庫中的隨機數(shù)生成器生成0~1的符合均值分布的單精度數(shù),數(shù)據(jù)格式為NCHW,并使用CUDA事件進(jìn)行時間測量。
3.2 算法精度分析
為了驗證結(jié)果的準(zhǔn)確性,本文采用cuDNN庫中的融合Winograd卷積結(jié)果作為標(biāo)準(zhǔn),計算本文實現(xiàn)與其之間的最大絕對誤差。如表2所示,批次大小與不同層的組合被命名為ConvmNn, ?n 代表批次大小, m 是層號,16個測試樣例產(chǎn)生的最大絕對誤差為4.88E-04,充分證明了結(jié)果具有可靠性。
表2精度誤差
Tab.2 Precision error
3.3 性能分析
為了全面評估本研究提出的算法性能,本文將其與cuDNN庫中四種經(jīng)典卷積算法———Winograd、FFT、GEMM和Non-FusedWinograd進(jìn)行了性能對比分析。鑒于各類算法在算術(shù)復(fù)雜度上存在差異,本文采用了兩種不同的評價指標(biāo):對于FFT、GEMM和Non-FusedWinograd卷積算法,性能比較基于式(5)表示的加速比,而對于Winograd卷積算法,還可以依據(jù)式(6)表示的每秒執(zhí)行的千萬億次浮點數(shù)(TeraFLOPS,TFLOPS)進(jìn)行衡量。不同卷積算法的運行時間為100次測量的平均值,單位為s。
圖7展示了本文方法與cuDNN庫的標(biāo)準(zhǔn)Winograd卷積在ResNet卷積層上的有效TFLOPS。每個子圖的 x 軸表示不同批處理大小的卷積層, ??y 軸表示有效的TFLOPS。結(jié)果表明,本文方法在 ResNet 模型的每個卷積層上的性能均優(yōu)于cuDNN,特別是Conv5層的整體加速比顯著高于其他層,最高加速比達(dá)到2.46。這一現(xiàn)象的原因在于Conv5卷積層具有最多的卷積核,即參數(shù)值最大,隨著卷積核參數(shù) K 的增加,輸人數(shù)據(jù)的過度獲取成為性能瓶頸。本文方法采用了負(fù)載均衡的任務(wù)映射策略,根據(jù)GPU架構(gòu)的特點,在共享內(nèi)存允許的條件下使用更大的塊 BK=64 )。較大的 BK 設(shè)置不僅能有效減少輸入數(shù)據(jù)的過度獲取,還降低了全局內(nèi)存的訪問次數(shù),同時每次計算能夠處理更多的數(shù)據(jù),從而在訪存和計算之間實現(xiàn)了更好的平衡,提高了整體性能。
從圖7中還可以觀察到,在Conv2到Conv5的輸入下,隨著通道數(shù)量增大而輸入數(shù)據(jù)尺寸變小,Conv5層的性能提升相對較大,這一現(xiàn)象的原因在于,隨著參數(shù) c 的增加,計算量相應(yīng)增加,從而能夠更高效地隱藏計算開銷。
圖8展示了本文方法與cuDNNWinograd算法在不同輸人通道配置下的性能對比。在此組實驗中,通道大小與不同層的組合被命名為ConvmCc,其中 代表通道大小, m 為卷積層號,16個測試樣例均采用批量大小為32。實驗結(jié)果表明,在Conv2至Conv5層的輸人下,相較于cuDNNWinograd算法,本文方法在眾多測試樣例中展現(xiàn)出了更好的性能,并且加速比隨著通道數(shù)量的增加呈現(xiàn)上升趨勢。
圖7與標(biāo)準(zhǔn)庫中Winograd算法性能比較
Fig.7Performance comparison with Winograd algorithm in standard library
此外,圖9展示了本文方法與cuDNN庫中其他幾種代表性卷積算法的性能對比。與基于GEMM的卷積算法相比,本文方法達(dá)到了1.59~7.10(平均3.74)的加速比。在Conv5卷積層,由于該層的輸入較小,Winograd算法會產(chǎn)生無效的中間值并丟棄,導(dǎo)致額外的計算和冗余數(shù)據(jù)移動,從而增加了整體開銷,降低了相對于基于GEMM的卷積算法的加速比。
與基于FFT的卷積算法相比,本文方法實現(xiàn)了 0.79~ 3.70(平均1.75)的加速比,表明在大多數(shù)卷積層,本文方法都能表現(xiàn)出更優(yōu)的性能。相比之下,基于非融合Winograd的卷積算法,本文加速比為 0.60~1.29 (平均0.90),這表明在Conv5層,本文方法性能稍遜于基于非融合Winograd的卷積算法。原因在于非融合Winograd算法采用了 F(2×2,3×3) 算法單元,這在一定程度上減少了乘法操作的數(shù)量,因此在計算量較小的情況下,這種優(yōu)化的影響更為顯著。
為了驗證算法的先進(jìn)性,將本文算法與文獻(xiàn)[19]提出的Im2col-Winograd卷積算法進(jìn)行了實驗對比。限于實驗篇幅,本文選取十組典型數(shù)據(jù)以確保算法普適性,卷積層參數(shù)如表3所示,其中輸出層參數(shù) K=N ,以cuDNN標(biāo)準(zhǔn)庫中的Winograd和Implict_Precomp_GEMM作為性能基準(zhǔn),在精度誤差均符合要求的前提下,與文獻(xiàn)[19]相比,本文的優(yōu)化算法始終具有較高的性能加速比。原因在于本文充分考慮了GPU硬件設(shè)備的并行計算能力,通過合理設(shè)計網(wǎng)格和線程塊的配置,使得計算負(fù)載更加均衡,從而提高了GPU的利用率。
表3與文獻(xiàn)[19]的加速比對比
Tab.3Comparison with the acceleration ratio in reference[19
4結(jié)束語
針對現(xiàn)代卷積神經(jīng)網(wǎng)絡(luò)中的大規(guī)模卷積計算挑戰(zhàn),本文提出了一種新的基于GPU的Winograd并行卷積算法,設(shè)計包括負(fù)載均衡的任務(wù)映射、分段加載下的延遲隱藏策略以及動態(tài)填充方法。這些策略融合了Winograd卷積算法與GPU架構(gòu)的特點,顯著提升了卷積運算的效率。通過在經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)模型ResNet中的幾個卷積層上進(jìn)行實驗,本文方法在TuringRTX2080Ti上相較于cuDNN庫中的Winograd卷積算法實現(xiàn)了高達(dá)2.46的加速比。此外本文實現(xiàn)完全采用高級編程語言CUDA C+β+β 編寫,易于調(diào)試、移植和擴展。
未來的研究工作可以進(jìn)一步探索結(jié)合Turing架構(gòu)中的張量核心來優(yōu)化卷積算法,以期實現(xiàn)更大幅度的性能提升。
參考文獻(xiàn):
[1]LeeH,KwonH.Going deeper with contextual CNN for hyperspectral imageclassification [J].IEEE Trans on Image Processing, 2017,26(10):4843-4855.
[2]Bao Linchao,Wu Baoyuan,Liu Wei.CNN in MRF:video object segmentation via inference ina CNN-based higher-order spatio-temporal MRF[C]//Proc ofIEEE/CVFConferenceonComputerVisionand Pattern Recognition.Piscataway,NJ:IEEE Press,2O18:5977- 5986.
[3]Chang Mengzhou,Pan Zegang,Chen Junliang.Hardware accelerator forboosting convolution computation inimage classification applications[C]//Proc of the6th IEEE Global Conference on Consumer Electronics.Piscataway,NJ:IEEEPress,2O17:1-2.
[4]Chen Xiaofeng,Chen Zhiguang,Lu Yutong,et al.A fine-grained optimizationto Winograd convolution based onmicro-architectural featuresofCPU[C]//Proc of IEEE International Conferenceon Parallelamp;Distributed Processing with Applications,Big Dataamp; Cloud Computing,Sustainable Computingamp; Communications,Social Computingamp; Networking.Piscataway,NJ:IEEEPress,2O21:1199- 1208.
[5]Kala S,Jose BR,MathewJ,et al.High-performance CNN acceleratoronFPGAusingunifiedWinograd-GEMMarchitecture[J].IEEE Trans on Very Large Scale Integration Systems,2019,27 (12):2816-2828.
[6]李斌,齊延榮,周清雷.基于Winograd 算法的目標(biāo)檢測加速器設(shè) 計與優(yōu)化[J].電子學(xué)報,2022,50(10):2387-2397.(Li Bin, QiYanrong,Zhou Qinglei.Design and optimization of a target detection accelerator based on the Winograd algorithm[J].Journal of Electronics,2022,50(10):2387-2397.)
[7]Yang Chen,Meng Yishuo,Xi Jiawei,et al. WRA-SS:a highperformance accelerator integrating Winograd with structured sparsity for convolutional neural networks[J].IEEE Trans on Very Large Scale Integration Systems,2024,32(1) :164-177.
[8]Yang Chen, Yang Yaoyao,Meng Yishuo,et al. Flexible and efficient convolutional acceleration on unified hardware using the two-stage splitting methodand layer-adaptive alocation of1-D/2-D Winograd units[J]. IEEE Trans on Computer-Aided Design of Integrated Circuits and Systems,2024,43(3):919-932.
[9]Zhang Zhixin,Li Zhiheng,Chen He.A cache structure and corresponding data access method for Winograd algorithm[C]// Proc of IET International Radar Conference.[S.1.]: IET Press,2O20:634- 639.
[10]Cho M,Brand D.MEC:memory-efficient convolution for deep neural network[C]//Proc of the 34th International Conference on Machine Learning.Cambridge,MA:JMLR Press,2017:815-824.
[11]Sunny S P,Das S.Efficient FFT-based CNN acceleration with intrapatch parallelization and flex-stationary dataflow[C]//Proc of IEEE International Symposium on Circuits and Systems. Piscataway,NJ: IEEE Press,2024:1-5.
[12]Lavin A,Gray S.Fast algorithms for convolutional neural networks [C]//Proc of IEEE Conference on Computer Vision and Pattern Recognition.Piscataway,NJ: IEEE Press,2016:4013-4021.
[13]Wei Hui,Liu Enjie,Zhao Youbing,etal.Eficient non-fused Winograd on GPUs [C]// Proc of Computer Graphics International Conference.Cham:Springer,2020:411-418.
[14]Jia Liancheng,Liang Yun,Li Xiuhong,et al.Enabling efficentfast convolution algorithms on GPUs via MegaKernels[J]. IEEE Trans on Computers,2020,69:986-997.
[15]Yan Da,Wang Wei,Chu Xiaowen. Optimizing batched Winograd convolution on GPUs[C]//Proc of the 25th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming.New York : ACM Press,2020:32-44.
[16]Liu Junhong, Yang Dongxu,Lai Junjie. Optimizing Winograd-based convolution with tensor cores[C]//Proc of the 5Oth International Conference on Parallel Processing.New York:ACM Press,2021:1- 10.
[17]Castro R L,Andrade D,F(xiàn)raguela B B. OpenCNN: a Winograd minimal filtering algorithm implementation in CUDA[J].Mathematics, 2021,9(17) : 1-19.
[18]Guo Yijie,Lu Lu,Zhu Songxiang.Novel accelerated methods for convolution neural network with matrix core[J].The Journal of Supercomputing,2023,79(17):19547-19573.
[19]Zhang Zhiyi, Zhang Pengfei,Xu Zhuopin,et al.Im2col-Winograd: an efficient and flexible fused-Winograd convolution for NHWC format onGPUs[C]//Proc of the53rd International Conference onParallel Processing.New York:ACM Press,2024:1072-1081.
[20]童敢,黃立波,呂雅帥.面向現(xiàn)代GPU的Winograd 卷積加速研 究[J].電子學(xué)報,2024,52(1):244-257.(Tong Gan,Huang Libo,Lyu Yashuai. Winograd convolution acceleration research for modem GPUs[J].Journal of Electronics,2024,52(1):244- 257.)