專利名稱:批量同步圖形處理單元編程的制作方法
批量同步圖形處理單元編程背景當代商品圖形硬件用中等成本提供了強大的原料處理能力。然而,對GPU進行編 程用于通用計算是相對困難的。這部分地是因為現(xiàn)有的通用GPU編程語言基于流處理模 型,因為GPU是流處理器;這些語言包括Brook、Sh和NVIDIA公司的CUDA。流處理是以數(shù)據(jù)為中心的模型,其中數(shù)據(jù)被組織成元素的同類流。將調(diào)用個體函 數(shù)的內(nèi)核并行地應用于輸入流的所有元素來產(chǎn)生輸出流。通過在多個流上啟動多個內(nèi)核來 實現(xiàn)復雜計算。這種流/內(nèi)核抽象顯式地暴露出底層數(shù)據(jù)依賴性。然而,雖然提供高性能,但出于多個原因,流處理模型使得通用GPU編程很困難。 其一,程序可讀性和維護是一個大問題,因為根據(jù)數(shù)據(jù)依賴性而非功能來將程序分區(qū)到各 內(nèi)核中。將新的功能添加到現(xiàn)有程序通常涉及重寫代碼的許多不相關的部分。其二,由于 中間或臨時流的廣泛使用,復雜應用中的數(shù)據(jù)流幾乎不與低層程序邏輯有關。顯式數(shù)據(jù)流 管理因此是乏味的且易于出錯的。編程困難的另一原因在于并行原語的抽象是困難的,這妨礙了代碼重用。更具體 地,許多并行原語,諸如scan和sort,需要多個內(nèi)核啟動。當內(nèi)核調(diào)用這種原語時,需要將 原語的一部分與調(diào)用器進行捆綁來減小中間流尺寸和內(nèi)核啟動成本。結(jié)果是完整性被破壞 的原語,這使得原語的抽象變得困難。因為以上的問題,使用如今的GPU編程語言來編寫即使中等復雜的通用程序也是 極度困難的。對GPU可編程性的任何改進因此是高度需要的。概述提供本概述以便以簡化形式介紹將在以下的詳細描述中進一步描述的一些代表 性概念。本概述不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在以限制 所要求保護的主題的范圍的任何方式來使用。簡言之,此處描述的主題的各方面涉及提供和便于對用于圖形處理單元(GPU)上 的通用計算的編程語言的使用的技術。對批量同步GPU編程(BSGP)程序,諸如系統(tǒng)的一部 分進行編程來包括壁壘(barrier)來描述GPU上的并行處理。在一個方面,BSGP編譯器檢測對應于超級步(superst印)的壁壘,基于壁壘將 BSGP程序轉(zhuǎn)換成內(nèi)核,并對其進行組合。在編譯期間,編譯器對齊語句中的壁壘,并將相應 的超級步捆綁在一起以便代碼重用。提供par構(gòu)造來允許程序員例如通過指定獨立語句塊 來控制捆綁的各方面。在一個方面,提供了線程操縱仿真來用操作fork(分叉)和kill (銷毀)來透明 地模擬線程創(chuàng)建和銷毀。還提供了用于線程之間的高效通信的遠程變量訪問內(nèi)部函數(shù)和集 體原語操作。結(jié)合附圖閱讀以下詳細描述,本發(fā)明的其他優(yōu)點會變得顯而易見。附圖簡述作為示例而非限制,在附圖中示出了本發(fā)明,附圖中相同的附圖標記指示相同或 相似的元素,附圖中
圖1是表示編譯器自動地將BSGP程序轉(zhuǎn)換成流內(nèi)核并為GPU執(zhí)行生成管理代碼 的計算(編程/編譯和/或運行時環(huán)境)中的示例組件的框圖。圖2A是示出線程之間的壁壘操作的構(gòu)造的表示。圖2B是示出線程之間的集體操作的構(gòu)造的表示。圖3A是流編程模型中的源代碼重用的表示。圖;3B是批量同步編程模型中的源代碼重用的表示。圖4是示出編譯BSGP程序所采用的示例步驟的流程圖。圖5A-5C是用于便于臨時流優(yōu)化的最小流的圖形構(gòu)建的表示。圖6示出了表示壁壘對齊和合并的par構(gòu)造的表示。詳細描述此處描述的技術的各方面一般涉及用于GPU上的通用計算的新的GPU編程語言, 此處被稱為BSGP (批量同步GPU編程)。BSGP基于批量同步并行(BSP)模型,該模型是從 低層程序結(jié)構(gòu)中抽象以支持超級步(superst印)的并行編程模型。BSGP程序因此包括超級 步的順序集,其中每一超級步由多個線程完全并行地執(zhí)行。如此處所使用的,在每一超級步 的結(jié)尾處執(zhí)行壁壘同步來確保按照相對于彼此的順序次序來執(zhí)行各步驟。如將理解的,BSGP容易閱讀、編寫和維護。例如,BSGP程序看上去與順序C++代碼 相似,只需要某些附加的額外信息來描述GPU上的并行處理。這是因為不像流處理中的內(nèi) 核,超級步不是具有顯式指定的輸入和輸出參數(shù)的個體函數(shù),而是類似于傳統(tǒng)順序編程中 的語句,并且是在語義上推斷的而非在語法上實施的。BSGP的另一優(yōu)勢在于其數(shù)據(jù)依賴性是隱式地定義的,因為局部變量是可見的并且 可以跨超級步共享。將程序員從流編程中的乏味的時間數(shù)據(jù)流管理中解脫出來。此外,有 了 BSGP,諸如reduce (縮減)、SCan (掃描)和sort (排序)的并行原語可以作為整體在單 個語句中被調(diào)用,使得原語的抽象變得簡單并因此便于代碼重用。如將進一步理解的,BSGP通過透明地仿真一組線程操縱特征來提供線程操縱仿 真,具體地,通過包括fork和kill的操作來仿真線程拆分和析構(gòu)。還提供了包括reduce、 scan和sort的高效原語操作庫。還描述了高效地將BSP映射到GPU的語言構(gòu)造,包括要求 塊和并行塊,來幫助克服關于BSP和GPU的若干不兼容問題。雖然此處描述的某些示例涉及各種代碼清單,但可以理解這些是非限制性的示 例。類似地,雖然在類似CUDA的環(huán)境中描述編譯器,但這只是一個合適的環(huán)境。如此,本發(fā) 明不限于此處所描述的任何特定實施例、方面、概念、結(jié)構(gòu)、功能或示例。相反,此處所描述 的實施例、方面、概念、結(jié)構(gòu)、功能或示例中的任一個都是非限制性的,并且本發(fā)明一般能夠 以在計算和GPU編程方面提供好處和優(yōu)點的各種方式來使用。轉(zhuǎn)向附圖,描述了 BSGP,S卩,容易閱讀、編寫和維護的用于GPU上的通用計算的一 種編程語言。有了 BSGP,程序員只需要向程序102提供少量的額外信息,在此處被稱為壁 壘,來描述GPU 104上的并行處理。BSGP編譯器108自動地將兩個壁壘之間的語句推斷為 超級步并將其轉(zhuǎn)換成GPU內(nèi)核Ioe1-Ioen,如圖ι所示。每一超級步因此由多個線程并行地 執(zhí)行,其中壁壘同步對超級步進行定界來確保正確的并行執(zhí)行。圖1還示出編譯器所產(chǎn)生 的數(shù)據(jù)流管理代碼110。對于編譯,BSGP編程模型不直接匹配GPU的流處理體系結(jié)構(gòu),因此編譯器108需要將BSGP程序轉(zhuǎn)換為高效的流程序。為了構(gòu)建編譯器108,需要考慮壁壘同步,因為雖然可以 使用粗粒度化的并行體系結(jié)構(gòu)的硬件同步來直接實現(xiàn)壁壘,但這在流環(huán)境中是不可能的。 在GPU的流環(huán)境中,常常創(chuàng)建比可以同時在物理處理單元上執(zhí)行的線程更多的數(shù)量級。線 程被動態(tài)地分布到可用的處理單元以執(zhí)行。在完成之后回收類似用于保存線程上下文的寄 存器之類的資源。物理處理單元的同步不影響非執(zhí)行的線程,并因此不等價于線程的(邏 輯)壁壘。等待所有線程完成可用作有效壁壘,但這使得線程上下文被析構(gòu)。為了解決這 個問題,編譯器108自動地添加上下文保存代碼來使得壁壘符合BSGP語義,如以下所描述 的。另一個與編譯器相關的問題是生成高效的流代碼。因為局部變量是可見的并且跨 BSGP程序中的超級步共享,所以編譯器108分析超級步之間的數(shù)據(jù)依賴性并自動地分配臨 時流來在超級步的結(jié)尾處保存局部變量值,將這些臨時流傳遞給后續(xù)超級步。為了減少臨 時流的總數(shù)以便高效使用GPU上可用的(有限)視頻存儲器,此處描述了一種圖優(yōu)化方案。 作為超級步的順序組織的結(jié)果,可以用多項式時間來獲得最優(yōu)解決方案。轉(zhuǎn)向BSGP對流處理的考慮,BSGP和流處理之間的一個差別在于BSGP和流處理是 不同形式的SPMD(單程序多數(shù)據(jù))處理,其中多個線程并行地執(zhí)行同一個程序。線程的總 數(shù)被稱為線程大小。每一線程被賦予一個等級,例如從0到size-Ι (大小-1)的唯一整數(shù), 這個數(shù)字將該線程與其他線程區(qū)分開來。壁壘是用SPMD編程的一種同步的形式。當?shù)竭_壁壘時,阻塞執(zhí)行直到所有線程到 達同一個壁壘,如圖2A中的壁壘222概括地表示的那樣,圖中的壁壘使得線程0和線程2 等待直到線程1完成其工作負荷。在流處理中,等待內(nèi)核啟動到終止只是壁壘的一種形式 (注意,內(nèi)核啟動傳統(tǒng)地在GPU編程中被稱為pass)。雖然具有CUDA能力的硬件支持局部 同步,但一般不能在一個內(nèi)核中實現(xiàn)所有線程的壁壘。另一方面是集體操作,包括必須由所有線程同時執(zhí)行的操作。在SPMD編程中,集 體操作在語法上與普通順序操作相似,除了集體操作在語義上在所有線程上操作。一個線 程的輸入可能影響其他線程的輸出。例如,考慮圖2B,其中集體前置和可以被定義為scan (X),收集線程(線程0、線程 1和線程幻中的χ的值來形成向量。在壁壘同步之后,如圖2B中的虛線所表示的,使用該 向量來計算前置和。隨后將前置和結(jié)果重新分發(fā)給每一線程的X,代碼執(zhí)行繼續(xù)。典型的集 體操作在內(nèi)部需要壁壘并因此在流編程中相對稀少。作為源代碼示例,考慮求解以下問題給定三角形網(wǎng)格的連接,為每一頂點計算一 環(huán)(one-ring)鄰接三角形的列表。網(wǎng)格含有m個頂點和η個三角形。連接被賦予范圍從 0到m-1的3η個整數(shù)的數(shù)組,其中每三個連續(xù)的整數(shù)表示三角形的三個頂點索引。用于求解該問題的示例BSGP源代碼基于排序算法。更具體地,以上問題通過排序 來求解,其中每一三角形被一式三份并與其三個頂點相關聯(lián)。將相關聯(lián)的頂點索引用作排 序鍵來對一式三份的三角形進行排序。在排序之后,共享同一個頂點的三角形被分組在一 起來創(chuàng)建所有頂點的鄰接三角形的串接列表。隨后將每一排序鍵與其前任進行比較來計算 指向每一頂點列表的開始位置的指針。清單1尋找鄰接三角形(BSGP版本)
權(quán)利要求
1.一種在計算環(huán)境中的方法,包括檢測批量同步程序中的壁壘(102),每一壁壘定界超級步;以及將所述超級步編譯(108)成供圖形處理單元(104)執(zhí)行的流代碼內(nèi)核(Ioe1-Ioen)。
2.如權(quán)利要求1所述的方法,其特征在于,編譯所述超級步包括在每一壁壘處添加保 存線程上下文的代碼。
3.如權(quán)利要求1所述的方法,其特征在于,所述編譯還包括使用分配的臨時流組合所 述內(nèi)核中的至少一些。
4.如權(quán)利要求3所述的方法,其特征在于,使用分配的臨時流包括采用圖優(yōu)化方案。
5.如權(quán)利要求1所述的方法,其特征在于,還包括提供將線程的總數(shù)用作參數(shù)來執(zhí)行 GPU代碼塊的spaWn語句。
6.如權(quán)利要求1所述的方法,其特征在于,還包括提供用于將控制處理器代碼插入包 含超級步的require構(gòu)造,所述require構(gòu)造用于在啟動所述包含超級步之前執(zhí)行所述控 制處理器代碼。
7.如權(quán)利要求1所述的方法,其特征在于,還包括提供在所述批量同步程序中使用來 指定獨立的語句塊的par構(gòu)造。
8.如權(quán)利要求1所述的方法,其特征在于,還包括提供在所述批量同步程序中使用的 一組原語,包括提供數(shù)據(jù)并行原語、等級調(diào)整原語、或線程操縱原語,或數(shù)據(jù)并行原語、等級 調(diào)整原語或線程操縱原語的任意組合。
9.如權(quán)利要求8所述的方法,其特征在于,提供所述一組原語包括提供reduce原語, scan 原語,compact 原語,split 原語或 sort 原語,或 reduce、scan、compact、split 或 sort 原語的任意組合。
10.如權(quán)利要求8所述的方法,其特征在于,提供一組原語包括提供用于拆分線程的原 語、用于對線程排序的原語,或用于拆分線程的原語和用于對線程排序的原語兩者。
11.如權(quán)利要求8所述的方法,其特征在于,提供一組原語包括提供用于銷毀線程的原 語、用于分叉線程的原語,或用于銷毀線程的原語和用于分叉線程的原語兩者。
12.如權(quán)利要求1所述的方法,其特征在于,編譯所述超級步包括內(nèi)聯(lián)對包含壁壘的 函數(shù)的調(diào)用,執(zhí)行優(yōu)化來降低數(shù)據(jù)依賴性,將CPU代碼和GPU代碼分開并生成內(nèi)核和內(nèi)核啟 動代碼,將對CPU變量的引用轉(zhuǎn)換為內(nèi)核參數(shù),尋找在定義超級步外部使用的值并生成保 存和加載這些值的代碼,以及生成臨時流分配。
13.—種在計算環(huán)境中的系統(tǒng),包括編譯器(108),所述編譯器(108)基于壁壘同步來 將包括語句、構(gòu)造和原語的源代碼處理成流內(nèi)核(Ioe1-Ioen),并且將所述內(nèi)核組合成能被 配置成供圖形處理單元(104)執(zhí)行的代碼。
14.如權(quán)利要求13所述的系統(tǒng),其特征在于,所述語句中的一個包括用于在所述源代 碼中定界超級步的barrier語句,并且所述構(gòu)造中的一個包括用于在所述源代碼中將控制 處理器代碼插入包含超級步中的require構(gòu)造,所述編譯器編譯所述源代碼以便在啟動對 應于所述包含超級步的指令之前執(zhí)行對應于所述控制處理器代碼的指令。
15.如權(quán)利要求13所述的系統(tǒng),其特征在于,所述原語包括reduce原語,scan原語, compact原語,split原語或sort原語,用于拆分線程的原語,用于對線程排序的原語,用于 銷毀線程的原語或用于分叉線程的原語,或reduce原語、scan原語、compact原語、split原語或sort原語、用于拆分線程的原語、用于對線程排序的原語、用于銷毀線程的原語或 用于分叉線程的原語的任意組合。
全文摘要
描述了計算環(huán)境中的一種技術,該技術包括用于圖形處理單元(GPU)上的通用計算的編程語言以及相關聯(lián)的編譯器。對批量同步GPU編程(BSGP)程序進行編程以包括壁壘來描述GPU上的并行處理。BSGP編譯器檢測響應于超級步(superstep)的壁壘(barrier),將BSGP程序轉(zhuǎn)換成基于壁壘的內(nèi)核,并將其進行組合。在編譯期間,編譯器對齊語句中的壁壘并將相應的超級步捆綁在一起。提供par構(gòu)造來允許程序員例如通過指定塊獨立語句來控制捆綁的各方面。提供了線程操縱仿真來透明地用操作fork(叉分)和kill(銷毀)仿真線程創(chuàng)建和銷毀。還提供了用于線程之間的高效通信的遠程變量訪問內(nèi)部函數(shù)以及集體原語操作。
文檔編號G06F9/38GK102132249SQ200980134286
公開日2011年7月20日 申請日期2009年6月26日 優(yōu)先權(quán)日2008年6月26日
發(fā)明者B·郭, H·齊明, K·周 申請人:微軟公司