欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種通過死代碼移除來加快gpu運行速度的方法

文檔序號:6398124閱讀:331來源:國知局
專利名稱:一種通過死代碼移除來加快gpu運行速度的方法
技術(shù)領(lǐng)域
本發(fā)明涉及加快大規(guī)模GPU核心程序運行速度的方法,尤指通過移除死代碼來加快GPU運行速度的方法。
背景技術(shù)
GPU (Graphics Processing Unit,圖形處理單元)過去通常用于圖形圖像應(yīng)用領(lǐng)域,現(xiàn)在也廣泛應(yīng)用于加速各種通用的并行算法和應(yīng)用。這些算法和應(yīng)用在GPU上的核心程序通常都比較簡單,一般只有上百行代碼。但是對于一些具有實際應(yīng)用價值的大規(guī)模應(yīng)用程序,如非確定性粒子輸運程序MCNP (Monte Carlo N-particle, N粒子蒙特卡羅方法),其GPU實現(xiàn)的核心代碼通常上萬行,同時在具體程序執(zhí)行時存在大量死代碼。與CPU相比,GPU的指令緩存較少,從而對生成的匯編代碼的大小很敏感。并且GPU —般采用_inline_指令對子函數(shù)進行內(nèi)聯(lián),編譯時需要對整個核心程序進行全局優(yōu)化。死代碼的存在既增大了生成的匯編代碼體積,又降低了全局優(yōu)化的效果,嚴重影響了 GPU運行速度。目前加快GPU運行速度的方法主要有以下幾種(I)將只讀數(shù)據(jù)布局于GPU常量存儲空間來提高訪存速度。(2)將頻繁訪問的數(shù)據(jù)布局于GPU片上共享存儲器來提高訪存速度。(3 )通過接合式訪問GPU全局內(nèi)存來提高訪存速度。(4)調(diào)整GPU核心程序線程塊大小來提高寄存器資源利用率和程序執(zhí)行效率。上述四類方法都存在局限性。GPU常量存儲器容量有限且只能存放只讀數(shù)據(jù);GPU片上共享存儲器容量有限且存在體沖突(bank conflicts) ;GPU全局內(nèi)存存在訪存延遲高的問題;調(diào)整大型GPU核心程序線程塊大小通常只能逐一嘗試來確定最優(yōu)的線塊大小,效率低。死代碼就是程序執(zhí)行過程中可能執(zhí)行但實際運行時并沒有執(zhí)行的代碼段。死代碼的存在將增大匯編代碼體積,嚴重影響程序優(yōu)化和調(diào)度,降低程序運行效率。對于一些具有實際應(yīng)用價值的大規(guī)模應(yīng)用程序而言,其GPU核心程序匯編代碼體積已經(jīng)相當可觀,同時GPU指令緩存空間卻相當有限,GPU核心程序中死代碼的存在將增加GPU指令緩存的壓力,浪費GPU寶貴的指令緩存空間,嚴重影響GPU核心代碼的調(diào)度和優(yōu)化,延長GPU核心代碼的運行時間。因此死代碼的刪除對于提高大規(guī)模GPU程序執(zhí)行效率和加快程序運行速度至關(guān)重要。BODIK提出了編譯優(yōu)化過程中識別無用賦值語句的方法;SffEENEY提出了面向?qū)ο蟮牟豢蛇_子程序的檢測方法;χι提出了無用函數(shù)參數(shù)的檢測方法;張廣梅從程序的控制結(jié)構(gòu)出發(fā)實現(xiàn)了無效程序分支的檢測。上述死代碼檢測技術(shù)均以編譯為基礎(chǔ),側(cè)重于死代碼檢測技術(shù)基本原理的推導和證明,理論證明詳實可信,但是實際應(yīng)用復(fù)雜,可操作性差,不利于推廣應(yīng)用。對于具有實際應(yīng)用價值的大規(guī)模GPU核心程序,移除死代碼可以顯著增加程序的執(zhí)行效率,因此,如果能夠檢測和刪除死代碼,必定能夠加快GPU運行速度,但是目前還沒有公開文獻研究相關(guān)技術(shù)方案。

