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