李炳超
摘要:GPU內(nèi)部大量線程的同時(shí)運(yùn)行會(huì)生成大量的訪存請(qǐng)求,當(dāng)訪問(wèn)同一L1 Cache組的訪存請(qǐng)求所涉及的空間超過(guò)L1 Cache一組的容量時(shí),由于沒(méi)有Cache行可以分配而導(dǎo)致當(dāng)前訪存請(qǐng)求及后續(xù)所有訪存請(qǐng)求發(fā)生停頓,影響了GPU的性能。該文設(shè)計(jì)了一種訪存請(qǐng)求緩沖隊(duì)列結(jié)構(gòu),訪存請(qǐng)求被發(fā)送到不同的隊(duì)列中,并通過(guò)調(diào)度策略來(lái)選擇不會(huì)發(fā)生停頓的訪存請(qǐng)求訪問(wèn)L1 Cache。實(shí)驗(yàn)表明,該方法能夠有效地減少停頓次數(shù),使得GPU的性能平均提高了26%。
關(guān)鍵詞:圖形處理器;高速緩沖存儲(chǔ)器;線程;訪存請(qǐng)求;單指令多線程
中圖分類號(hào):TP33? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)19-0128-03
1引言
近十多年來(lái),GPU受到越來(lái)越多的應(yīng)用程序的青睞。它不僅可以處理高分辨率的3D圖形應(yīng)用,還能為一些具有數(shù)據(jù)并行特征的應(yīng)用程序加速,如圖算法、天氣預(yù)報(bào)、加密算法、生物信息處理等等。特別是對(duì)于深度神經(jīng)網(wǎng)絡(luò)的迅速發(fā)展,GPU的硬件支撐起到了積極的推動(dòng)作用。
GPU由多個(gè)可執(zhí)行相同程序的流多處理器構(gòu)成,每個(gè)流多處理器內(nèi)部具有數(shù)十個(gè)用于并行計(jì)算的計(jì)算核心。另外,為了減少訪存操作的開銷,GPU還為每個(gè)流多處理器配備了高帶寬、低延遲的L1 Cache。用戶將應(yīng)用程序的任務(wù)以線程為單位進(jìn)行細(xì)分,進(jìn)而將多個(gè)線程組成一個(gè)線程塊。應(yīng)用程序以線程塊為單位被派遣到各個(gè)流多處理器上。每個(gè)流多處理器能夠同時(shí)運(yùn)行上千個(gè)線程,32個(gè)線程會(huì)被硬件組織成一個(gè)線程束。GPU采用單指令多線程的執(zhí)行模式,一個(gè)線程束內(nèi)的線程以并行的方式執(zhí)行同一條指令。另外,為了服務(wù)計(jì)算核心的并行計(jì)算需求,GPU在每個(gè)流多處理器內(nèi)部配備了高帶寬、低延遲的L1 Cache。GPU在執(zhí)行訪存指令時(shí),線程束內(nèi)的每個(gè)線程都能夠生成一個(gè)訪存請(qǐng)求。GPU的讀寫單元對(duì)訪問(wèn)同一數(shù)據(jù)塊(例如128字節(jié))的訪存請(qǐng)求進(jìn)行合并來(lái)減少訪存請(qǐng)求個(gè)數(shù),從而能夠減少訪存指令的處理延遲和存儲(chǔ)系統(tǒng)的擁堵。對(duì)于一些具有不規(guī)則數(shù)據(jù)結(jié)構(gòu)的應(yīng)用程序,線程束生成的訪存請(qǐng)求并不能被讀寫單元全部合并,從而導(dǎo)致一條訪存指令產(chǎn)生多個(gè)訪存請(qǐng)求,線程束需要串行處理各個(gè)訪存請(qǐng)求并且等待所有訪存請(qǐng)求的數(shù)據(jù)準(zhǔn)備就緒才能繼續(xù)執(zhí)行。如果訪存請(qǐng)求在L1 Cache中發(fā)生命中,則直接從L1 Cache中獲取數(shù)據(jù);如果發(fā)生缺失,根據(jù)替換策略,L1 Cache需要為當(dāng)前缺失的訪存請(qǐng)求分配一個(gè)Cache行,并向下一級(jí)存儲(chǔ)器發(fā)送訪存請(qǐng)求來(lái)為該Cache行獲取數(shù)據(jù)。在缺失的數(shù)據(jù)未取回之前,該Cache行處于“預(yù)留”狀態(tài),表示該Cache行已經(jīng)被占用并且不能被替換。
然而,GPU的L1 Cache需要為流多處理器內(nèi)部的所有線程服務(wù),過(guò)多的訪存請(qǐng)求將會(huì)在L1 Cache發(fā)生資源競(jìng)爭(zhēng)[7]。當(dāng)訪存請(qǐng)求所需的資源全部被占用時(shí),所有的訪存請(qǐng)求都不得不發(fā)生停頓,從而影響了GPU的性能。文章對(duì)由L1 Cache資源競(jìng)爭(zhēng)引起停頓進(jìn)行了具體的分析,設(shè)計(jì)了一種處理訪存請(qǐng)求的方法REOD。REOD包含一個(gè)多緩存隊(duì)列結(jié)構(gòu),并結(jié)合相應(yīng)的調(diào)度策略,能夠有效地緩解訪存請(qǐng)求的停頓現(xiàn)象,最終提高GPU的性能。
2訪存請(qǐng)求停頓
由于流多處理器內(nèi)部能同時(shí)運(yùn)行上千個(gè)線程,并且每個(gè)線程束又能夠產(chǎn)生多個(gè)訪存請(qǐng)求,因此流多處理器內(nèi)部會(huì)存在大量的訪存請(qǐng)求對(duì)L1 Cache進(jìn)行訪問(wèn)。頻繁的訪問(wèn)L1 Cache不僅會(huì)造成Cache行局部性的丟失,甚至?xí)斐蒐1 Cache的暫停。圖1描述了造成訪存請(qǐng)求停頓的三種現(xiàn)象:(1)對(duì)于采用組相聯(lián)映射的Cache架構(gòu),訪存請(qǐng)求只能訪問(wèn)其訪存地址所映射的Cache組。由于大量線程的同時(shí)運(yùn)行,并且每個(gè)線程束又能夠產(chǎn)生多個(gè)訪存請(qǐng)求,從而導(dǎo)致訪存請(qǐng)求對(duì)某一Cache組的集中訪問(wèn)。若一個(gè)Cache組的所有Cache行都已經(jīng)處于“預(yù)留(R)”狀態(tài),則意味著當(dāng)前Cache組中沒(méi)有可以被替換的Cache行,表示該Cache組已滿(例如圖1中的Cache組set-0)。若繼續(xù)有訪存請(qǐng)求訪問(wèn)該組并發(fā)生缺失,該訪存請(qǐng)求只能停頓并等待數(shù)據(jù)返回該Cache組才能繼續(xù)被處理。對(duì)于這種停頓現(xiàn)象,文章將其命名為“CSF”;(2)若缺失的訪存請(qǐng)求沒(méi)有發(fā)生CSF,那么缺失信息會(huì)暫存在缺失狀態(tài)保持寄存器MSHR中。MSHR由多個(gè)條目構(gòu)成,每個(gè)條目保存一個(gè)Cache行的塊地址,每個(gè)條目可容納若干訪問(wèn)該Cache行的訪存請(qǐng)求。當(dāng)訪存請(qǐng)求發(fā)生缺失時(shí),若MSHR所有的條目都已經(jīng)被占用或?qū)⒁L問(wèn)的Cache行所容納的訪存請(qǐng)求個(gè)數(shù)已滿,該訪存請(qǐng)求也會(huì)發(fā)生停頓,文章將這種停頓現(xiàn)象命名為“MSHRF”;(3)若MSHR能夠保存缺失信息,則訪存請(qǐng)求會(huì)被發(fā)送到片內(nèi)互聯(lián)網(wǎng)絡(luò)的缺失隊(duì)列中。如果缺失隊(duì)列已滿,則訪存請(qǐng)求依然會(huì)發(fā)生停頓直到缺失隊(duì)列中的一個(gè)訪存請(qǐng)求被片內(nèi)互聯(lián)網(wǎng)絡(luò)發(fā)送出去,文章將這種停頓現(xiàn)象命名為“MQF”。在以上三種情況中,訪存請(qǐng)求發(fā)生停頓之后,后續(xù)訪問(wèn)其他未滿Cache組的訪存請(qǐng)求也必須停頓等待,從而造成訪存指令處理延遲的增加,嚴(yán)重影響GPU的性能。
文章對(duì)一些應(yīng)用程序運(yùn)行過(guò)程中發(fā)生的停頓次數(shù)進(jìn)行了統(tǒng)計(jì)并進(jìn)行了歸一化,如圖2所示。三種停頓現(xiàn)象中,CSF的平均比例為92%,MSHRF的平均比例為1%,MQF的平均比例為7%。因此,訪存請(qǐng)求發(fā)生停頓的主要瓶頸是一個(gè)訪存請(qǐng)求由于所要訪問(wèn)的Cache組沒(méi)有可分配的Cache行而造成所有的訪存請(qǐng)求都發(fā)生停頓。
3 REOD架構(gòu)
3.1多緩存隊(duì)列結(jié)構(gòu)
REOD的主要目標(biāo)是減少CSF次數(shù),使得訪存請(qǐng)求出現(xiàn)CSF時(shí)不會(huì)影響后續(xù)訪存請(qǐng)求的處理。為此,文章在REOD中設(shè)計(jì)了一種新的訪存請(qǐng)求緩存隊(duì)列結(jié)構(gòu),并結(jié)合訪存請(qǐng)求調(diào)度策略,有效地減少訪存請(qǐng)求的停頓現(xiàn)象。如圖3所示,REOD包含若干個(gè)容量較小的隊(duì)列,每個(gè)隊(duì)列可與一個(gè)(或多個(gè))Cache組對(duì)應(yīng)。線程束的訪存請(qǐng)求在訪問(wèn)L1 Cache之前,首先要根據(jù)訪存請(qǐng)求的訪問(wèn)地址計(jì)算其將要訪問(wèn)的Cache組索引,然后根據(jù)Cache組索引通過(guò)隊(duì)列選擇器將訪存請(qǐng)求發(fā)送到相應(yīng)的緩存隊(duì)列中。訪存請(qǐng)求選擇器在每個(gè)周期根據(jù)輪詢調(diào)度器的調(diào)度結(jié)果從所有的緩存隊(duì)列中選取一個(gè)有效的訪存請(qǐng)求發(fā)送到L1 Cache進(jìn)行訪問(wèn)。若新的訪存請(qǐng)求所對(duì)應(yīng)的緩存隊(duì)列已滿,則該訪存請(qǐng)求暫定等待。