發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題在于針對大型GPU核心程序存在執(zhí)行效率不高的問題,在保證程序正確性的前提下,提出一種通過死代碼移除來加速GPU運行速度的方法,提高大規(guī)模GPU核心程序的執(zhí)行和編譯效率。為了解決上述技術(shù)問題,本發(fā)明的具體技術(shù)方案為第一步、構(gòu)建函數(shù)狀態(tài)檢測表。為大規(guī)模GPU核心程序中的所有函數(shù)構(gòu)建狀態(tài)檢測表,狀態(tài)檢測表的表項數(shù)為GPU核心程序中函數(shù)的個數(shù)。狀態(tài)檢測表共包含六個字段,分別為函數(shù)編號ID、函數(shù)名稱Name、調(diào)用標記Callee、靜態(tài)分析標記Static、動態(tài)執(zhí)行標記Dynamic和刪除標記Del。函數(shù)編號ID為函數(shù)的全局唯一標記,函數(shù)名稱Name表示函數(shù)的名字;調(diào)用標記Callee表示函數(shù)是否被程序調(diào)用,調(diào)用標記Callee為true表示函數(shù)被程序調(diào)用過,Callee為false表示函數(shù)沒有被程序調(diào)用過;靜態(tài)分析標記Static表示對函數(shù)模塊進行靜態(tài)分析后判斷其是否會執(zhí)行,Static為true表示函數(shù)在程序執(zhí)行時可能會運行,Static為false表示函數(shù)在 程序執(zhí)行時不會運行;動態(tài)執(zhí)行標記Dynamic表示程序運行時函數(shù)是否被執(zhí)行,Dynamic為true表明函數(shù)在程序運行時運行過,Dynamic為false表明函數(shù)在程序運行時沒有運行過;刪除標記Del表示函數(shù)代碼段能否被刪除,Del為true表明函數(shù)代碼段是死代碼應(yīng)該刪除,若Del為false表明函數(shù)代碼段不是死代碼不應(yīng)刪除。第二步、記錄函數(shù)基本信息。掃描程序代碼,從O開始給GPU核心程序中每個函數(shù)代碼段分配唯一函數(shù)編號并將分配的函數(shù)編號寫入狀態(tài)檢測表的ID字段中,并將函數(shù)編號為q的函數(shù)名記錄于ID字段為q的狀態(tài)檢測表的表項的Name字段中。對于有N個函數(shù)的GPU核心程序,則狀態(tài)檢測表有N個表項,N個表項的ID字段為O N-1,O彡q彡N-1。第三步、初始化狀態(tài)檢測表。初始化狀態(tài)檢測表中所有表項的函數(shù)的調(diào)用標記Callee為true ;初始化所有表項的函數(shù)的靜態(tài)分析標記Static為true ;初始化所有表項的函數(shù)的動態(tài)執(zhí)行標記Dynamic為true ;初始化所有表項的函數(shù)的刪除標記Del為false。第四步、對GPU程序源碼進行靜態(tài)分析,通過靜態(tài)分析結(jié)果更新狀態(tài)檢測表各函數(shù)檢測表字段的狀態(tài),具體方法如下4.1獲取狀態(tài)檢測表的表項總數(shù)N,初始化q=0 ;4. 2如果狀態(tài)檢測表表項q對應(yīng)的函數(shù)不會被調(diào)用,則置該表項對應(yīng)的字段Callee 為 false,否則置為 true ;4. 3如果狀態(tài)檢測表表項q對應(yīng)的字段Callee為true,則置該表項對應(yīng)的字段Static 為 true,否則置字段 Static 為 false ;4. 4更新q=q+l,如果q〈N,轉(zhuǎn)4. 2 ;否則,轉(zhuǎn)第五步。第五步、運行GPU核心程序,記錄GPU核心程序運行時信息,更新狀態(tài)檢測表各函數(shù)檢測表字段的狀態(tài),具體方法如下5.1獲取狀態(tài)檢測表的表項總數(shù)N,初始化q=0 ;5. 2如果狀態(tài)檢測表表項q對應(yīng)的函數(shù)沒有被執(zhí)行,則置該表項對應(yīng)的字段Dynamic 為 false,否則置字段 Dynamic 為 true5. 3如果表項q對應(yīng)的字段Static和Dynamic均為false,則置該表項對應(yīng)字段Del為true,否則置字段Del為false ;5. 4更新q=q+l,如果q〈N,轉(zhuǎn)5. 2 ;否則,轉(zhuǎn)第六步。第六步、死代碼標識。定義集合Stl, S1,…Sr·· Ssh均為空集,依據(jù)狀態(tài)檢測表中各字段的定義,表項字段Del為true對應(yīng)的函數(shù)即為死代碼函數(shù)。將狀態(tài)檢測表中表項字段Del為true對應(yīng)的第一個函數(shù)并入集合S。,將狀態(tài)檢測表中表項字段Del為true對應(yīng)的第二個函數(shù)并入集合S1,…,將狀態(tài)檢測表中表項字段Del為true對應(yīng)的第M個函數(shù)并入集合Ssh,其中,O ( i〈M彡N,M為標識為死代碼的函數(shù)個數(shù)。第七步、死代碼最終確認。具體方法如下7.1初始化死代碼函數(shù)集合為空D =0,定義變量j=0 ;7. 2使用GPU核心程序?qū)?yīng)的語言注釋標識將Sj對應(yīng)的函數(shù)代碼段注釋,使得該函數(shù)代碼段不運行;7. 3運行將S」注釋后的程序,比較運行結(jié)果,若結(jié)果正確,更新死代碼集合D=D U Sj ;否則,轉(zhuǎn) 7.4 ;7. 4刪除當前S」對應(yīng)的函數(shù)代碼段的注釋;7. 5j=j+l ;7. 6如果j〈M,轉(zhuǎn)7. 2 ;否則,轉(zhuǎn)第八步。第八步、死代碼刪除。根據(jù)最終得到的死代碼集合D,進行死代碼刪除,具體流程如下8.1獲取死代碼集合D的元素個數(shù)P,O彡P(guān)彡M彡N,定義變量k=0 ;8. 2刪除D中第k個元素對應(yīng)的函數(shù)代碼段,具體刪除方法為為了保持程序的可讀性和提高程序易維護性,對于程序中死代碼并不采取物理刪除的方法,而是將狀態(tài)檢測表項字段Del為true的函數(shù)代碼段進行預(yù)編譯處理,即在該函數(shù)代碼段前后分別添加預(yù)編譯代碼模式將該函數(shù)注釋。從而不必直接刪除源代碼。8. 3更新k=k+l,如果k〈P,轉(zhuǎn)8. 2 ;否則,轉(zhuǎn)第九步。第九步、結(jié)束。

