專利名稱:頂點(diǎn)和片段程序的優(yōu)化鏈接的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)圖形學(xué)領(lǐng)域。
背景技術(shù):
許多計(jì)算機(jī)圖形圖像是通過從給定視點(diǎn)用三維場(chǎng)景對(duì)光的相互作用進(jìn)行數(shù)學(xué)建模來創(chuàng)建的。此過程(稱為渲染)從給定視點(diǎn)來看產(chǎn)生場(chǎng)景的二維圖像,且類似于拍攝真實(shí)世界場(chǎng)景的照片。
隨著對(duì)于計(jì)算機(jī)圖形且尤其是對(duì)于實(shí)時(shí)計(jì)算機(jī)圖形的需求增加,具有適于加速渲染過程的圖形處理子系統(tǒng)的計(jì)算機(jī)系統(tǒng)已變得普及。在這些計(jì)算機(jī)系統(tǒng)中,渲染過程在計(jì)算機(jī)的通用中央處理單元(CPU)與圖形處理子系統(tǒng)之間被劃分。通常CPU執(zhí)行高級(jí)運(yùn)算,例如確定給定場(chǎng)景中物體的位置、運(yùn)動(dòng)和碰撞。通過這些高級(jí)運(yùn)算,CPU產(chǎn)生界定期望的經(jīng)渲染圖像(一個(gè)或多個(gè))的一組渲染命令和數(shù)據(jù)。舉例來說,渲染命令和數(shù)據(jù)可為場(chǎng)景界定場(chǎng)景幾何形狀、照明、著色、紋理化、運(yùn)動(dòng)和/或攝影參數(shù)。圖形處理子系統(tǒng)通過所述組渲染命令和數(shù)據(jù)創(chuàng)建一個(gè)或一個(gè)以上經(jīng)渲染圖像。
許多圖形處理子系統(tǒng)為高度可編程的,從而能夠?qū)嵤?尤其是)復(fù)雜的照明和著色算法。為了開發(fā)此可編程性,應(yīng)用程序可包括一個(gè)或一個(gè)以上圖形處理子系統(tǒng)程序,其由圖形處理子系統(tǒng)執(zhí)行且與由CPU執(zhí)行的主程序并行執(zhí)行。盡管不限于僅實(shí)施著色和照明算法,但這些圖形處理子系統(tǒng)程序通常被稱為著色程序或著色器。
圖形處理子系統(tǒng)通常使用流處理模型,其中通過流處理單元的鏈來連續(xù)讀取和操作輸入元素。一個(gè)流處理單元的輸出是對(duì)鏈中下一流處理單元的輸入。通常,數(shù)據(jù)僅穿過流處理單元的鏈單向地向“下游”流動(dòng)。流處理單元的實(shí)例包括處理二維或三維頂點(diǎn)的頂點(diǎn)處理器、將由若干組二維或三維頂點(diǎn)界定的幾何圖元處理成若干組像素或子像素(稱為片段)的光柵化器處理器,和處理片段的片段處理器。鏈中可包括附加類型的流處理單元。舉例來說,鑲嵌處理器(tessellation processor)可接收高階表面的描述并產(chǎn)生若干組由頂點(diǎn)界定并近似于或?qū)?yīng)于所述高階表面的幾何圖元。
鏈中流處理單元中的一些或全部可為可編程的,其中每一可編程流處理單元具有其自己的單獨(dú)的著色程序,所述著色程序與在其它流處理單元上執(zhí)行的著色程序并行地操作。復(fù)雜算法的實(shí)施方案通常取決于為每一流處理單元定制的單獨(dú)著色程序,所述單獨(dú)著色程序一起工作以實(shí)現(xiàn)期望的結(jié)果。在這些實(shí)施方案中,鏈中初始流處理單元的著色程序的輸出可與鏈中后續(xù)流處理單元的著色程序的輸入相連系??捎枚喾N低級(jí)和高級(jí)編程語(yǔ)言編寫著色程序,所述編程語(yǔ)言包括低級(jí)匯編語(yǔ)言、Cg語(yǔ)言、OpenGL著色語(yǔ)言(OpenGL Shading Language),和DirectX高級(jí)著色語(yǔ)言。
需要優(yōu)化著色程序以改進(jìn)渲染性能并允許應(yīng)用程序完全開發(fā)圖形處理子系統(tǒng)的能力。當(dāng)用于不同流處理單元的著色程序鏈接在一起(在某些圖形API術(shù)語(yǔ)中可稱為連系)時(shí),可能存在基于兩個(gè)或兩個(gè)以上著色程序的組合進(jìn)行優(yōu)化(稱為著色器間的優(yōu)化)的機(jī)會(huì)。
舉例來說,第一著色程序可輸出一值,所述值未被圖形處理流中的第二鏈接著色程序用作輸入。在此實(shí)例中,第一著色程序的用于計(jì)算未使用的輸出的部分可被安全地省略,藉此減少第一著色程序的執(zhí)行時(shí)間。在另一實(shí)例中,如果第一著色程序的輸出為常數(shù),那么可將所述常數(shù)的值傳播到一鏈接到第一著色程序的第二著色程序的輸入,從而減少第一著色程序的執(zhí)行時(shí)間并潛在地允許第二著色程序內(nèi)的附加優(yōu)化。
另外,應(yīng)用程序開發(fā)人員期望針對(duì)每一流處理單元編寫較大的通用著色程序。每一通用著色程序允許應(yīng)用程序從在需要時(shí)將由流處理單元執(zhí)行的集合中選擇一個(gè)或一個(gè)以上運(yùn)算。應(yīng)用程序可通過從每一流處理單元的著色程序中選擇適當(dāng)運(yùn)算來在若干流處理單元上實(shí)施特定算法。使用具有針對(duì)每一流處理單元的可選擇運(yùn)算的較大通用著色程序,而不是使用每一者均實(shí)施單個(gè)操作的許多不同的較小著色程序,大大簡(jiǎn)化了應(yīng)用程序開發(fā)。不幸的是,即使當(dāng)將要僅執(zhí)行著色程序的一小部分時(shí),執(zhí)行較大通用著色程序也會(huì)由于許多因素而較緩慢,所述因素包括將較大著色程序轉(zhuǎn)移到圖形處理子系統(tǒng)所需的時(shí)間和帶寬。優(yōu)化著色程序的鏈接也可將這種較大程序簡(jiǎn)化到其適配在未經(jīng)優(yōu)化時(shí)原始程序可能不滿足的硬件資源限制內(nèi)的程度。
現(xiàn)有的自動(dòng)優(yōu)化技術(shù)僅孤立地考慮每一著色程序。針對(duì)硬件著色編譯器的現(xiàn)有優(yōu)化技術(shù)不會(huì)分析被分配到不同流處理單元的鏈接的著色程序之間的關(guān)系以確定著色器間的優(yōu)化。另外,這些現(xiàn)有優(yōu)化不考慮流處理單元的鏈中的單向數(shù)據(jù)流,且因此錯(cuò)過許多其它的潛在優(yōu)化。
因此需要基于鏈接的著色程序之間的關(guān)系來優(yōu)化鏈接在一起的兩個(gè)或兩個(gè)以上著色程序。進(jìn)一步需要優(yōu)化較大通用著色程序,以使其有效地執(zhí)行且不會(huì)不必要地將大量數(shù)據(jù)轉(zhuǎn)移到圖形處理子系統(tǒng)。還進(jìn)一步需要能夠在運(yùn)行時(shí)間執(zhí)行著色器間的優(yōu)化,從而允許應(yīng)用程序動(dòng)態(tài)地選擇著色程序的組合而不會(huì)降低性能。
發(fā)明內(nèi)容
本發(fā)明的一實(shí)施例是一種用于基于在流處理程序之間交換的數(shù)據(jù)來優(yōu)化兩個(gè)或兩個(gè)以上流處理程序的系統(tǒng)。所述系統(tǒng)交替地處理每一流處理程序以識(shí)別并去除失效程序代碼,藉此改進(jìn)執(zhí)行性能。通過傳播作為來自其它流處理程序的輸入而接收到的常數(shù)且通過分析第一流處理程序并確定第二流處理程序的未被所述第一流處理程序使用的輸出來識(shí)別失效程序代碼。所述系統(tǒng)可執(zhí)行此優(yōu)化的多次重復(fù),因?yàn)橄惹暗闹貜?fù)引入了用作對(duì)流處理程序的輸入的附加常數(shù)。在流處理程序的優(yōu)化之后,將經(jīng)優(yōu)化的流處理程序編譯為適于由流處理系統(tǒng)執(zhí)行的格式。
本發(fā)明的一實(shí)施例是一種優(yōu)化適于由流處理系統(tǒng)執(zhí)行的流處理程序的方法。所述流處理系統(tǒng)包括第一和第二可編程流處理單元。所述第二流處理單元與所述第一流處理單元連接,使得第一流處理單元的輸出適于作為第二流處理單元的輸入。
所述方法包括接收適于由第一流處理單元執(zhí)行的第一流處理程序。所述第一流處理程序包括輸出參數(shù)。所述方法還接收適于由第二流處理單元執(zhí)行的第二流處理程序。所述第二流處理程序包括對(duì)應(yīng)于第一流處理程序的輸出參數(shù)的輸入?yún)?shù)?;诘诙魈幚沓绦虻妮斎?yún)?shù)與第一流處理程序的輸出參數(shù)之間的對(duì)應(yīng)來優(yōu)化第一和第二流處理程序。
在一實(shí)施例中,優(yōu)化第一和第二流處理程序包括從第一流處理程序中消除適于計(jì)算未被第二流處理程序使用的附加輸出參數(shù)的失效程序代碼。在另一實(shí)施例中,優(yōu)化第一和第二流處理程序包括響應(yīng)于第一流處理程序的輸出參數(shù)是常數(shù)的確定來傳播用于第二流處理程序的輸入?yún)?shù)的常數(shù)值,和從第二流處理程序中消除由于傳播常數(shù)值而被致使為冗余的失效程序代碼。
在又一實(shí)施例中,優(yōu)化第一和第二流處理程序包括響應(yīng)于第一流處理程序的輸出參數(shù)是統(tǒng)一值的確定來傳播用于第二流處理程序的輸入?yún)?shù)的統(tǒng)一值,和從第二流處理程序中消除由于傳播統(tǒng)一值而被致使為冗余的失效程序代碼。統(tǒng)一值是著色語(yǔ)言中的專門術(shù)語(yǔ),其指的是雖然在處理圖形圖元流期間不允許變化但可在批量的所述串流數(shù)據(jù)之間改變值的常數(shù)。在很大程度上,可將統(tǒng)一值視為如同用于優(yōu)化目的的常數(shù)值,例如常數(shù)合并(在編譯時(shí)將具有常數(shù)項(xiàng)的表達(dá)式縮減為較簡(jiǎn)單的常數(shù)表達(dá)式)。然而,如果編譯器基于知道統(tǒng)一值的值來作出優(yōu)化決定(例如決定批量的結(jié)果),那么在新的統(tǒng)一值將改變較早的優(yōu)化決定時(shí)有必要進(jìn)行再優(yōu)化。
流處理系統(tǒng)的一實(shí)施例駐存在圖形處理子系統(tǒng)內(nèi)。在此實(shí)施例中,可編程流處理單元可為可編程頂點(diǎn)處理器、可編程鑲嵌處理器,或可編程片段處理器。
將參看附圖描述本發(fā)明,附圖中圖1是適于實(shí)踐本發(fā)明實(shí)施例的計(jì)算機(jī)系統(tǒng)的方框圖;圖2說明適于實(shí)施本發(fā)明實(shí)施例的圖形處理子系統(tǒng)的流處理單元的示范性鏈;圖3說明根據(jù)本發(fā)明實(shí)施例優(yōu)化一對(duì)鏈接的著色程序的方法;圖4A和4B說明一對(duì)示范性鏈接的著色程序的未經(jīng)優(yōu)化的形式;圖5A和5B說明根據(jù)本發(fā)明實(shí)施例在優(yōu)化方法的第一次重復(fù)之后的一對(duì)示范性鏈接的著色程序;圖6A和6B說明根據(jù)本發(fā)明實(shí)施例在優(yōu)化方法的第二次重復(fù)之后的一對(duì)示范性鏈接的著色程序;和圖7說明適于實(shí)施本發(fā)明實(shí)施例的著色語(yǔ)言結(jié)構(gòu)。
附圖中,使用相似參考標(biāo)號(hào)表示相同組件。
具體實(shí)施例方式
圖1是適于實(shí)踐本發(fā)明實(shí)施例的計(jì)算機(jī)系統(tǒng)100的方框圖,計(jì)算機(jī)系統(tǒng)100例如可為個(gè)人計(jì)算機(jī)、視頻游戲控制臺(tái)、個(gè)人數(shù)字助理或其它數(shù)字裝置。計(jì)算機(jī)系統(tǒng)100包括中央處理單元(CPU)105,其用于運(yùn)行軟件應(yīng)用程序并視需要而運(yùn)行-操作系統(tǒng)。在一實(shí)施例中,CPU 105實(shí)際上是并行操作的若干單獨(dú)的中央處理單元。存儲(chǔ)器110存儲(chǔ)應(yīng)用程序和數(shù)據(jù)供CPU 105使用。存儲(chǔ)裝置115為應(yīng)用程序和數(shù)據(jù)提供非易失性存儲(chǔ),且可包括固定磁盤驅(qū)動(dòng)器、活動(dòng)磁盤驅(qū)動(dòng)器、快閃存儲(chǔ)器裝置和CD-ROM、DVD-ROM,或其它光學(xué)存儲(chǔ)裝置。用戶輸入裝置120將來自一個(gè)或一個(gè)以上用戶的用戶輸入傳送到計(jì)算機(jī)系統(tǒng)100,且可包括鍵盤、鼠標(biāo)、操縱桿、觸摸屏和/或麥克風(fēng)。網(wǎng)絡(luò)接口125允許計(jì)算機(jī)系統(tǒng)100經(jīng)由電子通信網(wǎng)絡(luò)與其它計(jì)算機(jī)系統(tǒng)通信,且可包括在局域網(wǎng)和廣域網(wǎng)(例如因特網(wǎng))上的有線或無線通信。計(jì)算機(jī)系統(tǒng)100的組件(包括CPU 105、存儲(chǔ)器110、數(shù)據(jù)存儲(chǔ)裝置115、用戶輸入裝置120和網(wǎng)絡(luò)接口125)經(jīng)由一個(gè)或一個(gè)以上數(shù)據(jù)總線160而連接。數(shù)據(jù)總線的實(shí)例包括ISA、PCI、AGP、PCI、PCI-X(也稱為3GIO)和超傳輸(HyperTransport)數(shù)據(jù)總線。
圖形子系統(tǒng)130進(jìn)一步與數(shù)據(jù)總線160和計(jì)算機(jī)系統(tǒng)100的組件連接。圖形子系統(tǒng)130包括圖形處理單元(GPU)135和圖形存儲(chǔ)器。圖形存儲(chǔ)器包括顯示存儲(chǔ)器140(例如,幀緩沖器),其用于存儲(chǔ)一輸出圖像的每一像素的像素?cái)?shù)據(jù)??芍苯訌腃PU 105將像素?cái)?shù)據(jù)提供到顯示存儲(chǔ)器140。或者,CPU 105向GPU 135提供界定期望的輸出圖像的數(shù)據(jù)和/或命令,GPU 135從這些數(shù)據(jù)和/或命令中產(chǎn)生一個(gè)或一個(gè)以上輸出圖像的像素?cái)?shù)據(jù)。界定期望的輸出圖像的數(shù)據(jù)和/或命令存儲(chǔ)在附加存儲(chǔ)器145中。在一實(shí)施例中,GPU135從界定一場(chǎng)景的幾何形狀、照明、著色、紋理化、運(yùn)動(dòng)和/或攝影參數(shù)的渲染命令和數(shù)據(jù)來產(chǎn)生用于輸出圖像的像素?cái)?shù)據(jù)。
在另一實(shí)施例中,顯示存儲(chǔ)器140和/或附加存儲(chǔ)器145是存儲(chǔ)器110的一部分,且與CPU 105共享。或者,顯示存儲(chǔ)器140和/或附加存儲(chǔ)器145是一個(gè)或一個(gè)以上為專用于圖形子系統(tǒng)130而提供的單獨(dú)的存儲(chǔ)器。圖形子系統(tǒng)130周期性地輸出用于一圖像的像素?cái)?shù)據(jù),所述圖像來自顯示存儲(chǔ)器140且顯示在顯示裝置150上。顯示裝置150是能夠響應(yīng)于來自計(jì)算機(jī)系統(tǒng)100的信號(hào)而顯示視覺信息的任何裝置,包括CRT、LCD、等離子和OLED顯示器。計(jì)算機(jī)系統(tǒng)100可向顯示裝置150提供模擬或數(shù)字信號(hào)。
在又一實(shí)施例中,圖形處理子系統(tǒng)130包括一個(gè)或一個(gè)以上類似于GPU 135的附加GPU 155。在另外又一實(shí)施例中,圖形處理子系統(tǒng)130包括圖形協(xié)處理器165。圖形處理協(xié)處理器165和附加GPU 155適于與GPU 135并行地操作。類似于GPU 135,附加GPU155從渲染命令來產(chǎn)生用于輸出圖像的像素?cái)?shù)據(jù)。附加GPU 155可聯(lián)合GPU 135而操作,以同時(shí)產(chǎn)生用于一輸出圖像的不同部分的像素?cái)?shù)據(jù),或同時(shí)產(chǎn)生用于不同輸出圖像的像素?cái)?shù)據(jù)。在一實(shí)施例中,圖形協(xié)處理器165執(zhí)行針對(duì)GPU 135和/或附加GPU 155的有關(guān)渲染的任務(wù),例如幾何形狀變換、著色器計(jì)算和背面剔除(backface culling)操作。
附加GPU 155可與GPU 135位于同一電路板上并與GPU 135共享與數(shù)據(jù)總線160的連接,或者可位于單獨(dú)地與數(shù)據(jù)總線160連接的附加電路板上。附加GPU 155也可與GPU 135集成在同一模塊或芯片封裝中。附加GPU 155可具有其自己的顯示存儲(chǔ)器和附加存儲(chǔ)器(類似于顯示存儲(chǔ)器140和附加存儲(chǔ)器145),或可與GPU 135共享存儲(chǔ)器140和145。在一實(shí)施例中,圖形協(xié)處理器165與計(jì)算機(jī)系統(tǒng)芯片組(未圖示)集成,例如與用于控制數(shù)據(jù)總線160的北橋(Northbridge)或南橋(Southbridge)芯片集成。
圖2說明適于實(shí)施本發(fā)明實(shí)施例的圖形處理子系統(tǒng)的流處理單元的示范性鏈200。流處理單元的鏈200使用流處理模型,其中由流處理單元的鏈200連續(xù)讀取并操作輸入元素。鏈200的每個(gè)流處理單元均可對(duì)鏈中的前一個(gè)流處理單元的輸出進(jìn)行操作。如下文詳細(xì)論述,所述流處理單元中的某些或全部可為可編程的??删幊塘魈幚韱卧x取一輸入元素,使用所述輸入元素執(zhí)行程序,并將結(jié)果輸出到鏈中的下一個(gè)流處理單元。每一流處理單元可具有其自己的獨(dú)立地操作或與另一流處理單元程序結(jié)合操作的單獨(dú)程序。
輸入流205包括用于界定期望的經(jīng)渲染圖像(一個(gè)或多個(gè))的渲染命令和數(shù)據(jù),包括針對(duì)一場(chǎng)景的幾何形狀、照明、著色、紋理化、運(yùn)動(dòng)和/或攝影參數(shù)。頂點(diǎn)處理器210從輸入流205讀取每一渲染命令和任何相關(guān)聯(lián)的數(shù)據(jù)。渲染數(shù)據(jù)可包括一個(gè)或一個(gè)以上未變換的頂點(diǎn)。頂點(diǎn)處理器210對(duì)每一未變換的頂點(diǎn)執(zhí)行頂點(diǎn)程序(也被稱為頂點(diǎn)著色器)以產(chǎn)生變換的頂點(diǎn)。頂點(diǎn)處理器210是可編程的,且渲染應(yīng)用程序可規(guī)定待用于任何給定組的頂點(diǎn)的頂點(diǎn)程序。在一簡(jiǎn)單的實(shí)施例中,頂點(diǎn)程序?qū)㈨旤c(diǎn)從三維世界坐標(biāo)系統(tǒng)變換到二維屏幕坐標(biāo)系統(tǒng)??墒褂酶鼜?fù)雜的頂點(diǎn)程序來實(shí)施多種視覺效應(yīng),包括照明和著色、程序的幾何圖形和動(dòng)畫操作。
變換的頂點(diǎn)從頂點(diǎn)處理器210傳到光柵化級(jí)(rasterization stage)215。光柵化級(jí)215將一個(gè)或一個(gè)以上頂點(diǎn)聚集成一幾何圖元,例如點(diǎn)、線、三角形或四邊形。接著光柵化級(jí)215將每一幾何圖元轉(zhuǎn)換成一個(gè)或一個(gè)以上像素片斷。像素片斷提供狀態(tài)以更新一組將可能顯示在經(jīng)渲染圖像中的一個(gè)或一個(gè)以上像素,所述像素由所述像素片斷“覆蓋”。每一像素片斷均具有相關(guān)聯(lián)的輸入?yún)?shù),例如屏幕位置、紋理坐標(biāo)、顏色值和法向量。
接著像素片斷從光柵化級(jí)215傳到片斷處理器220。片斷處理器220使用與每一像素片斷相關(guān)聯(lián)的信息來確定將可能顯示的每一像素的輸出顏色值。類似于頂點(diǎn)處理器210,片斷處理器是可編程的。對(duì)每一像素片斷執(zhí)行像素片斷程序(也被稱為像素著色器)來確定用于像素的輸出顏色值。盡管像素片斷獨(dú)立于頂點(diǎn)程序而操作,但像素片斷程序可依賴于由前一個(gè)流處理單元產(chǎn)生或通過前一個(gè)流處理單元的信息,包括由頂點(diǎn)程序產(chǎn)生的信息。渲染應(yīng)用程序可規(guī)定待用于任何給定組的像素片斷的像素片斷程序??墒褂孟袼仄瑪喑绦騺韺?shí)施多種視覺效應(yīng),包括照明和著色效應(yīng)、反射、紋理映射和程序紋理產(chǎn)生。另外,可采用頂點(diǎn)程序與像素片斷程序用于例如通用計(jì)算、圖像處理和信號(hào)處理的非視覺目的。
接著將所述組像素輸出到光柵操作與存儲(chǔ)級(jí)225。光柵操作級(jí)225將所述組像素與經(jīng)渲染圖像集成。像素可為具有先前寫入到經(jīng)渲染圖像的像素的經(jīng)混合或遮罩的像素。可使用深度緩沖器、alpha緩沖器和模板緩沖器來確定每一傳入的像素對(duì)經(jīng)渲染圖像的作用(如果存在)。接著將每一傳入的像素與任何先前存儲(chǔ)的像素值的組合輸出到幀緩沖器作為經(jīng)渲染圖像的一部分。
盡管在圖2的實(shí)例中未圖示,但在流處理單元的鏈200中可包括附加類型的流處理單元。舉例來說,鑲嵌處理器(tessellation processor)可接收高階表面的描述并產(chǎn)生若干組幾何圖元,所述幾何圖元由頂點(diǎn)界定且接近或?qū)?yīng)于所述高階表面。接著可在下游由流處理單元處理所述若干組幾何圖元及其相關(guān)頂點(diǎn),所述流處理單元例如為如上文討論的頂點(diǎn)處理器、光柵化器和片斷處理器。
圖3說明根據(jù)本發(fā)明實(shí)施例的用于優(yōu)化一對(duì)鏈接的著色程序的方法300。在步驟303處,對(duì)兩個(gè)鏈接的著色程序的優(yōu)化開始。在一實(shí)施例中,應(yīng)用程序?qū)蓚€(gè)著色程序傳送到運(yùn)行時(shí)間模塊,所述運(yùn)行時(shí)間模塊將每一著色程序編譯成中間數(shù)據(jù)格式以便進(jìn)行優(yōu)化。在又一實(shí)施例中,可用不同的編程語(yǔ)言來表達(dá)每一著色程序,且運(yùn)行時(shí)間模塊可采用適于每一著色程序語(yǔ)言的編譯器來產(chǎn)生呈所需中間數(shù)據(jù)格式的一個(gè)版本的著色程序。在一替代實(shí)施例中,運(yùn)行時(shí)間模塊的全部或一部分與裝置驅(qū)動(dòng)程序集成。
對(duì)于方法300,應(yīng)用程序可顯式地規(guī)定兩個(gè)著色程序是(例如)通過經(jīng)由API調(diào)用與運(yùn)行時(shí)間模塊通信而鏈接的或“連系的”?;蛘?,運(yùn)行時(shí)間模塊可隱式地確定兩個(gè)著色程序是否是連系的。舉例來說,運(yùn)行時(shí)間模塊可對(duì)將由圖形處理子系統(tǒng)的各個(gè)流處理單元執(zhí)行的著色程序進(jìn)行分析,以確定第一著色程序的任何輸出是否用作對(duì)第二著色程序的輸入。
將方法300劃分為兩個(gè)階段,下游階段305和上游階段320。如下文詳細(xì)討論,方法300重復(fù)下游階段305到上游階段320,直到完全找到兩個(gè)著色程序中全部的著色器間的優(yōu)化。下游階段305優(yōu)化將在流處理單元的鏈中另一鏈接的著色程序的“下游”執(zhí)行的著色程序。相反,方法300的上游階段320優(yōu)化將在流處理單元的鏈中“下游”著色程序的“上游”執(zhí)行的著色程序。舉例來說,在圖2說明的流處理單元的示范性鏈200中,由片斷處理器220執(zhí)行的片斷著色程序?qū)⒈灰暈樘幵谟身旤c(diǎn)處理器210執(zhí)行的頂點(diǎn)程序的“下游”。在此實(shí)例中,如果頂點(diǎn)著色程序與片斷著色程序是鏈接的,那么方法300的下游階段305將優(yōu)化片斷著色程序,且方法300的上游階段320將優(yōu)化頂點(diǎn)著色程序。
方法300的下游階段305以步驟307開始,其中下游著色程序的入口函數(shù)。下游著色程序的入口函數(shù)是流處理單元開始執(zhí)行下游著色程序的地方。入口函數(shù)的輸入和輸出參數(shù)也被識(shí)別。
在步驟309處,方法300基于下游著色程序輸出來確定有用代碼。在一實(shí)施例中,步驟309使用數(shù)據(jù)流分析以從下游著色程序的輸出向后到下游著色程序的入口函數(shù)來跟蹤程序執(zhí)行。將確定下游著色程序輸出所涉及的下游著色程序的部分指定為有用代碼。為了確保優(yōu)化不影響下游著色程序的輸出,數(shù)據(jù)流分析在指定有用代碼方面必須是保守的。如果兩個(gè)或兩個(gè)以上交替的執(zhí)行分支可用于確定下游著色程序輸出,那么必須將所有這些執(zhí)行分支指定為有用代碼。數(shù)據(jù)流依賴性分析也必須正確地說明循環(huán)結(jié)構(gòu)和程序調(diào)用。
在步驟311處,執(zhí)行常數(shù)傳播(constant propagation)。常數(shù)傳播識(shí)別任何作為常數(shù)的程序參數(shù),并將這些程序參數(shù)的值傳播通過下游著色程序,以預(yù)先計(jì)算附加程序參數(shù)值或預(yù)先選擇執(zhí)行分支(如果可能)。舉例來說,如果從一個(gè)或一個(gè)以上程序參數(shù)計(jì)算下游著色程序,且步驟311確定這些程序參數(shù)中的一個(gè)或一個(gè)以上程序參數(shù)具有常數(shù)值,那么可預(yù)先計(jì)算下游著色程序輸出的中間值或最終值(有時(shí)被稱為導(dǎo)出常數(shù)或統(tǒng)一值)。在另一實(shí)例中,如果使用一個(gè)或一個(gè)以上程序參數(shù)來選擇下游著色程序的執(zhí)行分支,且步驟311確定這些程序參數(shù)中的一個(gè)或一個(gè)以上程序參數(shù)具有已知的常數(shù)值,那么可預(yù)先選擇適當(dāng)?shù)膱?zhí)行分支以供執(zhí)行。
方法300的步驟313識(shí)別并消除失效代碼。失效代碼是下游著色程序的在確定下游著色程序輸出時(shí)未涉及的部分,即下游著色程序的在步驟309中未被指定為有用代碼的部分。失效代碼還包括下游著色程序的由步驟311的常數(shù)傳播使其變?yōu)槿哂嗟牟糠?。這包括(例如)下游著色程序的用于計(jì)算已用步驟311中預(yù)先計(jì)算的常數(shù)替換的程序參數(shù)的部分。另外,失效代碼可包括(例如)下游著色程序的在步驟311中未被預(yù)先選擇用于執(zhí)行的交替的執(zhí)行分支。接著步驟313從下游著色程序中去除失效代碼,藉此改進(jìn)性能并減小下游著色程序的大小。
步驟315從下游著色程序的剩余部分中確定下游著色程序的影響下游著色程序輸出的輸入。如下文討論,稍后在步驟325中使用這組下游程序輸入。
步驟333、335和337在邏輯上是獨(dú)立的,因此可以任意次序執(zhí)行或并行地執(zhí)行。
在步驟315結(jié)束時(shí)和下游階段305重復(fù)時(shí),上游階段320的重復(fù)以步驟323開始以優(yōu)化上游著色程序。步驟323確定上游著色程序的入口函數(shù)。上游著色程序的入口函數(shù)是流處理單元開始執(zhí)行上游著色程序的地方。入口函數(shù)的輸入和輸出參數(shù)也被識(shí)別。
方法300的步驟325基于上游著色程序輸出子集來確定有用代碼。上游著色程序輸出子集是對(duì)應(yīng)于在步驟315中識(shí)別的下游程序輸入集合的上游著色程序輸出的全部或一部分。在一實(shí)施例中,步驟325使用數(shù)據(jù)流分析以從上游著色程序輸出子集向后到上游著色程序的入口函數(shù)來跟蹤程序執(zhí)行。將在確定上游著色程序輸出子集時(shí)所涉及的上游著色程序的部分指定為有用代碼。在計(jì)算上游著色程序輸出子集時(shí)未使用的上游著色程序的部分(包括在計(jì)算并非所述上游著色程序輸出子集的一部分的其它上游著色程序輸出時(shí)使用的上游著色程序的部分)不被指定為有用代碼。為了確保優(yōu)化不影響上游著色程序的輸出,數(shù)據(jù)流分析在指定有用代碼方面必須是保守的。如果兩個(gè)或兩個(gè)以上交替的執(zhí)行分支可用于確定上游著色程序輸出子集,那么必須將所有這些執(zhí)行分支指定為有用代碼。數(shù)據(jù)流依賴性分析也必須正確地說明循環(huán)結(jié)構(gòu)和程序調(diào)用。
在步驟327,執(zhí)行常數(shù)傳播。常數(shù)傳播識(shí)別任何作為常數(shù)的程序參數(shù),并將這些程序參數(shù)的值傳播通過上游著色程序,以預(yù)先計(jì)算附加程序參數(shù)值或預(yù)先選擇執(zhí)行分支(如果可能)。作為一實(shí)例,如果從一個(gè)或一個(gè)以上由步驟327確定為具有常數(shù)值的程序參數(shù)計(jì)算上游著色程序輸出,那么步驟327的常數(shù)傳播可預(yù)先計(jì)算上游著色程序輸出的中間值或最終值。作為另一實(shí)例,如果步驟327確定一個(gè)或一個(gè)以上用于選擇適當(dāng)?shù)膱?zhí)行分支的程序參數(shù)是常數(shù),那么,那么步驟327可預(yù)先選擇若干交替的程序分支中的一者以供執(zhí)行。
方法300的步驟329識(shí)別并消除上游程序中的失效代碼。類似于上文所討論,失效代碼是上游著色程序的在確定上游著色程序輸出子集時(shí)未涉及的部分。這包括上游著色程序的在步驟325中未被指定為有用代碼的部分。失效代碼還包括上游著色程序的由步驟327的常數(shù)傳播使其變?yōu)槿哂嗟牟糠?,例如上游著色程序的用于?jì)算已用預(yù)先計(jì)算的常數(shù)替換的程序參數(shù)的部分,和上游著色程序的未被預(yù)先選擇用于執(zhí)行的交替的執(zhí)行分支。步驟329從上游著色程序中去除失效代碼,藉此改進(jìn)執(zhí)行性能并減小上游著色程序的大小。
步驟331確定是否需要進(jìn)一步重復(fù)下游階段305和上游階段320以優(yōu)化上游和下游著色程序。步驟331確定上游著色程序輸出的子集中的任一者是否為先前沒有被步驟311分析為下游著色程序的具有常數(shù)值的輸入的常數(shù)。如果上游著色程序輸出的子集中的任一者是先前未被步驟311分析的常數(shù),那么方法300繼續(xù)進(jìn)行步驟317。
步驟317將步驟331中識(shí)別的上游程序輸出的子集中的具有常數(shù)值的輸出與相應(yīng)的下游著色程序輸入進(jìn)行匹配。接著將這些下游著色程序輸入指定為具有常數(shù)值的下游著色程序輸入。方法300的下游階段305接著重復(fù),以步驟311開始。在步驟311的第二次以及隨后的重復(fù)中,用步驟317中指定的具有常數(shù)值的下游著色程序輸入來執(zhí)行常數(shù)傳播。步驟311將可能導(dǎo)致下游著色程序的附加部分變?yōu)槿哂啵缬糜谟?jì)算具有常數(shù)值的下游程序輸出或中間值和用于未使用的執(zhí)行分支的代碼。接著步驟315消除下游著色程序的這些附加冗余部分,藉此進(jìn)一步改進(jìn)執(zhí)行性能并減小下游著色程序的程序大小。
從下游著色程序中消除失效代碼可能減少下游著色程序輸出的數(shù)目,這進(jìn)而減少了所使用的下游著色程序輸入的數(shù)目。下游著色程序輸入的數(shù)目減少可使得某些相應(yīng)的上游著色程序輸出變得不必要,且因此使得上游著色程序本身的又一些部分變得不必要,因此允許進(jìn)一步優(yōu)化上游著色程序。
為此,在步驟311和313的附加重復(fù)之后,步驟315從下游著色程序的剩余部分中確定下游著色程序的影響下游著色程序輸出的輸入。在步驟315之后,執(zhí)行方法300的上游階段320的附加重復(fù),其中在步驟315中識(shí)別的下游程序輸入的子集用作步驟325中上游程序輸出的子集。執(zhí)行方法300的上游階段320的附加重復(fù)以進(jìn)一步優(yōu)化上游著色程序。使用在步驟315的最近重復(fù)中識(shí)別的下游程序輸入的子集來重復(fù)步驟323、325、327和328。這可能導(dǎo)致上游著色程序的附加冗余代碼的識(shí)別和消除。因此,進(jìn)一步改進(jìn)了上游著色程序的執(zhí)行性能,同時(shí)進(jìn)一步減小了上游著色程序的大小。
如上文討論,步驟331確定是否需要進(jìn)一步重復(fù)下游階段305和上游階段320以優(yōu)化上游和下游著色程序。如果上游著色程序輸出的子集中的任一者是先前未被步驟311分析的常數(shù),那么方法300繼續(xù)進(jìn)行步驟317和下游階段305與上游階段320的附加重復(fù)。否則,方法300進(jìn)行到步驟333。
步驟333將經(jīng)優(yōu)化的下游著色程序從其中間數(shù)據(jù)格式轉(zhuǎn)換成能夠由流處理單元執(zhí)行的可執(zhí)行格式。在一實(shí)施例中,所述可執(zhí)行格式是為流處理單元的特定硬件結(jié)構(gòu)定制的匯編語(yǔ)言或機(jī)器語(yǔ)言代碼的形式。步驟333也可執(zhí)行對(duì)下游著色程序的附加優(yōu)化,例如循環(huán)展開(loop unrolling)。與上文討論的優(yōu)化不同,這些附加優(yōu)化是基于流處理單元的硬件結(jié)構(gòu),而不是下游著色程序與上游著色程序之間的關(guān)系。
類似地,步驟335將經(jīng)優(yōu)化的上游著色程序從其中間數(shù)據(jù)格式轉(zhuǎn)換成能夠由流處理單元執(zhí)行的可執(zhí)行格式。在一實(shí)施例中,所述可執(zhí)行格式是為流處理單元的特定硬件結(jié)構(gòu)定制的匯編語(yǔ)言或機(jī)器語(yǔ)言代碼的形式。步驟335也可執(zhí)行對(duì)下游著色程序的附加優(yōu)化,例如循環(huán)展開。與上文討論的優(yōu)化不同,這些附加優(yōu)化是基于流處理單元的硬件結(jié)構(gòu),而不是下游著色程序與上游著色程序之間的關(guān)系。
步驟337確定影響經(jīng)優(yōu)化的上游著色程序的輸出的上游著色程序輸入。如果在確定經(jīng)優(yōu)化的上游著色程序的輸出時(shí)存在未使用的上游著色程序輸入,那么步驟337消除用于從存儲(chǔ)器中獲取這些輸入的代碼。這種進(jìn)一步的優(yōu)化防止浪費(fèi)存儲(chǔ)器帶寬來獲取未使用的輸入值。接著步驟339將經(jīng)優(yōu)化的上游和下游著色程序傳送到其各自的流處理單元以供執(zhí)行。
在又一實(shí)施例中,可擴(kuò)展方法300以按順序優(yōu)化任意數(shù)目的鏈接的著色程序。這個(gè)實(shí)施例從待優(yōu)化的鏈接的著色程序集合中選擇一對(duì)兩個(gè)鏈接的著色程序。對(duì)于所述對(duì)選定的鏈接的著色程序,這個(gè)實(shí)施例執(zhí)行上文討論的步驟303到331,可能導(dǎo)致一對(duì)簡(jiǎn)化的程序。這個(gè)實(shí)施例接著從待優(yōu)化的鏈接的著色程序集合中選擇另一對(duì)鏈接的著色程序,并針對(duì)新選擇的所述對(duì)鏈接的著色程序再次重復(fù)步驟303到331。針對(duì)若干對(duì)鏈接的著色程序的所有可能組合進(jìn)一步重復(fù)步驟303到331,直到不可能進(jìn)行進(jìn)一步優(yōu)化為止。此時(shí),可針對(duì)所有著色程序按順序執(zhí)行步驟333、335和337中的硬件代碼產(chǎn)生和輸入消除。應(yīng)注意,這個(gè)實(shí)施例中的所述若干對(duì)鏈接的著色程序不一定是互斥的。舉例來說,可用兩個(gè)或兩個(gè)以上下游著色程序鏈接成單個(gè)上游著色程序,或者第一對(duì)鏈接的著色程序中的下游著色程序可為第二對(duì)鏈接的著色程序中的上游著色程序。
在又一實(shí)施例中,方法300可優(yōu)化鏈接的著色程序以獲得統(tǒng)一值。統(tǒng)一值是著色語(yǔ)言中的專門術(shù)語(yǔ),其指的是在處理給定數(shù)據(jù)流期間保持為常數(shù)但在所述串流數(shù)據(jù)的批量之間可能改變值的值??捎门c上文討論的針對(duì)常數(shù)值的優(yōu)化類似的方式執(zhí)行優(yōu)化統(tǒng)一值。舉例來說,除了常數(shù)值之外,還可如所描述對(duì)統(tǒng)一值執(zhí)行步驟311、317、327和331。然而,如果由于統(tǒng)一值傳播而識(shí)別和消除了失效代碼,那么當(dāng)統(tǒng)一值的改變導(dǎo)致鏈接的著色程序的不同部分變?yōu)槭Тa時(shí),必須再優(yōu)化鏈接的著色程序。
方法300的操作在圖4到6中說明,其展示方法300對(duì)示范性上游和下游著色程序的效果。表1和2分別說明用OpenGL著色語(yǔ)言編寫的但也可用另一語(yǔ)言編寫的鏈接的片段著色程序與頂點(diǎn)著色程序的未經(jīng)優(yōu)化的源代碼。表1的片段著色程序界定許多程序變量,包括五個(gè)統(tǒng)一標(biāo)量變量、四個(gè)變化的標(biāo)量變量和一個(gè)變化的向量變量。類似地,表2的頂點(diǎn)著色程序界定三個(gè)統(tǒng)一標(biāo)量變量和三個(gè)變化的標(biāo)量變量。在此實(shí)例中,片段著色程序與頂點(diǎn)著色程序兩者均包括變化的變量“varying1”、“varying2”和“varying3”。當(dāng)這兩個(gè)著色程序鏈接在一起時(shí),當(dāng)執(zhí)行下游片段著色程序時(shí)在上游頂點(diǎn)著色程序中確定的這些共同變量的值被轉(zhuǎn)入。表1和2中統(tǒng)一變量之后的注釋指示在優(yōu)化期間假定的這些統(tǒng)一值的值。
表1-示范性片段著色程序
表2-示范性頂點(diǎn)著色程序圖4A、4B、5A、5B、6A和6B使用數(shù)據(jù)流格式來說明一對(duì)示范性鏈接的著色程序的優(yōu)化。所述數(shù)據(jù)流格式展示著色程序輸出與用于計(jì)算這些輸出的輸入變量和運(yùn)算之間的關(guān)聯(lián)。圖4A和4B說明表1和2的一對(duì)示范性鏈接的著色程序的未經(jīng)優(yōu)化的形式。
圖4A說明表1的示范性片段著色程序的一部分的數(shù)據(jù)流圖400。數(shù)據(jù)流圖400展示用統(tǒng)一變量407、409、411、413、431和433與變化的變量415、417、419、420和421的組合來形成輸出變量405。數(shù)據(jù)流圖400還包括基于統(tǒng)一變量與變化的變量?jī)烧叩臈l件分支語(yǔ)句425和427,以及完全從統(tǒng)一變量導(dǎo)出的表達(dá)式,例如表達(dá)式430、432和434。
類似于圖4A,圖4B說明表2的示范性頂點(diǎn)著色程序的數(shù)據(jù)流圖450。數(shù)據(jù)流圖450展示示范性頂點(diǎn)著色程序的輸出變量455、457、459、461、463和465及其與輸入變量的關(guān)系。如上文討論,當(dāng)表1和2的示范性著色程序鏈接在一起時(shí),輸出變量“varying1”455、“varying2”457和“varying3”459和“varying4”461對(duì)應(yīng)于在圖4A中為了清楚起見而省略的片段著色程序輸入變量“varying1”415、“varying2”417和“varying3”419和“varying4”420。應(yīng)注意在此實(shí)例中,頂點(diǎn)著色程序的某些輸出變量沒有被鏈接的片段著色程序使用,例如“varying5”463;然而這些輸出變量可能會(huì)被與示范性頂點(diǎn)著色程序鏈接的其它下游著色程序使用。另外,數(shù)據(jù)流圖450展示輸入屬性470、472和474。與其它變量不同,屬性是與由著色程序處理的每一數(shù)據(jù)項(xiàng)(例如,頂點(diǎn))相關(guān)聯(lián)的參數(shù)。
在通過步驟305到步驟331的第一重復(fù)來處理示范性鏈接的著色程序之后,示范性著色程序的復(fù)雜性大體上減小。表3和4說明在步驟307到331的第一重復(fù)之后所述對(duì)示范性鏈接的著色程序的源代碼。圖5A和5B說明呈數(shù)據(jù)流格式的這些示范性鏈接的著色程序。
表3-第一次優(yōu)化重復(fù)之后的示范性片段著色程序
表4-第一次優(yōu)化重復(fù)之后的示范性頂點(diǎn)著色程序圖5A說明數(shù)據(jù)流圖500,其對(duì)應(yīng)于表3的經(jīng)優(yōu)化的片段著色程序。比較數(shù)據(jù)流圖400與500,可以看到在步驟307到331的第一重復(fù)之后,由于條件分支425語(yǔ)句對(duì)統(tǒng)一變量407的值的依賴性,因此已將條件分支425語(yǔ)句消除,對(duì)于一批量數(shù)據(jù)來說,所述統(tǒng)一變量407是常數(shù)。另外,可用等于432的導(dǎo)出的統(tǒng)一變量505來替換統(tǒng)一變量411和413。在此實(shí)例中,用等于表達(dá)式434的值的導(dǎo)出的統(tǒng)一值507替換包括統(tǒng)一變量409的表達(dá)式434。導(dǎo)出的統(tǒng)一值505和507的使用使圖形處理子系統(tǒng)不會(huì)對(duì)表達(dá)式432和434的值進(jìn)行重復(fù)冗余計(jì)算。如果對(duì)于另一批量數(shù)據(jù)來說統(tǒng)一變量407、409、411或413改變了值,那么必須再優(yōu)化此示范性著色程序。
圖5B說明數(shù)據(jù)流圖550,其對(duì)應(yīng)于表4的經(jīng)優(yōu)化的頂點(diǎn)著色程序。比較數(shù)據(jù)流圖450與550,可以看到在步驟307到331的第一重復(fù)之后,輸出461被消除,因?yàn)槭痉缎枣溄拥钠沃绦虿皇褂么溯敵?。因此,可廢除用于計(jì)算輸出461的所有運(yùn)算。而且,因?yàn)閷傩?72僅用于計(jì)算輸出461,所以也廢除屬性472;因此在程序執(zhí)行期間,圖形處理子系統(tǒng)甚至將不會(huì)獲取屬性472,從而節(jié)省了存儲(chǔ)器帶寬。另外,用等于數(shù)據(jù)流圖450中表達(dá)式485的值的導(dǎo)出的統(tǒng)一變量555替換未經(jīng)優(yōu)化的著色程序中的統(tǒng)一變量480和482。
將圖5A和5B的經(jīng)優(yōu)化的著色程序與其在圖4A和4B中的未經(jīng)優(yōu)化的版本進(jìn)行比較,可以看到步驟307到331的第一重復(fù)極大地簡(jiǎn)化了鏈接的著色程序。如上文討論,步驟331確定上游著色程序輸出中的任一者是否為常數(shù)或先前未考慮的統(tǒng)一值。在此實(shí)例中,圖5B的頂點(diǎn)著色程序的第一優(yōu)化重復(fù)確定輸出455和457均為統(tǒng)一值,所述統(tǒng)一值對(duì)于給定批量的數(shù)據(jù)來說是常數(shù)。變化的輸出變量“varying1”455等于導(dǎo)出的統(tǒng)一值555。類似地,輸出變量“varying2”457等于統(tǒng)一值560。因此,可通過使用對(duì)應(yīng)于頂點(diǎn)著色程序輸出455和457的片段著色程序輸入415和417作為常數(shù)來重復(fù)步驟307到331以進(jìn)一步優(yōu)化所述對(duì)鏈接的著色程序。
表5和6說明在步驟307到331的第二次重復(fù)之后所述對(duì)示范性鏈接的著色程序的源代碼。類似地,圖6A和6B說明優(yōu)化的第二重復(fù)之后呈數(shù)據(jù)流格式的此對(duì)示范性鏈接的著色程序。
表5-第二次優(yōu)化重復(fù)之后的示范性片段著色程序
表6-第二次優(yōu)化重復(fù)之后的示范性頂點(diǎn)著色程序圖6A的數(shù)據(jù)流圖600是圖4A的圖400中所示的片段著色程序的經(jīng)優(yōu)化版本。比較這兩個(gè)圖,可以看到現(xiàn)已消除條件分支427。這是用視為常數(shù)的變化的輸入變量415和417來估計(jì)條件分支427的結(jié)果,所述輸入變量415和417是在示范性頂點(diǎn)著色程序的優(yōu)化的先前重復(fù)中確定的。另外,已用導(dǎo)出的統(tǒng)一值替換片段著色程序中的所有原始的統(tǒng)一值,從而消除了冗余的計(jì)算。
圖6B的數(shù)據(jù)流圖650展示第二次優(yōu)化重復(fù)的結(jié)果。將此圖與相應(yīng)的未經(jīng)優(yōu)化的圖450進(jìn)行比較,可以看到已消除變化的輸出變量455和457。因?yàn)檫@兩個(gè)輸出變量均將統(tǒng)一值輸出到鏈接的下游著色程序,所以可在上游頂點(diǎn)著色程序中消除這些值并用鏈接的下游著色程序中的常數(shù)來替換。
在此實(shí)例中,在步驟307到331的第二次重復(fù)之后,沒有新的常數(shù)或統(tǒng)一輸出位于上游著色程序中。因此,在步驟331之后,方法300繼續(xù)進(jìn)行到步驟333以進(jìn)行進(jìn)一步優(yōu)化和代碼產(chǎn)生。進(jìn)一步優(yōu)化可包括用單個(gè)有效指令代替若干指令。舉例來說,可用單個(gè)的乘法與累加指令替換其后為加法指令的乘法指令??蓤?zhí)行附加優(yōu)化以利用圖形處理子系統(tǒng)的管線式硬件。舉例來說,指令可交叉存取以便更好地進(jìn)行調(diào)度。表7和8說明步驟339之后所述對(duì)示范性鏈接的著色程序。
表7-附加優(yōu)化之后的示范性片段著色程序
表8-附加優(yōu)化之后的示范性頂點(diǎn)著色程序表7的片段著色程序?qū)?yīng)于表1的未經(jīng)優(yōu)化的示范性片段著色程序。比較這兩個(gè)表中的程序代碼,可以看到方法300將片段著色程序從大約十二行高級(jí)著色語(yǔ)言代碼減少為僅兩個(gè)匯編語(yǔ)言指令。類似地,表2中的示范性頂點(diǎn)著色程序從其原始形式的約十個(gè)指令優(yōu)化為表8中的僅六個(gè)指令。
圖7說明適于實(shí)施本發(fā)明實(shí)施例的著色語(yǔ)言結(jié)構(gòu)700。著色語(yǔ)言結(jié)構(gòu)包括應(yīng)用程序705。在一實(shí)施例中,應(yīng)用程序705適于命令圖形處理子系統(tǒng)740渲染一個(gè)或一個(gè)以上三維對(duì)象。應(yīng)用程序705載入界定將要渲染的對(duì)象的對(duì)象數(shù)據(jù)710,包括幾何形狀、照明和紋理化的數(shù)據(jù)。應(yīng)用程序705還從上游著色程序715和下游著色程序720載入源代碼。在一實(shí)施例中,上游著色程序715和下游著色程序720分別可為頂點(diǎn)著色程序和片段著色程序。
為了使用上游著色程序715和下游著色程序720來渲染對(duì)象,應(yīng)用程序705將著色程序發(fā)送到API驅(qū)動(dòng)程序725。另外,應(yīng)用程序705將命令發(fā)送到API驅(qū)動(dòng)程序725以引導(dǎo)API驅(qū)動(dòng)程序?qū)⑸嫌沃绦?15和下游著色程序720鏈接在一起,并編譯和優(yōu)化鏈接的著色程序。在一實(shí)施例中是API驅(qū)動(dòng)程序725的一部分的流處理語(yǔ)言編譯器730執(zhí)行著色程序的編譯和優(yōu)化。在一替代實(shí)施例中,流處理語(yǔ)言編譯器730是與API驅(qū)動(dòng)程序725或應(yīng)用程序705動(dòng)態(tài)連系的外部模塊或庫(kù)。
接著應(yīng)用程序705將對(duì)象數(shù)據(jù)710連同指示應(yīng)渲染對(duì)象數(shù)據(jù)710的命令一起發(fā)送到API驅(qū)動(dòng)程序725。因此,API驅(qū)動(dòng)程序725將對(duì)象數(shù)據(jù)710和經(jīng)編譯和優(yōu)化版本的鏈接的著色程序715和720發(fā)送到圖形處理子系統(tǒng)740。圖形處理子系統(tǒng)740執(zhí)行鏈接的著色程序以處理對(duì)象數(shù)據(jù)710并渲染對(duì)象。
本發(fā)明提供一種系統(tǒng),其用于基于流處理程序之間的關(guān)系來優(yōu)化流處理程序。盡管已參照用于計(jì)算機(jī)圖形應(yīng)用程序的流處理系統(tǒng)討論了本發(fā)明,但本發(fā)明適用于具有兩個(gè)或兩個(gè)以上可編程流處理單元的任何流處理系統(tǒng),包括音頻應(yīng)用程序和通信應(yīng)用程序。已參照本發(fā)明的特定實(shí)例和實(shí)施例討論了本發(fā)明;然而,這些只是對(duì)本發(fā)明的說明而不是限制。因此,本發(fā)明的范圍將僅僅由權(quán)利要求書確定。
權(quán)利要求
1.一種用于優(yōu)化適于由一流處理系統(tǒng)執(zhí)行的流處理程序的方法,其中所述流處理系統(tǒng)包括一第一和一第二可編程流處理單元,其中所述第二流處理單元與所述第一流處理單元連接,使得所述第一流處理單元的輸出適于作為所述第二流處理單元的輸入,所述方法包含接收一適于由一第一流處理單元執(zhí)行的第一流處理程序,其中所述第一流處理程序包括一輸出參數(shù);接收一適于由一第二流處理單元執(zhí)行的第二流處理程序,其中所述第二流處理程序包括一對(duì)應(yīng)于所述第一流處理程序的所述輸出參數(shù)的輸入?yún)?shù);和基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的對(duì)應(yīng)來優(yōu)化所述第一和第二流處理程序。
2.根據(jù)權(quán)利要求1所述的方法,其中優(yōu)化所述第一和第二流處理程序包括從所述第一流處理程序中消除適于計(jì)算一未被所述第二流處理程序使用的附加輸出參數(shù)的失效程序代碼。
3.根據(jù)權(quán)利要求1所述的方法,其中優(yōu)化所述第一和第二流處理程序包括響應(yīng)于所述第一流處理程序的所述輸出參數(shù)是一常數(shù)的一確定來傳播用于所述第二流處理程序的所述輸入?yún)?shù)的一常數(shù)值;和從所述第二流處理程序中消除由于傳播一常數(shù)值而成為冗余的失效程序代碼。
4.根據(jù)權(quán)利要求1所述的方法,其中優(yōu)化所述第一和第二流處理程序包括響應(yīng)于所述第一流處理程序的所述輸出參數(shù)是一統(tǒng)一值的一確定來傳播用于所述第二流處理程序的所述輸入?yún)?shù)的一統(tǒng)一值;和從所述第二流處理程序中消除由于傳播一統(tǒng)一值而成為冗余的失效程序代碼。
5.根據(jù)權(quán)利要求1所述的方法,其中所述流處理系統(tǒng)駐存在一圖形處理子系統(tǒng)內(nèi)。
6.根據(jù)權(quán)利要求5所述的方法,其中所述第一可編程流處理單元是一可編程頂點(diǎn)處理器。
7.根據(jù)權(quán)利要求5所述的方法,其中所述第二可編程流處理單元是一可編程頂點(diǎn)處理器。
8.根據(jù)權(quán)利要求5所述的方法,其中所述第一可編程流處理單元是一可編程鑲嵌處理器。
9.根據(jù)權(quán)利要求5所述的方法,其中所述第二可編程流處理單元是一可編程片段處理器。
10.根據(jù)權(quán)利要求1所述的方法,其中所述流處理程序中的至少一者是用OpenGL著色語(yǔ)言編寫的。
11.根據(jù)權(quán)利要求1所述的方法,其中所述流處理程序中的至少一者是用Cg語(yǔ)言編寫的。
12.根據(jù)權(quán)利要求1所述的方法,其中所述流處理程序中的至少一者是用DirectX高級(jí)著色語(yǔ)言編寫的。
13.根據(jù)權(quán)利要求1所述的方法,其中優(yōu)化所述第一和第二流處理程序包括交替地優(yōu)化所述第二流處理程序和所述第一流處理程序直到基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的所述對(duì)應(yīng)而優(yōu)化所述第一和第二流處理程序兩者為止的復(fù)數(shù)次重復(fù)。
14.根據(jù)權(quán)利要求1所述的方法,其進(jìn)一步包含將所述經(jīng)優(yōu)化的第一和第二流處理程序編譯成適于由所述流處理系統(tǒng)執(zhí)行的格式。
15.一種信息存儲(chǔ)媒介,其包括一組適于引導(dǎo)一信息處理裝置執(zhí)行一組步驟的處理器指令,其中所述信息處理裝置包括一流處理系統(tǒng),所述流處理系統(tǒng)包括一第一和一第二可編程流處理單元,其中所述第二流處理單元與所述第一流處理單元連接,使得所述第一流處理單元的輸出適于作為所述第二流處理單元的輸入,其中所述組步驟包含接收一適于由一第一流處理單元執(zhí)行的第一流處理程序,其中所述第一流處理程序包括一輸出參數(shù);接收一適于由一第二流處理單元執(zhí)行的第二流處理程序,其中所述第二流處理程序包括一對(duì)應(yīng)于所述第一流處理程序的所述輸出參數(shù)的輸入?yún)?shù);和基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的對(duì)應(yīng)來優(yōu)化所述第一和第二流處理程序;其中優(yōu)化所述第一和第二流處理程序包括交替地優(yōu)化所述第二流處理程序和所述第一流處理程序直到基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的所述對(duì)應(yīng)而優(yōu)化所述第一和第二流處理程序兩者為止的復(fù)數(shù)次重復(fù)。
16.根據(jù)權(quán)利要求15所述的信息存儲(chǔ)媒介,其中優(yōu)化所述第一和第二流處理程序包括從所述第一流處理程序中消除適于計(jì)算一未被所述第二流處理程序使用的附加輸出參數(shù)的失效程序代碼。
17.根據(jù)權(quán)利要求15所述的信息存儲(chǔ)媒介,其中優(yōu)化所述第一和第二流處理程序包括響應(yīng)于所述第一流處理程序的所述輸出參數(shù)是一常數(shù)的一確定來傳播用于所述第二流處理程序的所述輸入?yún)?shù)的一常數(shù)值;和從所述第二流處理程序中消除由于傳播一常數(shù)值而成為冗余的失效程序代碼。
18.根據(jù)權(quán)利要求15所述的信息存儲(chǔ)媒介,其中優(yōu)化所述第一和第二流處理程序包括響應(yīng)于所述第一流處理程序的所述輸出參數(shù)是一統(tǒng)一值的一確定來傳播用于所述第二流處理程序的所述輸入?yún)?shù)的一統(tǒng)一值;和從所述第二流處理程序中消除由于傳播一統(tǒng)一值而成為冗余的失效程序代碼。
19.根據(jù)權(quán)利要求15所述的信息存儲(chǔ)媒介,其中所述可編程流處理單元中的一者是一可編程頂點(diǎn)處理器。
20.根據(jù)權(quán)利要求15所述的信息存儲(chǔ)媒介,其中所述流處理程序中的至少一者是用OpenGL著色語(yǔ)言編寫的。
21.一種適于渲染一圖像的系統(tǒng),所述系統(tǒng)包含一圖形處理子系統(tǒng),其包括一第一和一第二可編程流處理單元,其中所述第二流處理單元與所述第一流處理單元連接,使得所述第一流處理單元的輸出適于作為所述第二流處理單元的輸入;一API驅(qū)動(dòng)程序,其適于從一渲染應(yīng)用程序接收一組渲染命令和數(shù)據(jù),其中所述組渲染命令和數(shù)據(jù)包括一第一流處理程序和一第二流處理程序,且所述API驅(qū)動(dòng)程序適于將所述第一和第二流處理程序分派到一流處理語(yǔ)言編譯器單元;其中所述流處理語(yǔ)言編譯器單元適于接收所述適于由所述第一流處理單元執(zhí)行的第一流處理程序,其中所述第一流處理程序包括一輸出參數(shù);接收所述適于由所述第二流處理單元執(zhí)行的第二流處理程序,其中所述第二流處理程序包括一對(duì)應(yīng)于所述第一流處理程序的所述輸出參數(shù)的輸入?yún)?shù);和基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的對(duì)應(yīng)來優(yōu)化所述第一和第二流處理程序;其中優(yōu)化所述第一和第二流處理程序包括交替地優(yōu)化所述第二流處理程序和所述第一流處理程序直到基于所述第二流處理程序的所述輸入?yún)?shù)與所述第一流處理程序的所述輸出參數(shù)之間的所述對(duì)應(yīng)而優(yōu)化所述第一和第二流處理程序兩者為止的復(fù)數(shù)次重復(fù)。
22.根據(jù)權(quán)利要求21所述的系統(tǒng),其中所述API驅(qū)動(dòng)程序進(jìn)一步適于從所述流處理語(yǔ)言編譯器單元接收所述經(jīng)優(yōu)化的第一和第二流處理程序,使所述組渲染命令和數(shù)據(jù)以及所述經(jīng)優(yōu)化的第一和第二流處理程序與所述圖形處理子系統(tǒng)通信,和指示所述圖形處理子系統(tǒng)通過分別用所述第一和第二流處理單元執(zhí)行所述經(jīng)優(yōu)化的第一和第二流處理程序來處理所述組渲染命令和數(shù)據(jù)的至少一部分。
23.根據(jù)權(quán)利要求21所述的系統(tǒng),其中所述流處理語(yǔ)言編譯器單元進(jìn)一步適于將所述經(jīng)優(yōu)化的第一和第二流處理程序編譯成適于由所述流處理系統(tǒng)執(zhí)行的格式。
24.根據(jù)權(quán)利要求21所述的系統(tǒng),其中所述圖形處理子系統(tǒng)包括一圖形處理單元。
25.根據(jù)權(quán)利要求21所述的系統(tǒng),其中所述圖形處理子系統(tǒng)包括一適于存儲(chǔ)所述組渲染命令和數(shù)據(jù)的至少一部分的圖形存儲(chǔ)器。
全文摘要
一系統(tǒng)基于在流處理程序之間交換的數(shù)據(jù)來優(yōu)化兩個(gè)或兩個(gè)以上流處理程序。所述系統(tǒng)交替地處理每一流處理程序以識(shí)別并去除失效程序代碼,藉此改進(jìn)執(zhí)行性能。通過傳播作為來自其它流處理程序的輸入而接收到的常數(shù)且通過分析一第一流處理程序并確定一第二流處理程序的未被所述第一流處理程序使用的輸出來識(shí)別失效程序代碼。所述系統(tǒng)可執(zhí)行此優(yōu)化的多次重復(fù),因?yàn)橄惹暗闹貜?fù)引入了用作一流處理程序的輸入的附加常數(shù)。在所述流處理程序的優(yōu)化之后,將所述經(jīng)優(yōu)化的流處理程序編譯為一適于由一流處理系統(tǒng)執(zhí)行的格式。
文檔編號(hào)G06T15/00GK1997964SQ200580022672
公開日2007年7月11日 申請(qǐng)日期2005年6月30日 優(yōu)先權(quán)日2004年7月2日
發(fā)明者馬克·J·基爾加德, 克里斯托弗·T·多德, 列夫·萊巴雷迪安 申請(qǐng)人:輝達(dá)公司