用于本地調(diào)試圖形程序的系統(tǒng)、方法和計算機程序產(chǎn)品的制作方法
【專利摘要】提供經(jīng)由采用單個圖形處理單元的系統(tǒng)調(diào)試圖形程序的系統(tǒng)、方法和計算機程序產(chǎn)品。方法包括以下步驟:將應(yīng)用程序編程接口上下文的初始狀態(tài)存儲在存儲器中,攔截與幀相關(guān)聯(lián)的API命令流,將API命令流傳送到實現(xiàn)API的軟件層以渲染幀;以及響應(yīng)于斷點將圖形處理單元上下文存儲在存儲器中。API上下文的初始狀態(tài)與幀的開始相對應(yīng),并且API命令流由圖形應(yīng)用程序生成。
【專利說明】用于本地調(diào)試圖形程序的系統(tǒng)、方法和計算機程序產(chǎn)品
[0001]相關(guān)申請的交叉引用
[0002]本申請要求于2012年11月26日提交的序列號為61/730,025的美國臨時申請的權(quán)益,其全部內(nèi)容通過援引的方式在本文中加以合并。
【技術(shù)領(lǐng)域】
[0003]本申請涉及軟件設(shè)計,并且更具體地,涉及圖形程序的調(diào)試。
【背景技術(shù)】
[0004]程序員如今已經(jīng)習(xí)慣于能夠經(jīng)由在如今的集成開發(fā)環(huán)境(IDE)諸如Microsoft?Visual Studio中所實現(xiàn)的眾多工具來創(chuàng)建和調(diào)試程序。程序員可以為由目標(biāo)處理器執(zhí)行的程序創(chuàng)建源代碼、編譯源代碼以生成可執(zhí)行文件、以及在目標(biāo)處理器上運行可執(zhí)行文件。IDE可以包括允許程序員使用斷點執(zhí)行程序、一次一個指令地單步調(diào)試程序、從斷點到斷點單步調(diào)試程序、以及在程序的執(zhí)行期間在不同的點處查看存儲器或寄存器的內(nèi)容的工具。
[0005]典型地,目標(biāo)處理器可以是中央處理單元(CPU),諸如Intel@x86家族的處理器或包括基于CPU核的RISC (精簡指令集)的ARlfCortex家族的處理器。這樣的處理器實現(xiàn)為有能力中斷或搶占由處理器所執(zhí)行的某代碼的執(zhí)行。該能力使得程序員能夠經(jīng)由還被用于實質(zhì)上同時執(zhí)行操作系統(tǒng)(0S)、IDE或其他軟件的單個處理器來調(diào)試程序。然而,如今的常規(guī)圖形處理單元(GPU)可能不能夠以這樣的方式操作。例如,常規(guī)的GPU可能不會為在GPU上執(zhí)行的具體的進程使能搶占。也就是說,程序員不能停住GPU上程序的執(zhí)行,而同時允許諸如生成用于在附接的監(jiān)視器上顯示的圖形信息的其他操作繼續(xù)執(zhí)行。在沒有這樣能力的情況下,用于GPU的測試平臺典型地限于具有經(jīng)網(wǎng)路連接到客戶端系統(tǒng)的GPU的遠程系統(tǒng)或者具有多個GPU的本地系統(tǒng),其中一個GPU專用于顯示操作并且另一個GPU專用于測試操作。這樣的系統(tǒng)設(shè)置和操作更復(fù)雜,需要額外的硬件和特殊配置。能夠在的單個GPU系統(tǒng)上編碼對于程序員是有用的,單個GPU系統(tǒng)在大多數(shù)臺式計算機和筆記本電腦上大量可用。因此,需要解決與現(xiàn)有技術(shù)相關(guān)的該問題和/或其他問題。
【發(fā)明內(nèi)容】
[0006]提供用于經(jīng)由采用單個圖形處理單元的系統(tǒng)來調(diào)試圖形程序的系統(tǒng)、方法和計算機程序產(chǎn)品。方法包括以下步驟,將應(yīng)用程序編程接口上下文的初始狀態(tài)存儲在存儲器中,攔截與幀相關(guān)聯(lián)的API命令流,將API命令流傳送到實現(xiàn)API的軟件層以渲染幀,以及響應(yīng)于斷點,將圖形處理單元上下文存儲在存儲器中。API上下文的初始狀態(tài)與幀的開始相對應(yīng),并且API命令流由圖形應(yīng)用程序生成。
【專利附圖】
【附圖說明】
[0007]圖1示出了根據(jù)一個實施例的、用于利用具有單個圖形處理單元的系統(tǒng)來調(diào)試圖形程序的方法的流程圖;[0008]圖2示出了根據(jù)現(xiàn)有技術(shù)的、配置為調(diào)試圖形程序的系統(tǒng);
[0009]圖3示出了根據(jù)一個實施例的、配置為調(diào)試圖形程序的系統(tǒng);
[0010]圖4示出了根據(jù)一個實施例的并行處理單元;
[0011]圖5示出了根據(jù)一個實施例的、圖4的流多處理器;
[0012]圖6是根據(jù)一個實施例的,由圖4的并行處理單元所實現(xiàn)的圖形處理管線的示意圖;
[0013]圖7A示出了根據(jù)一個實施例的、用于著色器程序的代碼的一部分;
[0014]圖7B示出了根據(jù)另一個實施例的、用于使用單個圖形處理單元來調(diào)試著色器程序的系統(tǒng);
[0015]圖8A、8B和8C示出了根據(jù)另一個實施例的、用于采用單個圖形處理單元來調(diào)試圖形程序的方法的流程圖;以及
[0016]圖9示出了前面各種實施例的各種架構(gòu)和/或功能性可以在其中實現(xiàn)的示例性系統(tǒng)。
【具體實施方式】
[0017]本公開描述了用于在具有單個GPU的系統(tǒng)上調(diào)試圖形程序的機制。應(yīng)用程序填充碼(shim)配置為攔截由主機處理器執(zhí)行的圖形應(yīng)用程序所生成的API命令。圖形應(yīng)用程序當(dāng)被編譯時配置為生成傳送到實現(xiàn)API的軟件層的API命令,軟件層諸如驅(qū)動程序或運行時庫(runtime library)。配置為針對軟件層生成API命令的指令可以由配置為針對應(yīng)用程序填充碼生成API命令的指令所替代。指令可以由軟件工具以二進制代碼自動替代,或者通過將應(yīng)用程序填充碼鏈接到用于圖形應(yīng)用程序的源代碼來手動替代。當(dāng)執(zhí)行圖形應(yīng)用程序時,API命令被路由到應(yīng)用程序填充碼而不是軟件層。
[0018]應(yīng)用程序填充碼配置為跟蹤與圖形應(yīng)用程序相關(guān)聯(lián)的API上下文。可以通過創(chuàng)建和修改表示當(dāng)前API上下文的狀態(tài)模型來跟蹤API上下文。應(yīng)用程序填充碼配置為基于從圖形應(yīng)用程序所接收的API命令來更新狀態(tài)模型。在狀態(tài)模式被更新之后,應(yīng)用程序填充碼可以轉(zhuǎn)發(fā)API命令給軟件層,如圖形應(yīng)用程序原本打算的。
[0019]應(yīng)用程序填充碼可以配置為實現(xiàn)重放機制,其允許調(diào)試工具實現(xiàn)一般只與常規(guī)(PU相關(guān)聯(lián)的各種調(diào)試技術(shù)。重放機制包括以下步驟,在開始渲染圖像數(shù)據(jù)的幀用于顯示時存儲API上下文的初始狀態(tài),將由圖形應(yīng)用程序為圖像數(shù)據(jù)的幀所生成的API命令流存儲在重放緩沖區(qū)中,以及開啟重放循環(huán)以重復(fù)渲染圖像數(shù)據(jù)的幀數(shù)次。重放循環(huán)的每次經(jīng)過包括還原API上下文以和API上下文的初始狀態(tài)相匹配,以及傳送重放緩沖區(qū)中的API命令流到軟件層。當(dāng)在重放循環(huán)期間遇到斷點時,在幀的渲染期間可以捕獲GPU上下文的當(dāng)前狀態(tài)。使用上述的重放機制,調(diào)試工具可以允許程序員在采用單個GPU的系統(tǒng)上,在程序的斷點處停止,一次一個指令地單步調(diào)試程序,一次一個斷點地單步調(diào)試程序等,而不會使顯示定格。
[0020]圖1示出了根據(jù)一個實施例的、用于利用具有單個GPU的系統(tǒng)調(diào)試圖形程序的方法100的流程圖。在步驟102,將API上下文的初始狀態(tài)存儲在存儲器中。API上下文的初始狀態(tài)可以與表示在幀開始時的API上下文的狀態(tài)模型中所包括的信息相對應(yīng)。API上下文的初始狀態(tài)被復(fù)制到存儲器中的單獨的數(shù)據(jù)結(jié)構(gòu)中,以便重新設(shè)定在稍后的時間點的API上下文的狀態(tài)。在步驟104,攔截由圖形應(yīng)用程序所生成的API命令流。API命令流可以存儲在重放緩沖區(qū)中。在給定的時間點可以存在多個API上下文,并且每個API上下文可以與由圖形應(yīng)用程序所生成的一個或多個API命令流相關(guān)聯(lián)。在一個實施例中,與API上下文相關(guān)聯(lián)的兩個或更多個API命令流存儲在重放緩沖區(qū)。在本說明的上下文中,重放緩沖區(qū)是分配在存儲器中的任何數(shù)據(jù)結(jié)構(gòu),并且配置為存儲API命令的有序列表。在一個實施例中,重放緩沖區(qū)是鏈表。在另一個實施例中,重放緩沖區(qū)是FIFO。
[0021 ] 在步驟106,將API命令流傳送到軟件層。在一個實施例中,軟件層可以是實現(xiàn)API的驅(qū)動程序,諸如實現(xiàn)OpenGL API的驅(qū)動程序。在另一個實施例中,軟件層可以是實現(xiàn)API的運行時庫,諸如實現(xiàn)Direct3D API的運行時庫。在這樣的實施例中,軟件層可以鏈接到另一個驅(qū)動程序或者其他中間層。在步驟108,應(yīng)用程序填充碼確定是否已經(jīng)到達斷點。在本公開的上下文中,斷點是由處理器執(zhí)行的特殊指令,其使得執(zhí)行停住并且潛在地使得錯誤處理程序或其他例程被執(zhí)行。斷點可以是特殊的指令或者與指示指令與程序中的斷點相關(guān)聯(lián)的另一個指令(例如指令前綴)相關(guān)聯(lián)。在一個實施例中,斷點可以(直接或間接通過錯誤處理程序)使得GPU傳送指示斷點已經(jīng)到達并且GPU已經(jīng)停住進一步指令的執(zhí)行的消息到驅(qū)動程序。如果沒有到達斷點,那么方法800返回到步驟106,其中將附加的API命令傳送到軟件層。然而,返回到步驟108,響應(yīng)于到達斷點,方法800進行到步驟110,其中將GPU上下文的當(dāng)前狀態(tài)存儲在存儲器中。在步驟112,開啟重放循環(huán),其使得API上下文的初始狀態(tài)被還原、API命令流被重新傳送到軟件層、以及將GPU上下文的另一個狀態(tài)存儲在存儲器中。
[0022]現(xiàn)在將關(guān)于各可選架構(gòu)和特征來闡述更多示例性的信息,根據(jù)用戶的期望可以采用或不采用所述架構(gòu)和特征來實現(xiàn)前述的框架。應(yīng)該強烈注意下面的信息出于示例性的目的而闡述并且其不應(yīng)該被認(rèn)為是以任何方式進行限制。下面特征中的任何一個可以可選地合并,排斥或無需排斥所述的其他特征。
[0023]圖2示出了根據(jù)現(xiàn)有技術(shù)的、配置為調(diào)試圖形程序的系統(tǒng)。如圖2所示,系統(tǒng)包括經(jīng)由網(wǎng)絡(luò)230耦連到目標(biāo)平臺250的客戶端平臺200。客戶端平臺200可以是例如臺式計算機、筆記本電腦、平板電腦或配置為運行IDE或其他調(diào)試軟件的任何其他系統(tǒng)??蛻舳似脚_200包括中央處理單元(CPU) 201、存儲器204、GPU206、顯示設(shè)備208和網(wǎng)絡(luò)接口控制器(NIC)203。CPU201可以是x86類型處理器、RISC處理器、PowerPC處理器等。存儲器204可以是易失性存儲器,諸如動態(tài)隨機存取存儲器(DRAM)。雖然沒有明確示出,客戶端平臺200可以包括非易失性存儲設(shè)備,諸如硬盤驅(qū)動器(HDD)或其他類型的磁的或者光學(xué)存儲系統(tǒng)。NIC203可以實現(xiàn)TCP/IP協(xié)議,用于通過網(wǎng)絡(luò)230連接到一個或多個其他設(shè)備,網(wǎng)絡(luò)230可以是例如局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、互聯(lián)網(wǎng)等。顯不設(shè)備208可以是液晶顯不(IXD)設(shè)備、有機發(fā)光二極管(OLED)顯示設(shè)備、陰極射線管(CRT)顯示設(shè)備等。
[0024]GPU206是實現(xiàn)包括圖像處理管線的至少一部分的可編程、并行處理架構(gòu)的處理器。圖像處理管線配置為生成圖像數(shù)據(jù)用于在顯示設(shè)備208上顯示,顯示設(shè)備208可經(jīng)由任何類型的通信鏈路連接到GPU206,諸如視頻圖形陣列(VGA)連接、高清晰度多媒體接口(HDMI)連接、顯示端口(DP)連接等。雖然沒有明確示出,GPU206可以連接到本地圖形存儲器,諸如同步動態(tài)隨機存取存儲器(SDRAM)等。GPU206可以配置為基于從由CPU201執(zhí)行的驅(qū)動程序傳送到GPU206的命令來生成圖像數(shù)據(jù)的幀。圖像數(shù)據(jù)的幀可以存儲在本地圖形存儲器中的幀緩沖區(qū)中,并且轉(zhuǎn)換為經(jīng)由通信鏈路傳送到顯示設(shè)備208的視頻信號。
[0025]目標(biāo)平臺250可以是例如另一個臺式計算機,其連接到網(wǎng)絡(luò)230并且包括第二CPU251、第二 GPU256、第二存儲器 254 和第二 NIC253。CPU251、存儲器 254 和 NIC253 與上述的CPU201、存儲器204和NIC203類似。第二 GPU256可以稱為目標(biāo)設(shè)備。開發(fā)應(yīng)用程序諸如IDE或其他類型的調(diào)試工具可以由客戶端平臺200執(zhí)行。開發(fā)應(yīng)用程序可以使得圖形程序(即著色器)由GPU256執(zhí)行,通過在客戶端平臺200上執(zhí)行的開發(fā)應(yīng)用程序?qū)崿F(xiàn)例如斷點、指令步進等調(diào)試機制。可以理解,目標(biāo)平臺250可以不包括附接于GPU256的顯示設(shè)備,因為在調(diào)試期間GPU256可以停住,從而阻止GPU256生成顯示信號用于顯示設(shè)備。然而,程序員能夠在客戶端平臺200的顯示設(shè)備208上查看GPU256的狀態(tài),因為GPU206在調(diào)試期間不停住,因此能夠生成顯示信號用于顯示設(shè)備208。
[0026]用于調(diào)試圖形程序的該類型的遠程系統(tǒng)可能足以滿足某些情形,在這些情形中程序員利用設(shè)置在中央辦公室并且經(jīng)由局域網(wǎng)連接到一個或多個目標(biāo)平臺250的客戶端平臺200。然而,該系統(tǒng)需要增加了不必要的費用的附加的硬件并且設(shè)置復(fù)雜,需要程序員或者網(wǎng)絡(luò)管理員配置目標(biāo)平臺250的各種IP地址并且相應(yīng)地配置開發(fā)應(yīng)用程序。很多時候程序員將只能夠訪問僅包括單個GPU的常規(guī)系統(tǒng)(諸如臺式計算機或筆記本電腦),而程序員可能無法訪問連接到網(wǎng)絡(luò)的目標(biāo)平臺。
[0027]可以理解,可以構(gòu)造將多個GPU合并到單個平臺中的可替代系統(tǒng),其中至少一個GI3U可以專用于生成圖像數(shù)據(jù)用于顯示,并且至少另一個GPU專用于調(diào)試操作。該類型的系統(tǒng)已經(jīng)用于調(diào)試用于圖形處理單元上的通用計算(GPGPU)的計算應(yīng)用程序。然而,這樣的系統(tǒng)需要用于專用于調(diào)試操作的GPU的單獨的驅(qū)動程序,其阻止專用于調(diào)試操作的GPU處理圖形程序。也就是說,常規(guī)操作系統(tǒng)諸如MiCix)SOft@WindOWS配置為將圖像操作分配給配置為處理圖形程序的任意可用GPU。因此,在沒有潛在將操作系統(tǒng)顯示由操作系統(tǒng)或其他應(yīng)用程序所產(chǎn)生的圖像數(shù)據(jù)的能力停滯的情況下,開發(fā)應(yīng)用程序不能出于調(diào)試的目的而停住圖形程序的操作。利用下述系統(tǒng)可以解除這樣的問題。
[0028]圖3示出了根據(jù)一個實施例的、配置為調(diào)試圖形程序的系統(tǒng)。如圖3所示,客戶端平臺300與客戶端平臺200類似之處在于,客戶端平臺300包括CPU301、存儲器304、GPU306、顯示設(shè)備308和NIC303。在一個實施例中,這些部件與客戶端平臺200的部件類似。存儲器304可以包括操作系統(tǒng)(0S)331、驅(qū)動程序332、IDE333、圖形應(yīng)用程序334、一個或多個著色器程序335和影子狀態(tài)存儲器336。0S331可以是Microsoft@Windows、Linux?、Mac@0SX 等。IDE333 可以是 Microsoft@Visual Studio>NVIDIA@Nsight (Visual Studio 的擴展)、開源Eclipse Platform或者能夠調(diào)試圖形程序的任何其他類型的開發(fā)環(huán)境或調(diào)試軟件。
[0029]驅(qū)動程序332配置為傳送指令到GPU306以便在GPU306上執(zhí)行任務(wù)。在一個實施例中,驅(qū)動程序332實現(xiàn)由OpenGL0規(guī)范所定義的API。API使得圖形應(yīng)用程序334能夠生成發(fā)送到驅(qū)動程序332的獨立于硬件的API命令,驅(qū)動程序332轉(zhuǎn)而使得GPU306實施由API命令所指定的操作。在另一個實施例中,驅(qū)動程序332實現(xiàn)與實現(xiàn)Direct3D@API的運行時庫相關(guān)聯(lián)的API。API使得圖形應(yīng)用程序334能夠生成發(fā)送到運行時庫的獨立于硬件的API命令,運行時庫轉(zhuǎn)而傳送附加的API命令到驅(qū)動程序332,其使得GPU306執(zhí)行由API命令所指定的操作??梢岳斫猓蓤D形應(yīng)用程序334所生成的API命令可以通過的一個或多個中間軟件層,諸如應(yīng)用程序填充碼、庫等,直接或者間接傳送到驅(qū)動程序332。
[0030]圖形應(yīng)用程序334可以是配置為由CPU301執(zhí)行以便生成傳送到軟件層的API命令的軟件應(yīng)用程序。圖形應(yīng)用程序334可以與一個或多個著色器程序335相關(guān)聯(lián),諸如配置為由GPU306的可編程程序單元執(zhí)行的頂點著色器、幾何著色器、或片段著色器(即像素著色器)。著色器是配置為由GPU執(zhí)行用于變換幾何基元或著色像素(即為一個或多個像素生成顏色分量值)的指令集的通用術(shù)語。每個著色器可以配置為接收一個或多個輸入緩沖區(qū)(例如頂點緩沖區(qū)等)并且生成一個或多個輸出緩沖區(qū)(例如三角面片(triangle patch)、顏色矢量等)。
[0031]如上所述,常規(guī)GPU不具有在執(zhí)行期間停住但繼續(xù)產(chǎn)生圖像數(shù)據(jù)用于在顯示設(shè)備上顯示的能力。為了解決該問題,應(yīng)用程序填充碼配置為重放由圖形應(yīng)用程序所指定的操作,如此IDE333將顯示GPU306的狀態(tài),好像GPU306在調(diào)試期間停住但GPU實際上允許繼續(xù)執(zhí)行,從而允許將GPU上下文從與圖形應(yīng)用程序相關(guān)聯(lián)的API上下文切換到例如與生成圖像數(shù)據(jù)用于在顯示設(shè)備308上顯示的操作系統(tǒng)331相關(guān)聯(lián)的API上下文。
[0032]在一個實施例中,應(yīng)用程序填充碼配置為跟蹤與圖形應(yīng)用程序334相關(guān)聯(lián)的API上下文。應(yīng)用程序填充碼在特定的幀或一些幀開始時將API上下文的初始狀態(tài)存儲在存儲器304中。程序員可以利用調(diào)試工具指示對哪個或哪些幀感興趣。應(yīng)用程序填充碼將用于由圖形應(yīng)用程序334所生成的一個或多個幀的API命令流存儲在存儲器304中。應(yīng)用程序填充碼隨后可以開啟重放循環(huán)以重復(fù)執(zhí)行API命令流,以便數(shù)次渲染圖像數(shù)據(jù)的一個或多個幀。也就是說,重放循環(huán)的單次迭代執(zhí)行API命令流以便渲染圖像數(shù)據(jù)的一個或多個幀。在API命令流結(jié)束時,可以還原API上下文的初始狀態(tài),并且可以重放API命令流以按實質(zhì)上相同的順序重復(fù)操作和重新渲染圖像數(shù)據(jù)的一個或多個幀。API命令可以包括加載特定的著色器程序的調(diào)用、指定包括多個幾何基元(例如三角形)的入棧緩沖區(qū)的調(diào)用、繪制調(diào)用等。API命令流可以保存在存儲器304的重放緩沖區(qū)中并且隨后按用戶的期望重放很多次以便實施調(diào)試操作。
[0033]該重放功能性可以由IDE333或者其他調(diào)試工具利用以便實現(xiàn)各種調(diào)試技術(shù)。例如,可以通過執(zhí)行圖形應(yīng)用程序334并且在特定的幀期間開啟重放循環(huán)來調(diào)試圖形應(yīng)用程序334和/或著色器程序335。斷點(即特殊指令)可以包括在著色器程序335中某一行處,其使得GPU306停住與圖形應(yīng)用程序334相關(guān)聯(lián)的任何進一步指令的執(zhí)行。在一個實施例中,斷點指令使得由GPU306執(zhí)行錯誤處理程序。錯誤處理程序可以使得消息(例如經(jīng)由驅(qū)動程序332)傳送到應(yīng)用程序填充碼。在一個實施例中,應(yīng)用程序填充碼配置為復(fù)制GPU上下文的當(dāng)前狀態(tài)到影子狀態(tài)存儲器336中。一旦GPU上下文的當(dāng)前狀態(tài)已經(jīng)存儲在影子狀態(tài)存儲器336中,則可以允許GPU306繼續(xù)著色器程序335和由API命令流所指定的任何其他指令的執(zhí)行。通常,允許GPU306繼續(xù)執(zhí)行將阻止程序員檢查GPU上下文的狀態(tài)(即寄存器、相關(guān)聯(lián)的存儲器構(gòu)造等),這是因為隨著執(zhí)行附加指令,GPU上下文將被更新。然而,在這種情況下,GPU上下文的狀態(tài)存儲在影子狀態(tài)存儲器336中并且不受允許程序繼續(xù)或允許不同的上下文加載到GPU306的影響。因此,雖然GPU306已經(jīng)繼續(xù)其他任務(wù),但程序員可以檢查在影子狀態(tài)存儲器336中存儲的信息。
[0034]在一個實施例中,GPU306包括以下結(jié)合圖4和5描述的并行處理單元400??梢岳斫猓渌麑嵤├梢园ú捎貌煌軜?gòu)的GPU,并且以下所示的架構(gòu)用于示例性目的。[0035]圖4示出了根據(jù)一個實施例的、并行處理單元(PTO)400。雖然本文中并行處理器提供為PPU400的示范,應(yīng)該強烈注意闡述這樣的處理器僅用于示例性目的,并且出于相同目的可以采用任何處理器以對其進行補充和/或代替。在一個實施例中,PPU400配置為在兩個或更多個流多處理器(SM) 450中并發(fā)執(zhí)行多個線程。線程(即執(zhí)行線程)是在特定的SM450中執(zhí)行的指令集的實例化。下面結(jié)合圖5詳細描述的每個SM450可以包括但不限于一個或多個處理核、一個或多個加載/存儲單元(LSU)、一級(LI)高速緩存、共享存儲器等。
[0036]在一個實施例中,PPU400包括輸入/輸出(I/O)單元405,其配置為經(jīng)系統(tǒng)總線402從中央處理單元(CPU)傳送和接收通信(即命令、數(shù)據(jù)等)。I/O單元405可以實現(xiàn)外圍部件互連快速(PCIe)接口用于經(jīng)PCIe總線通信。在可替代實施例中,I/O單元405可以實現(xiàn)其他類型的已知總線接口。
[0037]PPU400還包括主機接口單元410,其解碼命令并且傳送命令到PPU400的任務(wù)管理單元415或如命令可能指定的其他單元(例如存儲器接口 480)。主機接口單元410配置為在PPU400的各種邏輯單元之間路由通信。
[0038]在一個實施例中,經(jīng)編碼為命令流的程序由CPU寫入緩沖區(qū)。緩沖區(qū)是可由CPU和PPU400兩者訪問(即讀出/寫入)的存儲器中的區(qū)域,存儲器例如存儲器404或系統(tǒng)存儲器。CPU將命令流寫入緩沖區(qū)并且隨后將指向命令流開始的指針傳送到PPU400。主機接口單元410將指向一個或多個流的指針提供給任務(wù)管理單元(TMU) 415。TMU415選擇一個或多個流并且配置為將所選擇的流組織為掛起網(wǎng)格池。掛起網(wǎng)格池可以包括仍然未選擇用于執(zhí)行的新的網(wǎng)格和已經(jīng)部分執(zhí)行并已被暫緩的網(wǎng)格。
[0039]耦連在TMU415和SM450之間的工作分布單元420管理活動網(wǎng)格池,選擇和分派活動網(wǎng)格用于由SM450執(zhí)行。當(dāng)掛起網(wǎng)格有資格執(zhí)行時,即沒有未解決數(shù)據(jù)依賴關(guān)系,掛起網(wǎng)格由TMU415轉(zhuǎn)移到活動網(wǎng)格池。當(dāng)活動網(wǎng)格的執(zhí)行被依賴關(guān)系阻礙(block)時,活動網(wǎng)格被轉(zhuǎn)移到掛起池。當(dāng)網(wǎng)格的執(zhí)行完成時,由工作分布單元420將網(wǎng)格從活動網(wǎng)格池移除。除了接收來自主機接口單元410和工作分布單元420的網(wǎng)格以外,TMU415還接收在網(wǎng)格的執(zhí)行期間由SM450動態(tài)生成的網(wǎng)格。這些動態(tài)生成的網(wǎng)格加入到掛起網(wǎng)格池中的其他掛起網(wǎng)格。
[0040]在一個實施例中,CPU執(zhí)行實現(xiàn)應(yīng)用程序編程接口(API)的驅(qū)動程序內(nèi)核,API使在CPU上執(zhí)行的一個或多個應(yīng)用程序能夠調(diào)度用于在PPU440上執(zhí)行的操作。應(yīng)用程序可以包括使得驅(qū)動程序內(nèi)核生成一個或多個用于執(zhí)行的網(wǎng)格的指令(即API命令)。在一個實施例中,PPU400實現(xiàn)SMD(單指令、多數(shù)據(jù))架構(gòu),其中網(wǎng)格中的每個線程塊(即線程束(warp))由線程塊中的不同的線程針對不同數(shù)據(jù)集并發(fā)執(zhí)行。驅(qū)動程序內(nèi)核定義包括k個相關(guān)線程的線程塊,如此在相同線程塊中的線程可以通過共享存儲器交換數(shù)據(jù)。在一個實施例中,線程塊包括32個相關(guān)線程,并且網(wǎng)格是執(zhí)行相同流的一個或多個線程塊的陣列,并且不同線程塊可以通過全局存儲器交換數(shù)據(jù)。
[0041]在一個實施例中,PPU400包括X個SM450 (X)0例如,PI3MOO可以包括15個各異的SM450。每個SM450都是多線程的并且配置為并發(fā)執(zhí)行來自特定的線程塊的多個線程(例如32個線程)。每個SM450經(jīng)由交叉開關(guān)460 (或其他類型的互連網(wǎng)絡(luò))連接到二級(L2)高速緩存465。L2高速緩存456連接到一個或多個存儲器接口 480。存儲器接口 480實現(xiàn)用于高速數(shù)據(jù)轉(zhuǎn)移的16、32、64、128位數(shù)據(jù)總線等。在一個實施例中,PI3MOO包括U個存儲器接口 480 (U),其中每個存儲器接口 480 (U)連接到對應(yīng)的存儲器設(shè)備404 (U)。例如,PPU400可以連接到多達6個存儲器設(shè)備404,諸如圖形雙倍數(shù)據(jù)率、版本5、同步動態(tài)隨機存取存儲器(⑶DR5SDRAM)。
[0042]在一個實施例中,PPU400實現(xiàn)多級存儲器層次。存儲器404位于耦連到PPU400的SDRAM的片外。來自存儲器404的數(shù)據(jù)可以被獲取并且存儲在L2高速緩存465中,L2高速緩存465位于片上并且在各SM450之間共享。在一個實施例中,每個SM450還實現(xiàn)LI高速緩存。LI高速緩存是專用于特定的SM450的私有存儲器。每個LI高速緩存都耦連到共享L2高速緩存465。可以獲取來自L2高速緩存465的數(shù)據(jù)并且存儲在每個LI高速緩存中用于在SM450的功能單元中處理。
[0043]在一個實施例中PPU400包括圖形處理單元(GPU)。PPU400配置為接收指定用于處理圖形數(shù)據(jù)的著色器程序的命令。圖形數(shù)據(jù)可以定義為諸如點、線、三角形、四邊形、三角形條帶等的基元的集合。典型地,基元包括指定(例如模型空間坐標(biāo)系統(tǒng)中)基元的數(shù)個頂點以及與基元的每個頂點相關(guān)聯(lián)的屬性的數(shù)據(jù)。屬性可以包括位置、顏色、表面法向量、紋理坐標(biāo)等中的一個或多個。PPU400可以配置為處理圖形基元以生成幀緩沖區(qū)(即用于顯示器的每個像素的像素數(shù)據(jù))。驅(qū)動程序內(nèi)核實現(xiàn)圖形處理管線,諸如由OpenGL API所定義的圖形處理管線。
[0044]應(yīng)用程序?qū)⒂糜趫鼍暗哪P蛿?shù)據(jù)(即頂點和屬性的合集)寫入存儲器。模型數(shù)據(jù)定義在顯示器上可見的每個對象。隨后應(yīng)用程序?qū)︱?qū)動程序內(nèi)核進行API調(diào)用,其請求模型數(shù)據(jù)被渲染和顯示。驅(qū)動程序內(nèi)核讀取模型數(shù)據(jù)并且將命令寫入緩沖區(qū)以實施一個或多個操作來處理模型數(shù)據(jù)。命令可以編碼不同的著色器程序,包括頂點著色器、外殼著色器、幾何著色器、像素著色器等中的一個或多個。例如,TMU415可以配置一個或多個SM450以執(zhí)行頂點著色器程序,其處理由模型數(shù)據(jù)所定義的數(shù)個頂點。在一個實施例中,TMU415可以配置不同的SM450并發(fā)地執(zhí)行不同的著色器程序。例如,SM450的第一子集可以配置為執(zhí)行頂點著色器程序,而SM450的第二子集可以配置為執(zhí)行像素著色器程序。SM450的第一子集處理頂點數(shù)據(jù)以產(chǎn)生經(jīng)處理的頂點數(shù)據(jù)并且將經(jīng)處理的頂點數(shù)據(jù)寫入L2高速緩存465和/或存儲器404。在經(jīng)處理的頂點數(shù)據(jù)被光柵化(即從三維數(shù)據(jù)變換為屏幕空間的二維數(shù)據(jù))以產(chǎn)生片段數(shù)據(jù)之后,SM450的第二子集執(zhí)行像素著色器以產(chǎn)生經(jīng)處理的片段數(shù)據(jù),其隨后與其他經(jīng)處理的片段數(shù)據(jù)混合并寫入存儲器404中的幀緩沖區(qū)。頂點著色器程序和像素著色器程序可以并發(fā)執(zhí)行,以管線方式處理來自相同場景的不同數(shù)據(jù)直到所有用于場景的模型數(shù)據(jù)都已經(jīng)渲染到幀緩沖區(qū)。隨后,幀緩沖區(qū)的內(nèi)容傳送到顯示控制器用于在顯示設(shè)備上顯示。
[0045]PPU400可以包括在臺式計算機、筆記本電腦、平板電腦、智能手機(例如無線的、手持設(shè)備)、個人數(shù)字助理(PDA)、數(shù)碼相機、手持電子設(shè)備等中。在一個實施例中,PPU400具體化在單個半導(dǎo)體襯底上。在另一個實施例中,PPU400和一個或多個其他邏輯單元諸如精簡指令集(RISC) CPU、存儲器管理單元(MMU)、數(shù)模轉(zhuǎn)換器(DAC)等一起包括在片上系統(tǒng)(SoC)中。
[0046]在一個實施例中,PPU400可以包括在圖形卡上,其包括諸如⑶DR5SDRAM的一個或多個存儲器設(shè)備404。圖形卡可以配置為與包括例如北橋芯片集和南橋芯片集的臺式計算機的主板上的PCIe槽接口。在又一個實施例中,PPU400可以是包括在主板的芯片集(即北橋)中的集成圖形處理單元(iGPU)。
[0047]圖5示出了根據(jù)一個實施例的、圖4的流多處理器450。如圖5中所示,SM450包括指令高速緩存505、一個或多個調(diào)度器單元510、寄存器堆520、一個或多個處理核550、一個或多個雙精度單元(DPU) 551、一個或多個特殊功能單元(SFU) 552、一個或多個加載/存儲單元(LSU)553、互連網(wǎng)絡(luò)580、共享存儲器/LI高速緩存570和一個或多個紋理單元590。
[0048]如上所述,工作分布單元420分派用于在PPU400的一個或多個SM450上執(zhí)行的活動網(wǎng)格。調(diào)度器單元510從工作分布單元420接收網(wǎng)格并且管理針對每個活動網(wǎng)格的一個或多個線程塊的指令調(diào)度。調(diào)度器單元510調(diào)度線程用于在并行線程組中執(zhí)行,其中每個組被稱為線程束。在一個實施例中,每個線程束包括32個線程。調(diào)度器單元510可以管理多個不同的線程塊,在每個時鐘周期期間分配線程塊到線程束用于執(zhí)行,并且隨后調(diào)度來自各功能單元(即核550、DPU551、SFU552和LSU553)上的多個不同的線程束的指令。
[0049]在一個實施例中,每個調(diào)度器單元510包括一個或多個指令分派單元515。每個分派單元515配置為傳送指令到功能單元中的一個或多個。在圖5所示的實施例中,調(diào)度器單元510包括兩個分派單元515,其使得每個時鐘周期期間來自相同線程束的兩個不同的指令被分派。在可替代實施例中,每個調(diào)度器單元510可以包括單個分派單元515或者附加的分派單元515。
[0050]每個SM450包括寄存器堆520,其提供用于SM450的功能單元的寄存器的集合。在一個實施例中,寄存器堆520在每個功能單元之間劃分,如此為每個功能單元分配寄存器堆520的專用部分。在另一個實施例中,寄存器堆520在正由SM450執(zhí)行的不同線程束之間劃分。寄存器堆520為連接到功能單元的數(shù)據(jù)路徑的操作數(shù)提供臨時存儲。
[0051]每個SM450提供L個處理核550。在一個實施例中SM450包括大量(例如192個等)各異的處理核550。每個核550是全管線(fully-pipelined)的單精度處理單元,其包括浮點運算邏輯單元和整數(shù)運算邏輯單元。在一個實施例中,浮點運算邏輯單元實現(xiàn)IEEE754-2008標(biāo)準(zhǔn)用于浮點運算。每個SM450還包括實現(xiàn)雙精度浮點運算的M個DPU551、實施特殊功能(例如像素混合操作等)的N個SFU552和實施共享存儲器/LI高速緩存570與寄存器堆520之間的加載和存儲操作的P個LSU553。在一個實施例中,SM450包括64個DPU55U32 個 SFU552 和 32 個 LSU553。
[0052]每個SM450包括互連網(wǎng)絡(luò)580,其將每個功能單元連接到寄存器堆520和共享存儲器/LI高速緩存570。在一個實施例中,互連網(wǎng)絡(luò)580是可以配置為將任何功能單元連接到寄存器堆520中的寄存器或共享存儲器/LI高速緩存570中的任何存儲器位置的交叉開關(guān)。
[0053]在一個實施例中,SM450在GPU中實現(xiàn)。在這樣的實施例中,SM450包括J個紋理單元590。紋理單元590配置為從存儲器404加載紋理圖(例如紋理元素的2D陣列)并采樣紋理圖以產(chǎn)生經(jīng)采樣的紋理值在著色器程序中使用。紋理單元590使用錐形紋理(mip-map)(即改變細節(jié)層級的紋理圖)來實現(xiàn)諸如抗鋸齒操作的紋理操作。在一個實施例中,SM450包括16個紋理單元590。
[0054]上述PPU400可以配置為實施比常規(guī)CPU快得多的高并行計算。并行計算在圖形處理、數(shù)據(jù)壓縮、計量生物學(xué)、流處理算法等方面具有優(yōu)點。
[0055]圖6是根據(jù)一個實施例的、由圖4的PPU400實現(xiàn)的圖形處理管線600的示意圖。圖形處理管線600是實現(xiàn)從3D幾何數(shù)據(jù)生成2D計算機生成圖像的處理步驟的抽象流程圖。如已知的,通過將操作切分為多個級,管線架構(gòu)可以更有效地實施長延遲操作,其中每個級的輸出耦連到下一個連續(xù)級的輸入。因此,圖形處理管線接收輸入數(shù)據(jù)601,輸入數(shù)據(jù)601從圖形處理管線600的一級傳送到下一級以生成輸出數(shù)據(jù)602。在一個實施例中,圖形處理管線600可以表示由OpenGL API所定義的圖形處理管線。
[0056]如圖6所示,圖形處理管線600包括其包括數(shù)個級的管線架構(gòu)。級包括但不限于數(shù)據(jù)匯編級610、頂點著色級620、基元匯編級630、幾何著色級640、視口縮放、剔除和裁剪(VSCC)級650、光柵化級660、片段著色級670和光柵操作級680。在一個實施例中,輸入數(shù)據(jù)601包括配置處理單元以實現(xiàn)圖形處理單元600的級的命令和將由級處理的幾何基元(例如點、線、三角形、四邊形、三角形條帶或扇形等)。輸出數(shù)據(jù)602可以包括復(fù)制到存儲器中的幀緩沖區(qū)或其他類型的表面數(shù)據(jù)結(jié)構(gòu)中的像素數(shù)據(jù)(即顏色數(shù)據(jù))。
[0057]數(shù)據(jù)匯編級610接收輸入數(shù)據(jù)601,其指定頂點數(shù)據(jù)用于高階(high-order)表面、基元等。諸如通過從主機處理器接收包括指向存儲器中的緩沖區(qū)的指針的命令并且從緩沖區(qū)讀取頂點數(shù)據(jù),數(shù)據(jù)匯編級610將頂點數(shù)據(jù)收集到臨時存儲或隊列中。隨后將頂點數(shù)據(jù)傳送到頂點著色級620用于處理。
[0058]頂點著色級620通過為每個頂點實施一次操作集(即頂點著色器或程序)來處理頂點數(shù)據(jù)。頂點可以例如指定為與一個或多個頂點屬性相關(guān)聯(lián)的4-坐標(biāo)矢量。頂點著色級620可以操縱諸如位置、顏色、紋理坐標(biāo)等的特性。也就是說,頂點著色級620實施針對頂點坐標(biāo)或者與頂點相關(guān)聯(lián)的其他頂點屬性的操作。這樣的操作一般包括加亮(lighting)操作(即修改頂點的顏色屬性)和變換操作(即修改頂點的坐標(biāo)空間)。例如,可以使用對象坐標(biāo)空間中的坐標(biāo)來指定頂點,對象坐標(biāo)空間通過將坐標(biāo)與把坐標(biāo)從對象坐標(biāo)空間轉(zhuǎn)變?yōu)槭澜缱鴺?biāo)或規(guī)格化設(shè)備坐標(biāo)(NCD)空間的矩陣相乘來進行變換。頂點著色級620生成經(jīng)變換的頂點數(shù)據(jù),其傳送到基元匯編級630。
[0059]基元匯編級630收集由頂點著色級620輸出的頂點,并且將頂點分組為幾何基元用于由幾何著色級640處理。例如,基元匯編級630可以配置為將每三個連貫的頂點分組為幾何基元(即三角形)用于傳送到幾何著色級640。在一些實施例中,具體的頂點可以被重復(fù)用于連貫的幾何基元(例如在三角形條帶中的兩個連貫的三角形可以共享兩個頂點)?;獏R編級630傳送幾何基元(即相關(guān)聯(lián)的頂點的合集)到幾何著色級640。
[0060]幾何著色級640通過針對幾何基元實施操作集(即幾何著色器或程序)來處理幾何基元。曲面細分操作可以從每個幾何基元生成一個或多個幾何基元。也就是說,幾何著色器可以將每個幾何基元細分為更精細的網(wǎng)孔的兩個或更多個幾何基元,用于由圖形處理管線600的其余部分處理。幾何著色級640傳送幾何基元到視口 SCC級650。
[0061]視口 SCC級650實施幾何基元的視口縮放、剔除和裁剪。每個被渲染的表面與抽象攝像位置相關(guān)聯(lián)。攝像位置表示觀看場景的觀察者的位置并且定義將場景的對象包圍的視體(viewing frustum)0視體可包括視平面、后平面和四個裁剪平面。完全處于視體之外的任何幾何基元可以被剔除(即丟棄),因為該幾何基元將不利于最終渲染的場景。部分在視體內(nèi)并且部分在視體外的任何幾何基元可以被裁剪(即變換成包圍在視體內(nèi)的新的幾何基元)。此外,可以基于視體的深度來縮放每個幾何基元。隨后傳送所有潛在可視的幾何基元到光柵化級660。[0062]光柵化級660將3D幾何基元轉(zhuǎn)換為2D片段。光柵化級660可以配置為利用幾何基元的頂點來設(shè)置各種屬性可以根據(jù)其插值的一組平面方程。光柵化級660還為多個像素計算覆蓋掩膜,其指示用于像素的一個或多個采樣位置是否攔截幾何基元。在一個實施例中,還可以實施z測試以確定幾何基元是否被已經(jīng)光柵化的其他幾何基元所遮蔽。光柵化級660生成片段數(shù)據(jù)(即與每個覆蓋像素的特定的采樣位置相關(guān)聯(lián)的經(jīng)插值的頂點屬性),其傳送到片段著色級670。
[0063]片段著色級670通過針對每個片段實施操作集(即片段著色器或程序)來處理片段數(shù)據(jù)。片段著色級670可以諸如通過為片段實施加亮操作或使用經(jīng)插值的紋理坐標(biāo)采樣紋理圖,來生成用于片段的像素數(shù)據(jù)(即顏色值)。片段著色級670生成像素數(shù)據(jù),其傳送到光柵操作級680。
[0064]光柵操作級680可以針對像素數(shù)據(jù)實施各種操作,諸如實施阿爾法測試、模板測試以及將像素數(shù)據(jù)與對應(yīng)于和像素相關(guān)聯(lián)的其他片段的其他像素數(shù)據(jù)混合。當(dāng)光柵操作級680已經(jīng)完成處理像素數(shù)據(jù)時(即輸出數(shù)據(jù)602),可以將像素數(shù)據(jù)寫入渲染目標(biāo),諸如幀緩沖區(qū)、顏色緩沖區(qū)等。
[0065]可以理解,除了上述一個或多個級之外或者代替上述一個或多個級,圖形處理管線600中可以包括一個或多個附加的級。抽象圖形處理管線的各種實現(xiàn)可以實現(xiàn)不同的級。此外,在一些實施例中可以從圖形處理管線中排除上述一個或多個級(諸如幾何著色級640)。其他類型的圖形處理管線可以視為包括在本公開的范圍內(nèi)。此外,圖形處理管線600中的任何級可以由圖形處理器中的一個或多個專用硬件單元諸如PPU400實現(xiàn)。圖形處理管線600中的其他級可以由可編程硬件單元諸如PPU400的SM450實現(xiàn)。
[0066]與在GPU306上啟動單個內(nèi)核,開啟數(shù)百或數(shù)千個線程的GPGPU程序不同,圖形程序通過在GPU306上啟動初始內(nèi)核來實現(xiàn),初始內(nèi)核轉(zhuǎn)而無需CPU301的干預(yù)而啟動一個或多個后續(xù)的內(nèi)核。例如,圖形程序可以在GPU306上啟動內(nèi)核以在一個SM450(或多個SM450 )上實施頂點著色級620。隨后該內(nèi)核啟動單獨的內(nèi)核以實施幾何著色級640,其轉(zhuǎn)而啟動另一個內(nèi)核以實施片段著色器670等。另外,圖形處理管線600的一些其他級可以在諸如光柵器或者數(shù)據(jù)匯編器的固定的單元硬件上實現(xiàn)??梢岳斫?,來自一個內(nèi)核的結(jié)果在由后續(xù)的內(nèi)核在SM450上處理之前,可以由一個或多個中間固定功能硬件單元處理。結(jié)果,GPGPU程序可以通過加載經(jīng)保存的狀態(tài)到SM450中的一個并且重新啟動停住的內(nèi)核來潛在地還原,與GPGPU程序不同,圖形程序重新加載困難得多,這是因為很多固定功能單元沒有慮及將被重新加載的經(jīng)保存的狀態(tài)。上述的重放機制解除了該問題。
[0067]圖7A示出了根據(jù)一個實施例的、用于著色器程序700的代碼的一部分。如圖7A中所示,著色器程序700是以高級著色器語言諸如NVIDIA0Cg (用于圖形的C)編程的頂點著色器。著色器程序700是開發(fā)用于渲染經(jīng)曲面細分的幾何體的代碼的一部分??梢岳斫?,著色器程序700的代碼僅用于示例性目的,并且可以使用本文所述的技術(shù)調(diào)試任何著色器程序代碼。
[0068]如上所述,數(shù)據(jù)匯編級610從圖形應(yīng)用程序334接收幾何基元列表。API上下文配置為設(shè)定PPU400的狀態(tài)以實現(xiàn)圖形處理管線600的至少一部分。一旦API上下文被設(shè)置,則另一個API命令可以在PPU200上啟動任務(wù)。任務(wù)可以包括配置為實現(xiàn)例如著色器程序的多個線程。多個線程中的每個線程表示著色器程序700的單個實例。隨著頂點從數(shù)據(jù)匯編級610傳送到頂點著色級620,調(diào)度器單元520分配頂點給可用線程。
[0069]圖7B示出了根據(jù)另一個實施例的、用于使用單個GPU306調(diào)試著色器程序335的系統(tǒng)750。如圖7B所示,系統(tǒng)750包括圖形應(yīng)用程序334、API攔截模塊755、驅(qū)動程序332、GPU306和顯示設(shè)備308。圖形應(yīng)用程序334、API攔截模塊755和驅(qū)動程序332由CPU301執(zhí)行。為了調(diào)試著色器程序335的源代碼,源代碼可以由編譯器編譯并存儲在GPU306可訪問的存儲器中。圖形應(yīng)用程序334生成API命令流,其包括加載著色器程序335到PPU400的SM450上并且在SM450上啟動數(shù)個線程的至少一個命令,每個線程是著色器程序335的實例。API攔截模塊755配置為攔截由圖形應(yīng)用程序334所生成的API命令流。API攔截模塊755通過管理狀態(tài)模型來跟蹤API上下文的狀態(tài),狀態(tài)模型配置為對響應(yīng)于API命令流而改變API上下文的狀態(tài)進行仿真。API攔截模塊755轉(zhuǎn)發(fā)API命令流到驅(qū)動程序332。另外,在一些實施例中,可以轉(zhuǎn)發(fā)API命令流到一個或多個中間軟件層,諸如實施Drict3D@API的運行時庫。驅(qū)動程序332隨后將API命令轉(zhuǎn)譯為發(fā)送到GPU306的命令或指令以實施生成圖像數(shù)據(jù)用于在顯示設(shè)備308上顯示的各種操作。
[0070]為了開始調(diào)試圖形程序的源代碼335,IDE333可以傳送命令到API攔截模塊755。在下一幀開始時,API攔截模塊755可以存儲API上下文的初始狀態(tài)。隨后,API攔截模塊755將由圖形應(yīng)用程序334為一個或多個幀生成的API命令流存儲在重放緩沖區(qū)中。一旦API命令流已經(jīng)存儲在重放緩沖區(qū)中,則API攔截模塊755隨后開啟重放循環(huán)直到GPU306遇到斷點。另外,斷點是由IDE333插入到經(jīng)編譯的著色器程序335中的特殊指令。當(dāng)斷點由GPU306執(zhí)行時,錯誤處理程序被執(zhí)行,其使得API攔截模塊755將GPU上下文的當(dāng)前狀態(tài)存儲到影子狀態(tài)存儲器336。可以理解,存儲GPU上下文的當(dāng)前狀態(tài)包括將與狀態(tài)模型相關(guān)的信息,包括參數(shù)、寄存器值和共享存儲器,復(fù)制到影子狀態(tài)存儲器336。在一個實施例中,GPU上下文包括與當(dāng)前活動線程、寄存器值、本地存儲器值、在全局存儲器中存儲的緩沖區(qū)等相關(guān)的信息。一旦GPU上下文的當(dāng)前狀態(tài)保存到影子狀態(tài)存儲器336中,則可以允許GPU306上的線程完成執(zhí)行。GPU306隨后可以自由處理不同的上下文。結(jié)果,允許顯示設(shè)備308生成新的圖像數(shù)據(jù)用于顯示,使得不會因為顯示設(shè)備308停止接收視頻信號而使顯示設(shè)備308定格在前面的幀或關(guān)閉。
[0071]返回圖7A,API攔截模塊755使能使用采用單個GPU306的系統(tǒng)來實現(xiàn)各種調(diào)試功能性。例如程序員可以使用IDE333來將斷點插入到著色器程序335的源代碼中。程序員可以選擇源代碼的具體的行并且使用由IDE333實現(xiàn)的命令來插入斷點。一旦程序員已經(jīng)指定斷點,則程序員可以選擇IDE333中的命令以編譯和執(zhí)行著色器程序335的源代碼的當(dāng)前版本。在一個實施例中,可以使用二進制補丁技術(shù)將斷點插入著色器程序335的已經(jīng)編譯的版本中(即代替著色器程序中的指令以跳轉(zhuǎn)到包括斷點的指令集)。可以執(zhí)行圖形應(yīng)用程序334,其生成傳送到諸如驅(qū)動程序332的軟件層的API命令流。API命令創(chuàng)建API上下文以便渲染視頻數(shù)據(jù)的幀。API命令流使得經(jīng)修改的著色器程序335由GPU306執(zhí)行。
[0072]一旦到達第一斷點,則在GPU306中執(zhí)行錯誤處理程序并且錯誤處理程序的指令使得API攔截模塊755將GPU上下文的狀態(tài)保存到影子狀態(tài)存儲器336。隨后,GPU306允許繼續(xù)線程的執(zhí)行直到幀已經(jīng)被渲染。程序員隨后可以使用由IDE333實現(xiàn)的圖形用戶接口(⑶I)來檢驗保存在影子狀態(tài)存儲器336中的GPU上下文的狀態(tài)。一旦程序員已經(jīng)檢驗GPU306的狀態(tài)在第一斷點處,則程序員可以重復(fù)該過程,在著色器程序335的源代碼中設(shè)定不同的斷點。
[0073]可以使用重放機制實現(xiàn)的另一個調(diào)試機制是指令步進??梢岳斫?,步進到下一個指令或者下一個斷點不像簡單執(zhí)行下一個掛起指令用于線程或線程組那樣容易,這是因為GPU不能停住一段時間同時等待程序員指示程序應(yīng)該繼續(xù)執(zhí)行,而又不定格在顯示設(shè)備308上顯示的圖像。因此,可以利用由API攔截模塊755使能的重放功能性來重復(fù)執(zhí)行API命令流,允許GPU306繼續(xù)執(zhí)行的同時,在程序中的不同點處停住執(zhí)行、在重放循環(huán)的每次迭代期間存儲在不同點處的GPU上下文的當(dāng)前狀態(tài)以及顯示GPU上下文的經(jīng)存儲的狀態(tài)。
[0074]在一個實施例中,API攔截模塊755配置為在重放循環(huán)的每次經(jīng)過期間還原API上下文的初始狀態(tài)。一旦API上下文的初始狀態(tài)已經(jīng)還原,則API攔截模塊755可以傳送存儲在重放緩沖區(qū)中的API命令流到軟件層,其使得GPU306渲染一個或多個幀。對于在斷點之間的指令步進,API攔截模塊755可以跟蹤已經(jīng)遇到的斷點的列表。每個斷點可以與著色器程序335中的特定的行數(shù)以及特定的API命令(例如第三繪制調(diào)用)相關(guān)聯(lián)。斷點還可以與其他狀態(tài)諸如特定的基元(例如頂點、三角形、片段等)、特定的幀等相關(guān)聯(lián)。隨著GPU306執(zhí)行斷點,錯誤處理程序使得API攔截模塊755評估造成錯誤的特定斷點以及確定是否應(yīng)該允許程序繼續(xù)或者當(dāng)前斷點是否是應(yīng)該顯示給程序員的按順序的下一個斷點。下一個斷點可以表示來自前面指令的單個步驟。
[0075]以這種方式,一個指令接一個指令地或者一個斷點接一個斷點地步進程序。然而,實際上每次處理重放循環(huán)都重新渲染整個幀(或者一些幀),在渲染過程中API攔截模塊755僅嘗試捕獲在不同點處的GPU上下文的狀態(tài)。實際上,在重放循環(huán)的每次經(jīng)過期間由GPU306執(zhí)行的真正順序可以不同。也就是說,雖然API命令流具有不變的順序,但GPU306的架構(gòu)可以基于各種調(diào)度算法按不同的順序調(diào)度特定線程的執(zhí)行,如此,與重放循環(huán)的前面的迭代相比,在重放循環(huán)的不同迭代期間線程的執(zhí)行順序可以不是恰好相同的,但是用于感興趣的特定線程的狀態(tài)可以被準(zhǔn)確還原。然而,通過繼續(xù)步進指令并且在每一步期間監(jiān)查GPU上下文的狀態(tài),與常規(guī)的調(diào)試工具類似,程序表現(xiàn)為順序執(zhí)行并且程序員可以識別源代碼中潛在的漏洞。
[0076]可以理解,在某些架構(gòu)中,特定的著色器程序335可以實質(zhì)上以數(shù)百或數(shù)千個線程并行執(zhí)行。因此,著色器程序335中的單個斷點可以在一個時鐘周期期間到達用于特定的線程組(即線程束),而相同斷點可以在一個或多個附加時鐘周期期間到達用于是相同著色器程序335的實例的不同線程組。例如,片段著色器可以針對圖像中的每個像素執(zhí)行一次或多次,其中1080p HD圖像具有超過2百萬個像素。GPU306在給定的時鐘周期只能處理那些線程的一部分。因此,對于相關(guān)線程組,著色器程序335中的單個斷點可以到達數(shù)次。在一個實施例中,API攔截模塊755跟蹤重放循環(huán)的當(dāng)前經(jīng)過已經(jīng)遇到特定斷點的次數(shù)。也就是說,API攔截模塊755可以保持計算器,其指示在特定的調(diào)試會話期間斷點已經(jīng)被命中多少次。隨后在重放循環(huán)的特定經(jīng)過期間,API攔截模塊755將跟蹤特定斷點已經(jīng)觸發(fā)錯誤處理程序多少次。如果在重放循環(huán)的該特定經(jīng)過期間斷點尚未遇到閾值次數(shù),那么API攔截模塊755允許GPU306繼續(xù)執(zhí)行。然而,如果在重放循環(huán)的該特定經(jīng)過期間斷點已經(jīng)遇到閾值次數(shù),那么API攔截模塊755使得GPU上下文的當(dāng)前狀態(tài)存儲到影子狀態(tài)存儲器336。該類型的操作提供著色器程序355的執(zhí)行進展的假象,甚至在只存在包括在著色器程序335中的單個斷點時。[0077]也就是說,在由數(shù)百或數(shù)千線程并行執(zhí)行的著色器程序中的第一斷點處停止,將總是會停止在幀開始附近的特定點處的渲染。通過在重放循環(huán)的每次迭代期間自動跳過數(shù)個斷點以前進到幀的渲染中的不同的點來提供進展的假象。
[0078]圖8A、8B和8C示出了根據(jù)另一個實施例的、用于采用單個GPU306調(diào)試圖形程序的方法800的流程圖。在步驟802,API攔截模塊755監(jiān)視由圖形應(yīng)用程序334所生成的API命令流。在一個實施例中,API攔截模塊755是應(yīng)用程序填充碼,其配置為攔截由圖形應(yīng)用程序334所生成的API命令并且管理表示與圖形應(yīng)用程序334相關(guān)聯(lián)的API上下文的狀態(tài)模型。在步驟804,API攔截模塊755確定是否捕獲下一個幀。在一個實施例中,API攔截模塊755可以配置為從IDE333接收命令,其使得API攔截模塊755捕獲用于下個幀的API命令流。在另一個實施例中,API攔截模塊755可以配置為當(dāng)?shù)谝粩帱c在著色器程序中設(shè)定時自動捕獲幀,并且配置為當(dāng)從著色器程序335移除所有斷點時不自動捕獲幀。如果API攔截模塊755尚未接收到捕獲下一個幀的指令,那么API攔截模塊755繼續(xù)監(jiān)控由圖形應(yīng)用程序334所生成的API命令流。然而,如果API攔截模塊755已經(jīng)接收到捕獲下一個幀的指令,那么在步驟806,API攔截模塊755捕獲API上下文的初始狀態(tài)。在一個實施例中,API攔截模塊755在存儲器304中創(chuàng)建在下一個幀開始時的狀態(tài)模型的復(fù)制。
[0079]在步驟808,API攔截模塊755將用于當(dāng)前幀的API命令流存儲在重放緩沖區(qū)中。重放緩沖區(qū)是存儲器304中的數(shù)據(jù)結(jié)構(gòu),其維護用于至少一個幀的API命令的有序列表。在步驟810,API攔截模塊755可以暫停圖形應(yīng)用程序334的執(zhí)行??梢岳斫?,在如今的現(xiàn)代操作系統(tǒng)中某些進程可以停住。在步驟812,API攔截模塊755開啟重放循環(huán)。重放循環(huán)的每個經(jīng)過將會把API的上下文重新設(shè)定為在步驟806所捕獲的API上下文的初始狀態(tài),并且重新傳送存儲在重放緩沖區(qū)中的API命令流到軟件層以一次或多次重新渲染幀。
[0080]在步驟814,API攔截模塊755將API上下文的狀態(tài)重新設(shè)定為API上下文的初始狀態(tài)。在一個實施例中,API攔截模塊755可以配置為生成表示保存在存儲器304中的API上下文的初始狀態(tài)的新的API上下文。可以通過發(fā)出包括與API上下文的初始狀態(tài)相關(guān)的參數(shù)的新的API命令來生成新的API上下文。在另一個實施例中,API攔截模塊755配置為生成修改當(dāng)前API上下文的API命令,以便重新設(shè)定API上下文的初始狀態(tài)。可以理解,API攔截模塊755還可以配置為基于API上下文的初始狀態(tài)來重新設(shè)定存儲器304中的對象(例如緩沖區(qū)、紋理等)的狀態(tài)。
[0081]在步驟816,API攔截模塊755將API命令從存儲在重放緩沖區(qū)中的API命令流傳送到軟件層。另外,軟件層可以是實現(xiàn)API的驅(qū)動程序或運行時庫。在步驟818,API攔截模塊755確定是否已經(jīng)到達斷點。在一個實施例中,當(dāng)?shù)竭_斷點時,GPU306執(zhí)行錯誤處理程序,其使得消息傳送到驅(qū)動程序332。驅(qū)動程序332可以通知API攔截模塊755,斷點已經(jīng)使得GPU306停住圖形程序的執(zhí)行以及API攔截模塊755可以實施與斷點相關(guān)的各種操作。如果尚未到達斷點,那么方法800返回步驟816,其中將重放緩沖區(qū)中的下一個API命令傳送到軟件層。然而,如果斷點已經(jīng)到達,那么在步驟820,API攔截模塊755確定是否繼續(xù)執(zhí)行。在一個實施例中,API攔截模塊755確定觸發(fā)錯誤處理程序的特定斷點是否應(yīng)該使得API攔截模塊755將GPU上下文的當(dāng)前狀態(tài)存儲到影子狀態(tài)存儲器336。例如,如果之前已經(jīng)到達斷點并且API攔截模塊755配置為通過等待直到稍后的線程觸發(fā)斷點來提供進展的假象,那么API攔截模塊755允許GPU繼續(xù)執(zhí)行并且方法返回到步驟818以等待下一個斷點。然而,如果應(yīng)該停止執(zhí)行,那么在步驟822,將GPU上下文存儲到影子狀態(tài)存儲器336。一旦GPU上下文存儲到影子狀態(tài)存儲器336,則在步驟824,可以恢復(fù)GPU并且允許其繼續(xù)執(zhí)行。
[0082]在步驟826,API攔截模塊755傳送重放緩沖區(qū)中的下一個API命令到軟件層。在步驟828,API攔截模塊755確定是否已經(jīng)到達幀結(jié)束。API命令流中的特定API命令可以指示已經(jīng)到達幀結(jié)束。如果尚未到達幀結(jié)束,那么方法800返回步驟826,并且傳送另一個API命令到軟件層。然而,如果已經(jīng)到達幀結(jié)束,那么在步驟830,API攔截模塊755確定是否采用重放循環(huán)的另一經(jīng)過來繼續(xù)。API攔截模塊755可以等待來自調(diào)試工具的命令,其指示程序員想實施另一經(jīng)過并且監(jiān)查程序中的不同點處的GPU上下文。如果API攔截模塊755確定應(yīng)該進行重放循環(huán)的另一經(jīng)過,那么方法800返回到步驟814,其中還原API上下文的初始狀態(tài)。然而,如果API攔截模塊755確定應(yīng)該終止重放循環(huán),那么在步驟832,API攔截模塊755清理重放循環(huán)。在一個實施例中,API攔截模塊755可以釋放用于影子狀態(tài)存儲器336的存儲器、API的初始狀態(tài)等。在步驟832之后,方法800終止。
[0083]圖9示出了前面各種實施例的各種架構(gòu)和/或功能性可以在其中實現(xiàn)的示例性系統(tǒng)900。如圖所示,提供系統(tǒng)900,其包括連接到通信總線902的至少一個中央處理器901??梢允褂萌魏芜m合的協(xié)議實現(xiàn)通信總線902,諸如PCI (外圍部件互連)、PC1-Express, AGP(加速圖形端口)、超傳輸或者任何其他總線或點到點通信協(xié)議。系統(tǒng)900還包括主存儲器904??刂七壿?軟件)和數(shù)據(jù)存儲在主存儲器904中,其采取隨機存取存儲器(RAM)的形式。
[0084]系統(tǒng)900還包括輸入設(shè)備912、圖形處理器906和顯示器908,即常規(guī)的CRT(陰極射線管)、IXD (液晶顯示)、LED (發(fā)光二極管)、等離子顯示器等。可以從輸入設(shè)備912接收用戶輸入,例如鍵盤、鼠標(biāo)、觸摸板、麥克風(fēng)等。在一個實施例中,圖形處理器906可以包括多個著色器模塊、光柵化模塊等。前述模塊的每個甚至可以布置在單個半導(dǎo)體平臺以形成圖形處理單元(GPU)。
[0085]在本說明中,單個半導(dǎo)體平臺可以指唯一的單一基于半導(dǎo)體的集成電路或芯片。應(yīng)該注意,術(shù)語單個半導(dǎo)體平臺還可以指具有增強的連通性的多芯片模塊,其仿真片上操作并且通過利用常規(guī)中央處理單元(CPU)和總線實現(xiàn)方案取得實質(zhì)性改善。各種模塊還可以根據(jù)用戶的期望單獨擺放或者擺放在半導(dǎo)體平臺的各種組合中。
[0086]系統(tǒng)900還可以包括二級存儲910。二級存儲910包括例如硬盤驅(qū)動器和/或可移動存儲驅(qū)動器,其表示軟盤驅(qū)動器、磁帶驅(qū)動器、光盤驅(qū)動器、數(shù)字通用光盤(DVD)驅(qū)動器、記錄設(shè)備、通用串行總線(USB)閃存??梢苿哟鎯︱?qū)動器以已知的方式從可移動存儲單元讀取和/或?qū)懭肟梢苿哟鎯卧?br>
[0087]計算機程序或者計算機控制邏輯算法可以存儲在主存儲器904和/或二級存儲910中。這樣的計算機程序當(dāng)被執(zhí)行時使得系統(tǒng)900能夠?qū)嵤└髯怨δ?。存儲?04、存儲910和/或任何其他存儲是計算機可讀介質(zhì)的可能的示例。
[0088]在一個實施例中,前面各種圖的架構(gòu)和/或功能性可以以下內(nèi)容的環(huán)境中實現(xiàn):中央處理器901、圖形處理器906、能夠具有中央處理器901和圖形處理器906 二者的至少部分能力的集成電路(未示出)、芯片集(即設(shè)計為作為用于實施相關(guān)功能的單元而工作和銷售的集成電路等)和/或任何其他用于此的集成電路。
[0089]另外,前面各種圖的架構(gòu)和/或功能性可以在以下內(nèi)容的環(huán)境中實現(xiàn):通用計算機系統(tǒng)、電路板系統(tǒng)、專用于娛樂目的的游戲控制臺系統(tǒng)、特定于應(yīng)用程序的系統(tǒng)和/或任何其他期望的系統(tǒng)。例如,系統(tǒng)900可以采取臺式計算機、筆記本電腦、服務(wù)器、工作站、游戲控制臺、嵌入式系統(tǒng)和/或其他任何類型的邏輯的形式。另外系統(tǒng)900可以采取各種其他設(shè)備形式,包括但不限于個人數(shù)字助理設(shè)備(PDA)、移動電話設(shè)備、電視等。
[0090]此外,雖然沒有示出,系統(tǒng)900為通信的目的可以耦連到網(wǎng)絡(luò)(例如電信網(wǎng)絡(luò)、局域網(wǎng)(LAN)、無線網(wǎng)絡(luò)、諸如互聯(lián)網(wǎng)的廣域網(wǎng)(WAN)、對等網(wǎng)絡(luò)、有線網(wǎng)絡(luò)等)。
[0091]雖然以上已經(jīng)描述了各實施例,但是應(yīng)該理解它們通過僅示例而非限制的方式加以呈現(xiàn)。因此,優(yōu)選實施例的寬度和范圍不應(yīng)該被上述示例性實施例中的任何一個所限制,而應(yīng)該僅根據(jù)下面的權(quán)利要求及其等同物所定義。
【權(quán)利要求】
1.一種方法,包括: 將應(yīng)用程序編程接口(API)上下文的初始狀態(tài)存儲在存儲器中,其中所述API上下文的所述初始狀態(tài)與幀的開始相對應(yīng); 攔截與所述幀相關(guān)聯(lián)的API命令流,其中所述API命令流由圖形應(yīng)用程序生成; 將所述API命令流傳送到實現(xiàn)所述API的軟件層以渲染所述幀;以及 響應(yīng)于斷點,將圖形處理單元(GPU)上下文存儲在所述存儲器中。
2.根據(jù)權(quán)利要求1所述的方法,進一步包括執(zhí)行重放循環(huán),包括: 生成一個或多個API命令以將所述API上下文還原到所述初始狀態(tài); 重新傳送所述API命令流到所述軟件層以重新渲染所述幀;以及 響應(yīng)于另一個斷點,將另一個GPU上下文存儲在所述存儲器中。
3.根據(jù)權(quán)利要求2所述的方法,其中所述重放循環(huán)響應(yīng)于從集成開發(fā)環(huán)境(IDE)所接收的命令而重復(fù)。
4.根據(jù)權(quán)利要求1所述的方法,其中所述軟件層是驅(qū)動程序。
5.根據(jù)權(quán)利要求4所述的方法,其中所述驅(qū)動程序?qū)崿F(xiàn)OpenGL0API。
6.根據(jù)權(quán)利要求1所述的方法,其中所述軟件層是運行時庫。
7.根據(jù)權(quán)利要求6所述的方法,其中所述運行時庫實現(xiàn)DireCt3D@API。
8.根據(jù)權(quán)利要求1所述的方法,進一步包括跟蹤所述API上下文的狀態(tài)。
9.根據(jù)權(quán)利要求8所述的方法,其中跟蹤所述API上下文的狀態(tài)包括: 開啟與所述圖形應(yīng)用程序相關(guān)聯(lián)的狀態(tài)模型;以及 針對由所述圖形應(yīng)用程序所生成的每個API命令,基于所述API命令更新所述狀態(tài)模型。
10.根據(jù)權(quán)利要求1所述的方法,其中所述API命令流由應(yīng)用程序填充碼攔截。
11.根據(jù)權(quán)利要求1所述的方法,進一步包括: 響應(yīng)于斷點,確定是否基于所述斷點繼續(xù)執(zhí)行;以及 如果應(yīng)該繼續(xù)執(zhí)行,那么傳送API命令到所述軟件層以恢復(fù)執(zhí)行,或者 如果不應(yīng)該繼續(xù)執(zhí)行,那么將所述GPU上下文存儲在所述存儲器中。
12.根據(jù)權(quán)利要求11所述的方法,其中確定是否基于所述斷點繼續(xù)執(zhí)行包括,將與所述斷點相關(guān)聯(lián)的計數(shù)器和與所述重放循環(huán)的迭代數(shù)目相關(guān)聯(lián)的閾值相比較。
13.根據(jù)權(quán)利要求1所述的方法,其中所述API上下文的所述初始狀態(tài)表示在所述幀開頭的與所述API上下文相關(guān)聯(lián)的圖形處理單元的狀態(tài)。
14.一種存儲指令的非短暫性計算機可讀存儲介質(zhì),當(dāng)所述指令由處理器執(zhí)行時,使得所述處理器實施以下步驟: 將應(yīng)用程序編程接口(API)上下文的初始狀態(tài)存儲在存儲器中,其中所述API上下文的所述初始狀態(tài)與幀的開始相對應(yīng); 攔截與所述幀相關(guān)聯(lián)的API命令流,其中所述API命令流由圖形應(yīng)用程序生成; 將所述API命令流傳送到實現(xiàn)所述API的軟件層以渲染所述幀;以及 響應(yīng)于斷點,將圖形處理單元(GPU)上下文存儲在所述存儲器中。
15.根據(jù)權(quán)利要求14所述的非短暫性計算機可讀存儲介質(zhì),其中所述軟件層是驅(qū)動程序。
16.根據(jù)權(quán)利要求14所述的非短暫性計算機可讀存儲介質(zhì),其中所述步驟進一步包括通過以下步驟跟蹤所述API上下文的狀態(tài): 開啟與所述圖形應(yīng)用程序相關(guān)聯(lián)的狀態(tài)模型;以及 針對由所述圖形應(yīng)用程序所生成的每個API命令,基于所述API命令更新所述狀態(tài)模型。
17.—種系統(tǒng),包括: 圖形處理單元(GPU); 存儲器,配置為存儲應(yīng)用程序填充碼,所述應(yīng)用程序填充碼配置為: 將應(yīng)用程序編程接口(API)上下文的初始狀態(tài)存儲在存儲器中,其中所述API上下文的所述初始狀態(tài)與幀的開始相對應(yīng); 攔截與所述幀相關(guān)聯(lián)的API命令流,其中所述API命令流由圖形應(yīng)用程序生成; 將所述API命令流傳送到實現(xiàn)所述API的軟件層以渲染所述幀;以及 響應(yīng)于斷點,將GPU上下文存儲在所述存儲器中。
18.根據(jù)權(quán)利 要求17所述的系統(tǒng),其中所述圖形應(yīng)用程序與配置為由所述GPU執(zhí)行的一個或多個著色器程序相關(guān)聯(lián)。
19.根據(jù)權(quán)利要求17所述的系統(tǒng),其中所述軟件層包括實現(xiàn)OpenGLAPI的驅(qū)動程序。
20.根據(jù)權(quán)利要求17所述的系統(tǒng),所述應(yīng)用程序填充碼進一步配置為通過以下步驟跟蹤所述API上下文的狀態(tài): 開啟與所述圖形應(yīng)用程序相關(guān)聯(lián)的狀態(tài)模型;以及 針對由所述圖形應(yīng)用程序所生成的每個API命令,基于所述API命令更新所述狀態(tài)模型。
【文檔編號】G06F9/46GK103838669SQ201310611924
【公開日】2014年6月4日 申請日期:2013年11月26日 優(yōu)先權(quán)日:2012年11月26日
【發(fā)明者】杰弗里·T·希爾, 托馬斯·H·克萊因 申請人:輝達公司