本發(fā)明涉及gpu微體系結(jié)構(gòu)、編譯器代碼生成技術(shù)領(lǐng)域,特別涉及一種gpuffma指令(浮點乘加指令)在雙發(fā)射模式下的通量測試方法。
背景技術(shù):
微體系結(jié)構(gòu)的特征和參數(shù)是所有架構(gòu)相關(guān)優(yōu)化的重要參照和依據(jù),然而,許多對性能有重要影響的架構(gòu)特征和參數(shù)都沒有被公開。為此,本發(fā)明用gpu(graphicsprocessingunit)匯編語言設(shè)計了微基準(zhǔn)測試程序(micro-benchmarks),用以探測和揭露這些架構(gòu)特征和參數(shù)。特別地,在矩陣乘算法優(yōu)化過程中,本發(fā)明重點關(guān)注的架構(gòu)特征和參數(shù)包括:指令的寫后讀依賴延遲、指令的軟件調(diào)度控制碼、寄存器bank分布、不同位寬訪存指令的帶寬。本發(fā)明描述了針對這些架構(gòu)特征和參數(shù)的微基準(zhǔn)測試程序的設(shè)計要點,給出了設(shè)計范例,并展示了gk110架構(gòu)上的探測成果。wong[henrywong,misel-myrtopapadopoulou,maryamsadooghi-alvandi,andandreasmoshovos.demystifyinggpumicroarchitecturethroughmicrobenchmarking.inperformanceanalysisofsystems&software(ispass),2010ieeeinternationalsymposiumon,pages235–246.ieee,2010.]在gt200上做了詳盡的基準(zhǔn)測試程序,包括指令的延遲、icache(指令高速緩沖存儲器)大小、分支影響、同步的影響、cache(存儲器)層次和tlb(translationlookasidebuffer)層次等。zhang[xinxinmei,kaiyongzhao,chengjianliu,andxiaowenchu.benchmarkingthememoryhierarchyofmoderngpus.innetworkandparallelcomputing,pages144–156.springer,2014.]通過設(shè)計共享內(nèi)存帶寬、全局訪存帶寬和指令通量的微基準(zhǔn)測試程序,對流水線受限、共享內(nèi)存受限和全局內(nèi)存帶寬受限的三個應(yīng)用進(jìn)行量化分析,其中指令的通量定義為單位時間內(nèi)的可以完成的指令的個數(shù)。mei[zhang,yao,andjohnd.owens."aquantitativeperformanceanalysismodelforgpuarchitectures."in2011ieee17thinternationalsymposiumonhighperformancecomputerarchitecture,pp.382-393.ieee,2011.]對fermi、kepler和maxwell的架構(gòu)的內(nèi)存層次進(jìn)行探測,包括cache、共享內(nèi)存和全局內(nèi)存。但是mei沒有考慮向量化的全局訪存和共享訪存指令,而且代碼內(nèi)部指令過少,測出的值和理論峰值差別甚遠(yuǎn)。tan[4]測試了不同向量的訪存指令的延遲。demmel[vasilyvolkovandjameswdemmel.benchmarkinggpustotunedenselinearalgebra.inhighperformancecomputing,networking,storageandanalysis,2008.sc2008.internationalconferencefor,pages1–11.ieee,2008.]測試了kernellaunch的開銷,以及流水線的開銷,但是他的代碼是基于cuda,測試精度不如匯編基準(zhǔn)測試程序高。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是解決現(xiàn)有g(shù)pu體系結(jié)構(gòu)封閉,很多參數(shù)沒有公布的情況,給出精確探測gpu參數(shù)的微基準(zhǔn)測試方法。
具體來說本發(fā)明提供了一種gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該測試方法包括指令延遲/通量測試步驟、寄存器bank測試步驟、控制碼含義測試步驟和ffma雙發(fā)射通量測試步驟,其中:
指令延遲/通量測試步驟,負(fù)責(zé)對gpu指令的延遲和通量進(jìn)行測試,獲得該gpu指令的延遲周期和gpu指令通量,且該gpu指令的延遲周期和gpu指令通量的測試方法將會被控制碼含義測試步驟使用;
寄存器bank測試步驟,根據(jù)判斷寄存器間是否存在bank沖突,選取無bank沖突的寄存器操作數(shù),ffma雙發(fā)射通量測試步驟將會用到本步驟得出的bank分布結(jié)果;
控制碼含義測試步驟,通過該gpu指令的延遲周期和gpu指令通量,分析測試該gpu指令中控制碼的含義,并根據(jù)該控制碼的含義,控制開啟對應(yīng)的發(fā)射模式和gpu的線程調(diào)度,若開啟的發(fā)射模式為雙發(fā)射模式,則進(jìn)行該ffma雙發(fā)射通量測試步驟;
ffma雙發(fā)射通量測試步驟,根據(jù)該雙發(fā)射模式和該寄存器操作數(shù)計算測試gpu浮點乘加指令在雙發(fā)射模式下的通量。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該指令延遲/通量測試步驟還包括,對每個寄存器bank設(shè)置索引,以及設(shè)置不同的控制碼。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該指令延遲/通量測試步驟,通過測量預(yù)先設(shè)定的一段時間內(nèi)gpu完成的指令個數(shù),以測得該gpu指令通量;隨機(jī)選取一寄存器,并統(tǒng)計向該寄存器寫入數(shù)據(jù)的指令與讀取該寄存器中數(shù)據(jù)的指令兩者之間的時鐘周期數(shù),將該時鐘周期數(shù)作為該gpu指令的延遲周期。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該寄存器bank測試步驟,判斷寄存器間是否存在bank沖突,具體為:測試任意兩組寄存器組合下的浮點乘法的實際通量,該實際通量若達(dá)到理論通量值的99.5%以上,則判斷為兩寄存器間沒有沖突,若該實際通量小于等于理論通量值的99.5%,則判斷為兩寄存器間具有沖突。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該控制碼含義測試步驟根據(jù)該延遲周期判斷該控制碼含義,若該延遲周期等于0,則該控制碼含義為開啟雙發(fā)射,若該延遲周期大于0,則該控制碼含義為開啟延遲發(fā)射。
本發(fā)明還提供了一種gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該測試系統(tǒng)包括指令延遲/通量測試模塊、寄存器bank測試模塊、控制碼含義測試模塊和ffma雙發(fā)射通量測試模塊,其中:
指令延遲/通量測試模塊,負(fù)責(zé)對gpu指令的延遲和通量進(jìn)行測試,獲得該gpu指令的延遲周期和gpu指令通量,并將該gpu指令的延遲周期和gpu指令通量發(fā)送給該控制碼含義測試模塊;
寄存器bank測試模塊,根據(jù)判斷寄存器間是否存在bank沖突,選取無bank沖突的寄存器操作數(shù),并將該寄存器操作數(shù)發(fā)送給該ffma雙發(fā)射通量測試模塊;
控制碼含義測試模塊,通過該gpu指令的延遲周期和gpu指令通量,分析測試該gpu指令中控制碼的含義,并根據(jù)該控制碼的含義,控制開啟對應(yīng)的發(fā)射模式和gpu的線程調(diào)度,若開啟的發(fā)射模式為雙發(fā)射模式,則運(yùn)行該ffma雙發(fā)射通量測試模塊;
ffma雙發(fā)射通量測試模塊,根據(jù)該雙發(fā)射模式和該寄存器操作數(shù)計算測試gpu浮點乘加指令在雙發(fā)射模式下的通量。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該指令延遲/通量測試模塊還包括,對每個寄存器bank設(shè)置索引,以及設(shè)置不同的控制碼。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該指令延遲/通量測試模塊,通過測量預(yù)先設(shè)定的一段時間內(nèi)gpu完成的指令個數(shù),以測得該gpu指令通量;隨機(jī)選取一寄存器,并統(tǒng)計向該寄存器寫入數(shù)據(jù)的指令與讀取該寄存器中數(shù)據(jù)的指令兩者之間的時鐘周期數(shù),將該時鐘周期數(shù)作為該gpu指令的延遲周期。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該寄存器bank測試模塊,判斷寄存器間是否存在bank沖突,具體為:測試任意兩組寄存器組合下的浮點乘法的實際通量,該實際通量若達(dá)到理論通量值的99.5%以上,則判斷為兩寄存器間沒有沖突,若該實際通量小于等于理論通量值的99.5%,則判斷為兩寄存器間具有沖突。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該控制碼含義測試模塊根據(jù)該延遲周期判斷該控制碼含義,若該延遲周期等于0,則該控制碼含義為開啟雙發(fā)射,若該延遲周期大于0,則該控制碼含義為開啟延遲發(fā)射。
本技術(shù)發(fā)明設(shè)計和標(biāo)準(zhǔn)化一系列的微基準(zhǔn)測試程序來探測gpu微架構(gòu)特性和參數(shù);通過微基準(zhǔn)測試程序測試出gpu參數(shù)以及其和性能的對應(yīng)關(guān)系,有助于理解gpu的設(shè)計;通過微基準(zhǔn)測試程序測試出gpu參數(shù)以及其和性能的對應(yīng)關(guān)系,得出參數(shù)和性能的關(guān)系,有助于優(yōu)化gpu上的應(yīng)用。
附圖說明
圖1為測試ffma指令雙發(fā)射通量的流程圖;
圖2為指令流水線依賴延遲的測試范例代碼圖;
圖3為雙發(fā)射代碼片段圖;
圖4為在單雙發(fā)射指令交替執(zhí)行策略下6種模式所對應(yīng)的效率柱狀圖。
具體實施方式
本發(fā)明提供了一種gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該測試方法包括指令延遲/通量測試步驟、寄存器bank測試步驟、控制碼含義測試步驟和ffma雙發(fā)射通量測試步驟,其中:
指令延遲/通量測試步驟,負(fù)責(zé)對gpu指令的延遲和通量進(jìn)行測試,獲得該gpu指令的延遲周期和gpu指令通量,并將該gpu指令的延遲周期和gpu指令通量發(fā)送給該控制碼含義測試步驟;
寄存器bank測試步驟,根據(jù)判斷寄存器間是否存在bank沖突,選取無bank沖突的寄存器操作數(shù),并將該寄存器操作數(shù)發(fā)送給該ffma雙發(fā)射通量測試步驟;
控制碼含義測試步驟,通過該gpu指令的延遲周期和gpu指令通量,分析測試該gpu指令中控制碼的含義,并根據(jù)該控制碼的含義,控制開啟對應(yīng)的發(fā)射模式和gpu的線程調(diào)度,若開啟的發(fā)射模式為雙發(fā)射模式,則進(jìn)行該ffma雙發(fā)射通量測試步驟;
ffma雙發(fā)射通量測試步驟,根據(jù)該雙發(fā)射模式和該寄存器操作數(shù)計算測試gpu浮點乘加指令在雙發(fā)射模式下的通量。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該指令延遲/通量測試步驟還包括,對每個寄存器bank設(shè)置索引,以及設(shè)置不同的控制碼。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該指令延遲/通量測試步驟,通過測量預(yù)先設(shè)定的一段時間內(nèi)gpu完成的指令個數(shù),以測得該gpu指令通量;隨機(jī)選取一寄存器,并統(tǒng)計向該寄存器寫入數(shù)據(jù)的指令與讀取該寄存器中數(shù)據(jù)的指令兩者之間的時鐘周期數(shù),將該時鐘周期數(shù)作為該gpu指令的延遲周期。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該寄存器bank測試步驟,判斷寄存器間是否存在bank沖突,具體為:測試任意兩組寄存器組合下的浮點乘法的實際通量,該實際通量若達(dá)到理論通量值的99.5%以上,則判斷為兩寄存器間沒有沖突,若該實際通量小于等于理論通量值的99.5%,則判斷為兩寄存器間具有沖突。
該gpuffma指令在雙發(fā)射模式下的通量測試方法,其中該控制碼含義測試步驟根據(jù)該延遲周期判斷該控制碼含義,若該延遲周期等于0,則該控制碼含義為開啟雙發(fā)射,若該延遲周期大于0,則該控制碼含義為開啟延遲發(fā)射。
下面結(jié)合實施例和附圖對本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)地介紹。
圖1為本發(fā)明測試ffma指令雙發(fā)射通量的流程圖,如圖1所示,首先執(zhí)行指令延遲/通量測試步驟,該步驟負(fù)責(zé)對gpu指令延遲和通量進(jìn)行測試,負(fù)責(zé)對gpu指令的延遲和通量進(jìn)行測試,獲得該gpu指令的延遲周期和gpu指令通量,并通過設(shè)置不同控制碼獲取該指令的不同延遲周期和指令通量,獲得控制碼的含義。在該步驟中還包括對不同寄存器設(shè)置索引,索引會對應(yīng)一個bank,分配寄存器時,一個指令(gpu指令)的所有操作數(shù)便不會被分配到同一個bank,以及設(shè)置不同的控制碼,以便接下來寄存器bank測試步驟和控制碼含義測試步驟做準(zhǔn)備;寄存器bank測試步驟,負(fù)責(zé)根據(jù)判斷寄存器間是否存在bank沖突,來選取無bank沖突的寄存器操作數(shù),并將該寄存器操作數(shù)發(fā)送給ffma雙發(fā)射通量測試步驟;控制碼含義測試步驟,通過該gpu指令的延遲周期和gpu指令通量,分析測試該gpu指令中控制碼的含義,并根據(jù)該控制碼的含義,控制發(fā)射模式和gpu的線程調(diào)度,若開啟的模式為雙發(fā)射模式,則進(jìn)行ffma雙發(fā)射通量測試步驟;最后ffma雙發(fā)射通量測試步驟,根據(jù)該雙發(fā)射模式和該寄存器操作數(shù)計算測試gpuffma指令在雙發(fā)射模式下的通量。下面將對每個步驟展開做相應(yīng)的具體描述。其中設(shè)置不同的控制碼,目的是采用控制碼的軟硬件機(jī)制可以減少功耗,通過為每條指令設(shè)置8位的二進(jìn)制字符串,就可以設(shè)置控制碼。
指令延遲/通量測試步驟,其中指令的通量為單位時間內(nèi)的gpu可以完成的指令個數(shù),通過測量預(yù)先設(shè)定的一段時間內(nèi)gpu完成的指令個數(shù),可以測得該gpu指令通量;指令延遲/通量測試步驟還負(fù)責(zé)計算測試gpu的指令延遲,測試該指令延遲的目的是為了獲取控制碼的含義,其中該指令延遲具體為指令的寫后讀依賴延遲,即通過隨機(jī)選取一寄存器,并統(tǒng)計向該寄存器寫入數(shù)據(jù)的指令與讀取該寄存器中數(shù)據(jù)的指令,兩者之間的時鐘周期數(shù),將該時鐘周期數(shù)作為該gpu指令的延遲周期,測得該gpu指令的延遲周期,對指令調(diào)度優(yōu)化有重要意義,并且通過測試該指令延遲可以獲取控制碼的含義,并且測試該指令延遲還對gpu的編譯階段同樣有著重要意義,例如軟件調(diào)度器應(yīng)當(dāng)在有依賴的兩指令之間插入無關(guān)指令,例如nop指令,并且插入的無關(guān)指令至少要與間隔周期數(shù)對等,否則,在程序執(zhí)行時,沒有用無關(guān)指令填充的時鐘周期將被浪費(fèi)掉。
圖2為指令流水線依賴延遲的測試范例代碼圖,在圖中包含了gpu延遲微基準(zhǔn)測試程序,其設(shè)計要點總結(jié)如下:
核心循環(huán)不能超出一級指令緩存的容量。這樣,循環(huán)體只在第一次執(zhí)行時會遭遇一級指令緩存缺失,第二次開始就不會缺失了;
核心循環(huán)的循環(huán)次數(shù)要設(shè)定為2,因為循環(huán)體第一次執(zhí)行時,一級指令緩存必然缺失,第二次開始才不缺失。循環(huán)結(jié)束時,循環(huán)體最后一次執(zhí)行過程中的時鐘采樣值將被保留下來;
時鐘采樣指令要放在循環(huán)體內(nèi),因為如果放在循環(huán)體外,必然引入第一次循環(huán)時一級指令緩存缺失的噪音。雖然較大的循環(huán)次數(shù)可以稀釋第一次循環(huán)時的噪音,但是附帶的較長運(yùn)行時間,會大概率遭遇時鐘采樣值溢出回繞,所以還是將時鐘采樣指令放在循環(huán)體內(nèi)為好;
算術(shù)運(yùn)算指令的各個源操作數(shù)之間不能有寄存器bank沖突;
一個sm(streamingmultiprocessor)內(nèi)活躍的warp(gpu執(zhí)行程序時的調(diào)度單位)數(shù)小于等于sm內(nèi)調(diào)度單元的個數(shù),避免兩個warp被調(diào)度到同一個運(yùn)算單元上而引入硬件調(diào)度噪音。實際上,任務(wù)總量設(shè)置為單個warp就可以了;
由于線程內(nèi)時鐘采樣指令的通量小于1,所以兩個時鐘采樣指令之間,要填充足夠的無關(guān)指令,規(guī)避這個通量引入的噪音。本發(fā)明的測試程序中沒有放置無關(guān)指令,而是在第一條時鐘采樣指令的調(diào)度控制碼上設(shè)置了14個周期的延遲,等效于14個無關(guān)指令;
兩條相依賴的指令,即前一條指令的目標(biāo)操作數(shù)是下一條指令的源操作數(shù)。
寄存器bank測試步驟。由于gpu的寄存器分布在若干個bank中,每個bank只有一個讀口,一個時鐘周期只能讀出單個寄存器操作數(shù)。如果一條指令的兩個源操作數(shù)寄存器位于同一個bank中,則該指令在硬件流水線上推進(jìn)的過程中,會遭遇阻塞,造成性能損失。定義寄存器間的等價關(guān)系:如果實測兩個寄存器有bank沖突,則這兩個寄存器位于同一個bank中,這兩個寄存器有等價關(guān)系;如果實測兩個寄存器沒有bank沖突,則這兩個寄存器位于不同bank中,這兩個寄存器就沒有等價關(guān)系。那么,只要實測兩兩寄存器是否有bank沖突,就可以得到所有的等價類,也就是所有的bank,以及所有寄存器在這些bank中的分布。本發(fā)明測試任意兩組寄存器組合下的浮點乘法(fmul)的實際通量,通過對比實際通量值與理論通量值的大小推測其是否有bank沖突,具體來說,該實際通量若達(dá)到理論通量值的99.5%以上,則判斷為兩寄存器間沒有沖突,若該實際通量小于等于理論通量值的99.5%,則判斷為兩寄存器間具有沖突。如fmul單發(fā)射時的理論通量是66.67%。fmulr4,r1,r0實測通量是66.40%,達(dá)到理論單發(fā)射通量的99.60%,可以認(rèn)為r1,r0沒有bank沖突。fmulr4,r2,r0的單發(fā)射通量位62.06%,達(dá)到理論單通量的93.09%,可以得出r2和r0是有bank沖突,屬于同一個等價類。本步驟通過測試所有的寄存器組合,為每一個寄存器判定其屬于哪個等價類,以判定所有的寄存器共涉及幾個等價類,以及每個等價類含有哪些寄存器索引,這樣做是為了確定寄存器的bank。如果有n個寄存器,這樣的組合有c(n,2)=n*(n-1)/2個。
控制碼含義測試步驟,通過測得指令中軟件調(diào)度控制碼(控制碼)的含義,進(jìn)而得出控制碼對指令通量和延遲的影響。自kepler架構(gòu)起,nvidia引入了軟件調(diào)度控制碼,在代碼生成階段,由編譯器為每條指令附加調(diào)度提示信息:一條指令發(fā)射出去之后,要阻塞幾個周期,再發(fā)射下一條指令。這樣,對于寫后讀依賴延遲為固定周期數(shù)的指令,比如算術(shù)運(yùn)算指令,就可以省去或簡化針對寫后讀依賴的硬件保障邏輯,如計分板機(jī)制。程序運(yùn)行時,硬件調(diào)度器依據(jù)軟件調(diào)度控制碼給出的提示,決定下一條指令何時發(fā)射,而不用去考察其依賴的指令是否已經(jīng)執(zhí)行完。在gk110架構(gòu)中,每連續(xù)8條64位指令為一個單元,這8條指令中,第一條是軟件調(diào)度指令,之后七條指令的軟件調(diào)度控制碼被編碼在最前面的該軟件調(diào)度指令中。本步驟通過測試8位控制碼下編碼不同組合的指令延遲來判斷控制碼的含義,8位控制碼,每一位都可以是1或0,因此有2的8次方,也就是256種組合,我們就是要分布測出指令在這256種控制碼下的延遲,該控制碼含義測試步驟通過分布測試計算該控制碼的延遲,若延遲等于0,則該控制碼含義為開啟雙發(fā)射,若大于0,則該控制碼含義為開啟延遲發(fā)射,延遲的測試方法見指令延遲/通量測試步驟。如果延遲是0,說明是開啟雙發(fā)射。如果幾位的編碼和延遲有線性關(guān)系,這幾位則表示開啟延遲發(fā)射,即若測得延遲大于0,則該控制碼含義為開啟延遲發(fā)射。
ffma雙發(fā)射通量測試步驟,本段之后是敘述如何測試ffma雙發(fā)射通量。kepler架構(gòu)引入了共享運(yùn)算單元,以支持算術(shù)運(yùn)算指令的雙發(fā)射:sm中,每兩個warp調(diào)度器除了各自私有的一組運(yùn)算單元,還可以將算術(shù)運(yùn)算指令調(diào)度到共享的運(yùn)算單元去執(zhí)行。
并行算法要充分利用共享的運(yùn)算資源,gk110架構(gòu)中,8條指令為一個基本單元,其中第一條是軟件調(diào)度指令,之后七條指令的軟件調(diào)度控制信息被編碼在這條軟件調(diào)度指令中。本發(fā)明的測試結(jié)果表明,在8指令單元中,放置6條ffma(乘加融合指令)構(gòu)成的序列模式,運(yùn)行效率最高。8指令單元中,除去軟件調(diào)度指令和6條ffma指令,還多余一個指令槽,可以放置任意非算術(shù)運(yùn)算指令。如果沒有指令要放在這里,應(yīng)當(dāng)用無關(guān)指令填充,以防止6指令序列模式跨越8指令單元的邊界。在多余一個指令槽中放置的指令,無論是非算術(shù)運(yùn)算指令還是無關(guān)指令,都應(yīng)當(dāng)和6指令序列模式中的單發(fā)射ffma一起發(fā)射,以免擾亂ffma交替單/雙發(fā)射的節(jié)奏。
對于6條ffma構(gòu)成的指令序列,單/雙發(fā)射的配比應(yīng)該是2:2,也就是2條指令單發(fā)射,耗費(fèi)2個周期,另外4條指令雙發(fā)射,也是耗費(fèi)2個周期。兩個調(diào)度器上的任務(wù)獨立執(zhí)行時,如果因雙發(fā)射ffma而競爭共享的核心,硬件仲裁邏輯會將共享核心判給一個調(diào)度器,阻塞另一個調(diào)度器,造成性能損失。不過這種仲裁損耗占比很小,因為一到兩個周期之后,兩個執(zhí)行流就會因相位差而完美咬合,在之后很多個周期內(nèi)都滿負(fù)荷的輪流使用共享核心,不再發(fā)生競爭。
確定單雙發(fā)射配比之后,還要選取最優(yōu)的單雙發(fā)射序列模式。4個周期中,選取2個周期單發(fā)射,剩余2個周期雙發(fā)射,共有c(4,2)=6種可選的單雙發(fā)射序列模式。本發(fā)明在k20顯卡上分別測試了這6種模式,測試結(jié)果見圖4,其中1-2-2-1(單發(fā)射,雙發(fā)射,雙發(fā)射,單發(fā)射)模式最好,效率達(dá)到了峰值的97%其中效率=ffma實測通量/硬件的浮點峰值,本發(fā)明優(yōu)化的單精度矩陣乘算法sgemm實現(xiàn)就選取這個模式。作為對比,2013年lai的工作[junjielaiandandreseznec.performanceupperboundanalysisand′optimizationofsgemmonfermiandkeplergpus.incodegenerationandoptimization(cgo),2013ieee/acminternationalsymposiumon,pages1–10.ieee,2013.]中,由于沒有找到共享運(yùn)算單元的正確使用方法,ffma通量只達(dá)到理論峰值的68.75%。
以下為與上述方法實施例對應(yīng)的系統(tǒng)實施例,本實施方式可與上述實施方式互相配合實施。上述施方式中提到的相關(guān)技術(shù)細(xì)節(jié)在本實施方式中依然有效,為了減少重復(fù),這里不再贅述。相應(yīng)地,本實施方式中提到的相關(guān)技術(shù)細(xì)節(jié)也可應(yīng)用在上述實施方式中。
本發(fā)明還提供了一種gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該測試系統(tǒng)包括指令延遲/通量測試模塊、寄存器bank測試模塊、控制碼含義測試模塊和ffma雙發(fā)射通量測試模塊,其中:
指令延遲/通量測試模塊,負(fù)責(zé)對gpu指令的延遲和通量進(jìn)行測試,獲得該gpu指令的延遲周期和gpu指令通量,并將該gpu指令的延遲周期和gpu指令通量發(fā)送給該控制碼含義測試模塊;
寄存器bank測試模塊,根據(jù)判斷寄存器間是否存在bank沖突,選取無bank沖突的寄存器操作數(shù),并將該寄存器操作數(shù)發(fā)送給該ffma雙發(fā)射通量測試模塊;
控制碼含義測試模塊,通過該gpu指令的延遲周期和gpu指令通量,分析測試該gpu指令中控制碼的含義,并根據(jù)該控制碼的含義,控制開啟對應(yīng)的發(fā)射模式和gpu的線程調(diào)度,若開啟的發(fā)射模式為雙發(fā)射模式,則運(yùn)行該ffma雙發(fā)射通量測試模塊;
ffma雙發(fā)射通量測試模塊,根據(jù)該雙發(fā)射模式和該寄存器操作數(shù)計算測試gpu浮點乘加指令在雙發(fā)射模式下的通量。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該指令延遲/通量測試模塊還包括,對每個寄存器bank設(shè)置索引,以及設(shè)置不同的控制碼。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該指令延遲/通量測試模塊,通過測量預(yù)先設(shè)定的一段時間內(nèi)gpu完成的指令個數(shù),以測得該gpu指令通量;隨機(jī)選取一寄存器,并統(tǒng)計向該寄存器寫入數(shù)據(jù)的指令與讀取該寄存器中數(shù)據(jù)的指令兩者之間的時鐘周期數(shù),將該時鐘周期數(shù)作為該gpu指令的延遲周期。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該寄存器bank測試模塊,判斷寄存器間是否存在bank沖突,具體為:測試任意兩組寄存器組合下的浮點乘法的實際通量,該實際通量若達(dá)到理論通量值的99.5%以上,則判斷為兩寄存器間沒有沖突,若該實際通量小于等于理論通量值的99.5%,則判斷為兩寄存器間具有沖突。
該gpuffma指令在雙發(fā)射模式下的通量測試系統(tǒng),其中該控制碼含義測試模塊根據(jù)該延遲周期判斷該控制碼含義,若該延遲周期等于0,則該控制碼含義為開啟雙發(fā)射,若該延遲周期大于0,則該控制碼含義為開啟延遲發(fā)射。
總結(jié)起來,單雙發(fā)射指令交替執(zhí)行策略的實現(xiàn)要點包括:
使用正確的軟件調(diào)度控制碼,開啟相鄰兩條指令雙發(fā)射;
控制線程中雙發(fā)射指令的配比和節(jié)奏;
6指令序列模式不能跨越軟件調(diào)度指令控制的8指令邊界;
在雙發(fā)射的情況下,兩條乘加指令要讀取6個寄存器操作數(shù),但是寄存器只有4個bank,顯然會導(dǎo)致bank沖突。此時,要設(shè)計乘加指令的順序,從而充分利用硬件提供的“寄存器操作數(shù)緩存”設(shè)施[jackhilairechoquette,manueloliviergautho,andjohneriklindholm.methodsandapparatusforsourceoperandcollectorcaching,january282014.uspatent8,639,882.],以規(guī)避bank沖突。
雖然本發(fā)明以上述實施例公開,但具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明,任何本技術(shù)領(lǐng)域技術(shù)人員,在不脫離本發(fā)明的構(gòu)思和范圍內(nèi),可作一些的變更和完善,故本發(fā)明的權(quán)利保護(hù)范圍以權(quán)利要求書為準(zhǔn)。