與現(xiàn)有技術(shù)相比,采用本發(fā)明可達到以下技術(shù)效果1.本發(fā)明可應(yīng)用于各種大型的GPU核心程序,通過移除運行時不執(zhí)行的死代碼,減少了 GPU核心程序的代碼體積,使得編譯和優(yōu)化時間縮短,最終生成的匯編代碼體積減小,從而提高GPU中SIMD (Single Instruction Multiple Data,單指令多數(shù)據(jù))指令調(diào)度的命中率,顯著提高大規(guī)模GPU核心程序的運行效率。


圖1為死代碼狀態(tài)檢測表結(jié)構(gòu)。圖2為本發(fā)明總體流程圖。
具體實施例方式圖1為死代碼狀態(tài)檢測表結(jié)構(gòu)。具體的表結(jié)構(gòu)建立方式如下狀態(tài)檢測表的表項數(shù)為GPU核心程序中函數(shù)的個數(shù)。狀態(tài)檢測表共包含六個字段,分別為函數(shù)編號ID、函數(shù)名稱Name、調(diào)用標記Cal Iee、靜態(tài)分析標記Static、動態(tài)執(zhí)行標記Dynamic和刪除標記Del。函數(shù)編號ID為函數(shù)的全局唯一標記,函數(shù)名稱Name表示函數(shù)的名字;調(diào)用標記Callee表示函數(shù)是否被程序調(diào)用,調(diào)用標記Callee為true表示函數(shù)被程序調(diào)用過,Callee為false表示函數(shù)沒有被程序調(diào)用過;靜態(tài)分析標記Static表示對函數(shù)模塊進行靜態(tài)分析后判斷其是否會執(zhí)行,Static為true表示函數(shù)在程序執(zhí)行時可能會運行,Static為false表示函數(shù)在程序執(zhí)行時不會運行;動態(tài)執(zhí)行標記Dynamic表示程序運行時函數(shù)是否被執(zhí)行,Dynamic為true表明函數(shù)在程序運行時運行過,Dynamic為false表明函數(shù)在程序運行時沒有運行過;刪除標記Del表示函數(shù)代碼段能否被刪除,Del為true表明函數(shù)代碼段是死代碼應(yīng)該刪除,若Del為false表明函數(shù)代碼段不是死代碼不應(yīng)刪除。圖2為本發(fā)明的總體流程圖,其具體實施步驟如下第一步、構(gòu)建函數(shù)狀態(tài)檢測表。第二步、記錄函數(shù)基本信息。第三步、初始化狀態(tài)檢測表。第四步、對GPU程序源碼進行靜態(tài)分析。第五步、更新狀態(tài)檢測表狀態(tài)。第六步、死代碼標識。第七步、死代碼最終確認。第八步、死代碼刪除。第九步、結(jié)束。
權(quán)利要求
1.一種通過死代碼移除來加快GPU運行速度的方法,其特征在于包括以下步驟 第一步、為大規(guī)模GPU核心程序中的所有函數(shù)構(gòu)建狀態(tài)檢測表,狀態(tài)檢測表的表項數(shù)為GPU核心程序中函數(shù)的個數(shù);狀態(tài)檢測表共包含六個字段,分別為函數(shù)編號ID、函數(shù)名稱Name、調(diào)用標記Callee、靜態(tài)分析標記Static、動態(tài)執(zhí)行標記Dynamic和刪除標記Del ; 函數(shù)編號ID為函數(shù)的全局唯一標記,函數(shù)名稱Name表示函數(shù)的名字;調(diào)用標記Callee表示函數(shù)是否被程序調(diào)用,調(diào)用標記Callee為true表示函數(shù)被程序調(diào)用過,Callee為false 表示函數(shù)沒有被程序調(diào)用過;靜態(tài)分析標記Static表示對函數(shù)模塊進行靜態(tài)分析后判斷其是否會執(zhí)行,Static為true表示函數(shù)在程序執(zhí)行時可能會運行,Static為false表示函數(shù)在程序執(zhí)行時不會運行;動態(tài)執(zhí)行標記Dynamic表示程序運行時函數(shù)是否被執(zhí)行, Dynamic為true表明函數(shù)經(jīng)在程序運行時運行過,Dynamic為false表明函數(shù)在程序運行時沒有運行過;刪除標記Del表示函數(shù)代碼段能否被刪除,Del為true表明函數(shù)代碼段是死代碼應(yīng)該刪除,若Del為false表明函數(shù)代碼段不是死代碼不應(yīng)刪除;第二步、記錄函數(shù)基本信息掃描程序代碼,從O開始給GPU核心程序中每個函數(shù)代碼段分配唯一函數(shù)編號并將分配的函數(shù)編號寫入狀態(tài)檢測表的ID字段中,并將函數(shù)編號為q 的函數(shù)名記錄于ID字段為q的狀態(tài)檢測表的表項的Name字段中;對于有N個函數(shù)的GPU 核心程序,則狀態(tài)檢測表有N個表項,N個表項的ID字段為O N-1,O < q < N-1 ;第三步、初始化狀態(tài)檢測表初始化狀態(tài)檢測表中所有表項的函數(shù)的調(diào)用標記Callee 為true ;;初始化所有表項的函數(shù)的靜態(tài)分析標記Static為true ;初始化所有表項的函數(shù)的動態(tài)執(zhí)行標記Dynamic為true ;初始化所有表項的函數(shù)的刪除標記Del為true ;第四步、對GPU程序源碼進行靜態(tài)分析,通過靜態(tài)分析結(jié)果更新狀態(tài)檢測表各函數(shù)檢測表字段的狀態(tài),具體方法如下.4.1獲取狀態(tài)檢測表的表項總數(shù)N,初始化q=0 ;.4.2如果狀態(tài)檢測表表項q對應(yīng)的函數(shù)不會被調(diào)用,則置該表項對應(yīng)的字段Callee為 false,否則置為true ;.4.3如果狀態(tài)檢測表表項q對應(yīng)的字段Callee為true,則置該表項對應(yīng)的字段Static 為true,否則置字段Static為false ;.4.4更新q=q+l,如果q〈N,轉(zhuǎn)4. 2 ;否則,轉(zhuǎn)第五步。第五步、運行GPU核心程序,記錄GPU核心程序運行時信息,更新狀態(tài)檢測表各函數(shù)檢測表字段的狀態(tài),具體方法如下.5.1獲取狀態(tài)檢測表的表項總數(shù)N,初始化q=0 ;.5.2如果狀態(tài)檢測表表項q對應(yīng)的函數(shù)不會被調(diào)用,則置該表項對應(yīng)的字段Callee為 false,否則置為true ;.5.3如果表項q對應(yīng)的字段Static和字段Dynamic均為false,則置該表項對應(yīng)字段 Del為true,否則置字段Del為false ;.5. 4更新q=q+l,如果q〈N,轉(zhuǎn)5. 2 ;否則,轉(zhuǎn)第六步;第六步、死代碼標識定義集合Stl, S1,…均為空集,將狀態(tài)檢測表中表項字段 Del為true對應(yīng)的第一個函數(shù)并入集合S。,將狀態(tài)檢測表中表項字段Del為true對應(yīng)的第二個函數(shù)并入集合S1,…,將狀態(tài)檢測表中表項字段Del為true對應(yīng)的第M個函數(shù)并入集合Ssh,其中,O ( i〈M彡N,M為標識為死代碼的函數(shù)個數(shù);第七步、死代碼最終確認,具體方法如下.7.1初始化死代碼函數(shù)集合為空£> = 0,定義變量j=0 ;.7.2使用GPU核心程序?qū)?yīng)的語言注釋標識將Sj對應(yīng)的函數(shù)代碼段注釋,使得該函數(shù)代碼段不運行;.7.3運行經(jīng)將Sj注釋后的程序,比較運行結(jié)果,若結(jié)果正確,更新死代碼集合D=D U Sj ; 否則,轉(zhuǎn)7.4 ;.7.4刪除當前S」對應(yīng)的函數(shù)代碼段的注釋;.7.5j=j+l ;.7.6如果j〈M,轉(zhuǎn)7. 2 ;否則,轉(zhuǎn)第八步;第八步、根據(jù)最終得到的死代碼集合D,進行死代碼刪除,具體流程如下.8.1獲取死代碼集合D的元素個數(shù)P,O < P < M < N,定義變量k=0 ;.8.2刪除死代碼集合D中第k個元素對應(yīng)的函數(shù)代碼段;.8.3更新k=k+l,如果k〈P,轉(zhuǎn)8. 2 ;否則,轉(zhuǎn)第九步;第九步、優(yōu)化結(jié)束。
2.如權(quán)利要求1所述的一種通過死代碼移除來加快GPU運行速度的方法,其特征在于刪除死代碼集合D中第k個元素對應(yīng)的函數(shù)代碼段的方法為將狀態(tài)檢測表字段Del為 true的函數(shù)代碼段進行預(yù)編譯處理,即在該函數(shù)代碼段前后分別添加預(yù)編譯代碼模式將該函數(shù)注釋。
全文摘要
本發(fā)明公開了一種通過死代碼移除來加快GPU運行速度的方法,目的是提出一種通過死代碼移除來加速GPU運行速度的方法,提高大規(guī)模GPU核心程序的執(zhí)行和編譯效率。技術(shù)方案是先為大規(guī)模GPU核心程序中的所有函數(shù)構(gòu)建狀態(tài)檢測表;記錄函數(shù)基本信息,初始化狀態(tài)檢測表;靜態(tài)分析GPU程序;接著運行GPU核心程序,記錄GPU核心程序運行時信息,更新狀態(tài)檢測表各函數(shù)檢測表字段的狀態(tài),然后標識死代碼、死代碼最終確認,根據(jù)最終得到的死代碼集合D,刪除死代碼。本發(fā)明通過移除運行時不執(zhí)行的死代碼,減少了GPU核心程序的代碼體積,也減小了最終生成的匯編代碼體積,從而提高GPU中SIMD指令調(diào)度的命中率,顯著提高大規(guī)模GPU核心程序的運行效率。
文檔編號G06F9/45GK103049304SQ201310020549
公開日2013年4月17日 申請日期2013年1月21日 優(yōu)先權(quán)日2013年1月21日
發(fā)明者遲利華, 劉杰, 胡慶豐, 晏益慧, 龔春葉, 甘新標, 徐涵, 蔣杰, 楊博 申請人:中國人民解放軍國防科學技術(shù)大學
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
阿拉善盟| 永修县| 霍林郭勒市| 扎兰屯市| 正宁县| 南开区| 蒙山县| 五华县| 广平县| 商都县| 宝丰县| 义马市| 虞城县| 仁化县| 博乐市| 平江县| 丰都县| 喀喇| 永济市| 呼伦贝尔市| 海晏县| 通化市| 措美县| 济源市| 布尔津县| 香格里拉县| 泾阳县| 垫江县| 白山市| 五常市| 都江堰市| 左权县| 温宿县| 河源市| 九台市| 佛学| 石狮市| 安岳县| 徐州市| 确山县| 莱阳市|