基于工作隊列的圖形處理單元工作創(chuàng)建的制作方法
【專利摘要】本發(fā)明的一個實施例使得在處理器上執(zhí)行的線程能夠通過工作隊列和命令塊的方式在該處理器內(nèi)本地生成并執(zhí)行工作。作為用于建立使得線程能夠本地生成并執(zhí)行工作的存儲器對象的初始化過程,設(shè)備驅(qū)動程序生成工作隊列,并且將工作隊列的GP_GET指針設(shè)置為工作隊列中的第一條目。設(shè)備驅(qū)動程序還在初始化過程期間將工作隊列的GP_PUT指針設(shè)置為包括在工作隊列中的最后自由條目,從而建立由線程所生成的新的工作可以被加載到其中并且隨后由處理器執(zhí)行的工作隊列中的條目的范圍。之后線程利用所生成的工作填充命令塊并且將工作隊列中的條目指向命令塊以實行存儲在命令塊中的工作的處理器執(zhí)行。
【專利說明】基于工作隊列的圖形處理單元工作創(chuàng)建
【技術(shù)領(lǐng)域】
[0001]本發(fā)明總地涉及計算機處理,并且更具體地,涉及使能圖形處理單元(GPU)內(nèi)的工作的本地生成。
【背景技術(shù)】
[0002]圖形處理單元(GPU)設(shè)計為處理計算系統(tǒng)內(nèi)的各種密集任務(wù),諸如圖形處理工作和計算應(yīng)用工作。在典型的配置中,中央處理單元(CPU)生成基于GPU的工作并且將基于GPU的工作加載到CPU和GPU 二者都可訪問的全局存儲器中。CPU之后訪問GPU的工作隊列-通常稱為“信道”-CPU能夠通過其使GPU處理存儲在全局存儲器中的基于GPU的工作。
[0003]在一個配置中,GPU的處理活動由兩個分開的指針的操縱所控制,每個指針涉及工作隊列中的條目,本文稱為GP_GET指針和GP_PUT指針。GP_GET指針指向工作隊列中的特定條目并且向CPU指示GPU在執(zhí)行存儲在工作隊列中的工作方面的進展情況。可替換地,GP.PUT指針指向工作隊列中剛好在由CPU所寫的最后條目之后的條目。當GPU完成由給定的工作隊列條目所指向的基于GPU的工作的執(zhí)行時,GPU增大GP_GET。顯而易見地,因為工作隊列是循環(huán)的,所以當GP_GET達到工作隊列的條目計數(shù)時,將GP_GET重新設(shè)置為零值。如果在被增大之后,GP_GET等于GP_PUT,那么工作隊列中沒有更多的條目留待處理。否則,GPU執(zhí)行由GP_GET所指向的工作。另外,如果GP_GET等于“(GP_PUT+1)對‘工作隊列中的條目的數(shù)目’取模”,那么工作隊列被認為是滿的。只要工作隊列不是滿的,CPU就能夠增大GP.PUT指針以提交在工作隊列中所寫的新的條目用于GPU處理。GPU監(jiān)視由CPU所實施的對GP_PUT的改變,使得CPU所提交的工作隊列條目以及時的方式加以處理。
[0004]在許多情況下,使得GPU能夠生成能夠由GPU加載到工作隊列中并且由GPU所處理的附加(即嵌套(nested))工作是可取的。不幸地,特定硬件限制存在于流行的CPU至GPU通信信道之間-諸如快速外圍部件互連(PC1-E)-并且防止GPU能夠修改GP_PUT指針,如以上所描述的,該GP_PUT指針需要在將新的工作插入工作隊列之后被增大。結(jié)果是,GPU必須依賴CPU來生成并執(zhí)行嵌套工作,其與在GPU內(nèi)本地生成并執(zhí)行嵌套工作相比是低效的。
[0005]因此,本領(lǐng)域需要的是用于在CPU至GPU通信信道硬件限制存在的情況下使得GPU能夠本地生成工作的技術(shù)。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的一個實施例闡述了用于配置工作隊列以使得在并行處理子系統(tǒng)中執(zhí)行的線程能夠在并行處理子系統(tǒng)內(nèi)生成并執(zhí)行工作的方法。方法包括生成工作隊列的步驟,其中工作隊列包括多個條目并且與第一指針和第二指針相關(guān)聯(lián),其中第一指針和第二指針中的每一個對線程是不可訪問的,建立工作隊列中的自由條目的范圍,通過:將第一指針指向多個條目的第一條目;以及將第二指針指向多個條目的最后條目;生成指向多個條目的第一條目的第三指針,其中第三指針對線程是可訪問的,生成指向多個條目的最后條目的第四指針,其中第四指針對線程是可訪問的,將工作隊列的第一條目指向包含指向被阻塞的信號量的信號量獲得命令的命令塊,經(jīng)由第三和第四指針將工作加載到工作隊列中,確定線程已經(jīng)完成加載工作;以及釋放信號量以使第一指針前進到工作隊列中的下一個條目并且使并行處理子系統(tǒng)執(zhí)行由線程所生成的工作。
[0007]本發(fā)明所公開的實施例的一個優(yōu)勢是它們使得在處理單元上執(zhí)行的線程能夠在處理單元內(nèi)創(chuàng)建嵌套工作而不需要向CPU發(fā)出這樣做的請求。結(jié)果是,跨CPU和處理單元之間的通信路徑消耗較少的帶寬,并且進一步地,CPU102的工作負載減少,從而提高效率。此外,線程能夠執(zhí)行有用的嵌套工作而不需要依賴CPU授權(quán)或不必等待CPU響應(yīng)將所生成的嵌套工作提交到GPU的請求。
【專利附圖】
【附圖說明】
[0008]因此,可以詳細地理解本發(fā)明的上述特征,并且可以參考實施例得到對如上面所簡要概括的本發(fā)明更具體的描述,其中一些實施例在附圖中示出。然而,應(yīng)當注意的是,附圖僅示出了本發(fā)明的典型實施例,因此不應(yīng)被認為是對其范圍的限制,本發(fā)明可以具有其他等效的實施例。
[0009]圖1是示出了配置為實現(xiàn)本發(fā)明的一個或多個方面的計算機系統(tǒng)的框圖。
[0010]圖2是根據(jù)本發(fā)明的一個實施例的、用于圖1的計算機系統(tǒng)的并行處理子系統(tǒng)的框圖。
[0011]圖3A是根據(jù)本發(fā)明的一個實施例的、圖2的任務(wù)/工作單元的框圖。
[0012]圖3B是根據(jù)本發(fā)明的一個實施例的、圖2的并行處理單元之一內(nèi)的通用處理集群的框圖。
[0013]圖3C是根據(jù)本發(fā)明的一個實施例的、圖3B的流多處理器的一部分的框圖。
[0014]圖4A示出了根據(jù)本發(fā)明一個實施例的、用于初始化使得在用于圖1的計算機系統(tǒng)的并行處理子系統(tǒng)之一上執(zhí)行的線程能夠本地生成工作的工作隊列的方法。
[0015]圖4B-4C示出了根據(jù)本發(fā)明一個實施例的、用于通過線程在用于圖1的計算機系統(tǒng)的并行處理子系統(tǒng)之一上執(zhí)行的方式本地生成工作的方法。
[0016]圖5示出了根據(jù)本發(fā)明一個實施例的、配置為存儲在圖1的計算機系統(tǒng)的并行處理子系統(tǒng)之一內(nèi)本地生成的工作的各存儲器對象的示范性框圖。
[0017]圖6A-6F示出了根據(jù)本發(fā)明一個實施例的、使得工作能夠在圖1的計算機系統(tǒng)的并行處理子系統(tǒng)之一內(nèi)被本地生成并且執(zhí)行的兩個不同信道之間的示范性交互。
【具體實施方式】
[0018]在下面的描述中,將闡述大量的具體細節(jié)以提供對本發(fā)明更透徹的理解。然而,本領(lǐng)域的技術(shù)人員應(yīng)該清楚,本發(fā)明可以在沒有一個或多個這些具體細節(jié)的情況下得以實施。在其他實例中,未描述公知特征以避免對本發(fā)明造成混淆。
[0019]系統(tǒng)概述
[0020]圖1是示出了配置為實現(xiàn)本發(fā)明的一個或多個方面的計算機系統(tǒng)100的框圖。計算機系統(tǒng)100包括經(jīng)由可以包括存儲器橋105的互連路徑通信的中央處理單元(CPU) 102和系統(tǒng)存儲器104。存儲器橋105可以是例如北橋芯片,經(jīng)由總線或其他通信路徑106 (例如超傳輸(HyperTransport)鏈路)連接到I/O (輸入/輸出)橋107。I/O橋107,其可以是例如南橋芯片,從一個或多個用戶輸入設(shè)備108 (例如鍵盤、鼠標)接收用戶輸入并且經(jīng)由通信路徑106和存儲器橋105將該輸入轉(zhuǎn)發(fā)到CPU102。并行處理子系統(tǒng)112經(jīng)由總線或第二通信路徑113 (例如外圍部件互連(PCI)Express、加速圖形端口或超傳輸鏈路)耦連到存儲器橋105 ;在一個實施例中,并行處理子系統(tǒng)112是將像素傳遞到顯示設(shè)備110的圖形子系統(tǒng),顯示設(shè)備110可以是任何常規(guī)的陰極射線管、液晶顯示器、發(fā)光二極管顯示器等等。系統(tǒng)盤114也連接到I/O橋107并且可以配置為存儲內(nèi)容和應(yīng)用和數(shù)據(jù)用于由CPU102和并行處理子系統(tǒng)112使用。系統(tǒng)盤114為應(yīng)用和數(shù)據(jù)提供非易失性存儲并且可以包括固定的或可移動的硬盤驅(qū)動器、閃存設(shè)備和壓縮光盤只讀存儲器(CD-ROM)、數(shù)字通用光盤-ROM(DVD-ROM)、藍光、高清DVD (HD-DVD)或其他磁性、光學或固態(tài)存儲設(shè)備。
[0021]交換器116提供I/O橋107與諸如網(wǎng)絡(luò)適配器118以及各種插卡120和121的其他部件之間的連接。其他部件(未明確示出),包括通用串行總線(USB)或其他端口連接、壓縮光盤(CD)驅(qū)動器、數(shù)字通用光盤(DVD)驅(qū)動器、膠片錄制設(shè)備及類似部件,也可以連接到I/O橋107。圖1所示的各種通信路徑包括具體命名的通信路徑106和113可以使用任何適合的協(xié)議實現(xiàn),諸如PC1-EXpreSS、AGP (加速圖形端口)、超傳輸或者任何其他總線或點到點通信協(xié)議,并且如本領(lǐng)域已知的,不同設(shè)備間的連接可使用不同協(xié)議。
[0022]在一個實施例中,并行處理子系統(tǒng)112包含經(jīng)優(yōu)化用于圖形和視頻處理的電路,包括例如視頻輸出電路,并且構(gòu)成圖形處理單元(GPU)。在另一個實施例中,并行處理子系統(tǒng)112包含經(jīng)優(yōu)化用于通用處理的電路,同時保留底層(underlying)的計算架構(gòu),本文將更詳細地進行描述。在又一個實施例中,可以將并行處理子系統(tǒng)112與一個或多個其他系統(tǒng)元件集成在單個子系統(tǒng)中,諸如結(jié)合存儲器橋105、CPU102以及I/O橋107,以形成片上系統(tǒng)(SoC)。
[0023]應(yīng)該理解,本文所示系統(tǒng)是示例性的,并且變化和修改都是可能的。連接拓撲,包括橋的數(shù)目和布置、CPU102的數(shù)目以及并行處理子系統(tǒng)112的數(shù)目,可根據(jù)需要修改。例如,在一些實施例中,系統(tǒng)存儲器104直接連接到CPU102而不是通過橋,并且其他設(shè)備經(jīng)由存儲器橋105和CPU102與系統(tǒng)存儲器104通信。在其他替代性拓撲中,并行處理子系統(tǒng)112連接到I/O橋107或直接連接到CPU102,而不是連接到存儲器橋105。而在其他實施例中,I/O橋107和存儲器橋105可能被集成到單個芯片上而不是作為一個或多個分立設(shè)備存在。大型實施例可以包括兩個或更多個的CPU102以及兩個或更多個的并行處理子系統(tǒng)112。本文所示的特定部件是可選的;例如,任何數(shù)目的插卡或外圍設(shè)備都可能得到支持。在一些實施例中,交換器116被去掉,網(wǎng)絡(luò)適配器118和插卡120、121直接連接到I/O橋107。
[0024]圖2示出了根據(jù)本發(fā)明一個實施例的并行處理子系統(tǒng)112。如所示的,并行處理子系統(tǒng)112包括一個或多個并行處理單元(PI3U) 202,每個并行處理單元202都耦連到本地并行處理(PP)存儲器204。通常,并行處理子系統(tǒng)包括U個PPU,其中US I。(本文中,類似對象的多個實例需要時以標識對象的參考數(shù)字和標識實例的括號中的數(shù)字來表示。)PPU202和并行處理存儲器204可使用一個或多個集成電路設(shè)備來實現(xiàn),諸如可編程處理器、專用集成電路(ASIC)或存儲器設(shè)備,或者以任何其他技術(shù)可行的方式來實現(xiàn)。
[0025]再參考圖1以及圖2,在一些實施例中,并行處理子系統(tǒng)112中的一些或所有PPU202是具有渲染管線的圖形處理器,其可以配置為實施與下述相關(guān)的各種操作:經(jīng)由存儲器橋105和第二通信路徑113從CPU102和/或系統(tǒng)存儲器104所供應(yīng)的圖形數(shù)據(jù)生成像素數(shù)據(jù),與本地并行處理存儲器204 (可被用作圖形存儲器,包括例如常規(guī)幀緩沖區(qū)(buffer))交互以存儲和更新像素數(shù)據(jù),傳遞像素數(shù)據(jù)到顯示設(shè)備110等等。在一些實施例中,并行處理子系統(tǒng)112可包括一個或多個作為圖形處理器而操作的PPU202以及一個或多個用于通用計算的其他PPU202。這些PTO可以是同樣的或不同的,并且每個PPU可具有專用并行處理存儲器設(shè)備或不具有專用并行處理存儲器設(shè)備。并行處理子系統(tǒng)112中的一個或多個PPU202可輸出數(shù)據(jù)到顯示設(shè)備110,或者并行處理子系統(tǒng)112中的每個PPU202可輸出數(shù)據(jù)到一個或多個顯示設(shè)備110。
[0026]在操作中,CPU102是計算機系統(tǒng)100的主處理器,控制和協(xié)調(diào)其他系統(tǒng)部件的操作。具體地,CPU102發(fā)出控制PPU202的操作的命令。在一些實施例中,CPU102寫入用于每個PPU202的命令流到數(shù)據(jù)結(jié)構(gòu)中(在圖1或圖2中未明確示出),該數(shù)據(jù)結(jié)構(gòu)可位于系統(tǒng)存儲器104、并行處理存儲器204、或CPU102和PPU202都可訪問的其他存儲位置中。將指向每個數(shù)據(jù)結(jié)構(gòu)的指針寫到工作隊列以發(fā)起對數(shù)據(jù)結(jié)構(gòu)中的命令流的處理。PPU202從一個或多個工作隊列讀取命令流,然后相對于CPU102的操作異步地執(zhí)行命令。可以經(jīng)由設(shè)備驅(qū)動程序103由應(yīng)用程序為每個工作隊列指定執(zhí)行優(yōu)先級以控制對不同工作隊列的調(diào)度。
[0027]現(xiàn)在返回參考圖2和圖1,每個PPU202包括經(jīng)由連接到存儲器橋105 (或者,在一個替代性實施例中,直接連接到CPU102)的通信路徑113與計算機系統(tǒng)100的其余部分通信的I/O (輸入/輸出)單元205。PPU202到計算機系統(tǒng)100的其余部分的連接也可以變化。在一些實施例中,并行處理子系統(tǒng)112可實現(xiàn)為可插入到計算機系統(tǒng)100的擴展槽中的插卡。在其他實施例中,PPU202可以和諸如存儲器橋105或I/O橋107的總線橋集成在單個芯片上。而在其他實施例中,PPU202的一些或所有元件可以和CPU102集成在單個芯片上。
[0028]在一個實施例中,通信路徑113是PCI Express鏈路,如本領(lǐng)域所知的,其中專用通道被分配到每個PPU202。也可以使用其他通信路徑。I/O單元205生成用于在通信路徑113上傳送的包(或其他信號),并且還從通信路徑113接收所有傳入的包(或其他信號),將傳入的包引導(dǎo)到PPU202的適當部件。例如,可將與處理任務(wù)相關(guān)的命令引導(dǎo)到主機接口206,而將與存儲器操作相關(guān)的命令(例如,對并行處理存儲器204的讀取或?qū)懭?引導(dǎo)到存儲器交叉開關(guān)單元210。主機接口 206讀取每個工作隊列,并且將存儲在工作隊列中的命令流輸出到前端212。
[0029]有利地,每個PPU202都實現(xiàn)高度并行處理架構(gòu)。如詳細示出的,PPU202 (O)包括處理集群陣列230,該陣列230包括C個通用處理集群(GPC)208,其中C≥1。每個GPC208能夠并發(fā)執(zhí)行大量的(例如,幾百或幾千)線程,其中每個線程是程序的實例(instance)。在各種應(yīng)用中,可分配不同的GPC208用于處理不同類型的程序或用于執(zhí)行不同類型的計算。GPC208的分配可以取決于因每種類型的程序或計算所產(chǎn)生的工作量而變化。
[0030]GPC208從任務(wù)/工作單元207內(nèi)的工作分布單元接收所要執(zhí)行的處理任務(wù)。工作分布單元接收指向編碼為任務(wù)元數(shù)據(jù)(TMD)并存儲在存儲器中的處理任務(wù)的指針。指向TMD的指針包括在存儲為工作隊列并由前端單元212從主機接口 206接收的命令流中??梢跃幋a為TMD的處理任務(wù)包括所要處理的數(shù)據(jù)的索引,以及定義數(shù)據(jù)將被如何處理(例如,什么程序?qū)⒈粓?zhí)行)的 狀態(tài)參數(shù)和命令。任務(wù)/工作單元207從前端212接收任務(wù)并確保在每一個TMD所指定的處理發(fā)起前,將GPC208配置為有效狀態(tài)。可以為每個TMD指定用來調(diào)度處理任務(wù)的執(zhí)行的優(yōu)先級。還可從處理集群陣列230接收處理任務(wù)。可選地,TMD可包括控制將TMD添加到處理任務(wù)列表(或指向處理任務(wù)的指針的列表)的頭部還是尾部的參數(shù),從而提供除優(yōu)先級以外的另一級別的控制。
[0031]存儲器接口 214包括D個分區(qū)單元215,每個分區(qū)單元215直接耦連到并行處理存儲器204的一部分,其中D > I。如所示的,分區(qū)單元215的數(shù)目一般等于動態(tài)隨機存取存儲器(DRAM) 220的數(shù)目。在其他實施例中,分區(qū)單元215的數(shù)目也可以不等于存儲器設(shè)備的數(shù)目。本領(lǐng)域的技術(shù)人員應(yīng)該理解DRAM220可以用其他合適的存儲設(shè)備來替代并且可以是一般常規(guī)的設(shè)計。因此省略了詳細描述。諸如幀緩沖區(qū)或紋理映射圖的渲染目標可以跨DRAM220加以存儲,這允許分區(qū)單元215并行寫入每個渲染目標的各部分以有效地使用并行處理存儲器204的可用帶寬。
[0032]任何一個GPC208都可以處理要被寫到并行處理存儲器204內(nèi)的任何DRAM220的數(shù)據(jù)。交叉開關(guān)單元210配置為路由每個GPC208的輸出到任何分區(qū)單元215的輸入或到另一個GPC208用于進一步處理。GPC208通過交叉開關(guān)單元210與存儲器接口 214通信,以對各種外部存儲器設(shè)備進行讀取或?qū)懭搿T谝粋€實施例中,交叉開關(guān)單元210具有到存儲器接口 214的連接以和I/O單元205通信,以及到本地并行處理存儲器204的連接,從而使得在不同GPC208內(nèi)的處理內(nèi)核能夠與系統(tǒng)存儲器104或?qū)τ赑PU202而言非本地的其他存儲器通信。在圖2所示的實施例中,交叉開關(guān)單元210直接與I/O單元205連接。交叉開關(guān)單元210可使用虛擬信道來分開GPC208與分區(qū)單元215之間的業(yè)務(wù)流。
[0033]另外,GPC208可被編程以執(zhí)行與種類繁多的應(yīng)用相關(guān)的處理任務(wù),包括但不限于,線性和非線性數(shù)據(jù)變換、視頻和/或音頻數(shù)據(jù)過濾、建模操作(例如,應(yīng)用物理定律以確定對象的位置、速率和其他屬性)、圖像渲染操作(例如,曲面細分(tessellation)著色器、頂點著色器、幾何著色器、和/或像素著色器程序)等等。PPU202可將數(shù)據(jù)從系統(tǒng)存儲器104和/或本地并行處理存儲器204轉(zhuǎn)移到內(nèi)部(片上)存儲器中,處理該數(shù)據(jù),并且將結(jié)果數(shù)據(jù)寫回到系統(tǒng)存儲器104和/或本地并行處理存儲器204,其中這樣的數(shù)據(jù)可以由其他系統(tǒng)部件訪問,所述其他系統(tǒng)部件包括CPU102或另一個并行處理子系統(tǒng)112。
[0034]PPU202可配備有任何容量(amount)的本地并行處理存儲器204,包括沒有本地存儲器,并且可以以任何組合方式使用本地存儲器和系統(tǒng)存儲器。例如,在統(tǒng)一存儲器架構(gòu)(UMA)實施例中,PPU202可以是圖形處理器。在這樣的實施例中,將不提供或幾乎不提供專用的圖形(并行處理)存儲器,并且PPU202會以排他或幾乎排他的方式使用系統(tǒng)存儲器。在UMA實施例中,PPU202可集成到橋式芯片中或處理器芯片中,或作為具有高速鏈路(例如,PCI Express)的分立芯片提供,所述高速鏈路經(jīng)由橋式芯片或其他通信手段將PPU202連接到系統(tǒng)存儲器。
[0035]如上所示,在并行處理子系統(tǒng)112中可以包括任何數(shù)目的PPU202。例如,可在單個插卡上提供多個PPU202、或可將多個插卡連接到通信路徑113、或可將一個或多個PPU202集成到橋式芯片中。在多PPU系統(tǒng)中的PPU202可以彼此同樣或不同。例如,不同的PPU202可能具有不同數(shù)目的處理內(nèi)核、不同容量的本地并行處理存儲器等等。在存在多個PPU202的情況下,可并行操作那些PI3U從而以高于單個PPU202所可能達到的吞吐量來處理數(shù)據(jù)。包含一個或多個PPU202的系統(tǒng)可以以各種配置和形式因素來實現(xiàn),包括臺式電腦、筆記本電腦或手持式個人計算機、服務(wù)器、工作站、游戲控制臺、嵌入式系統(tǒng)等等。
[0036]多個并發(fā)任務(wù)調(diào)度[0037]可以在GPC208上并發(fā)執(zhí)行多個處理任務(wù)并且處理任務(wù)在執(zhí)行期間可以生成一個或多個“子”處理任務(wù)。任務(wù)/工作單元207接收任務(wù)并動態(tài)調(diào)度處理任務(wù)和子處理任務(wù)用于由GPC208執(zhí)行。
[0038]圖3A是根據(jù)本發(fā)明一個實施例的圖2的任務(wù)/工作單元207的框圖。任務(wù)/工作單元207包括任務(wù)管理單元300和工作分布單元340。任務(wù)管理單元300基于執(zhí)行優(yōu)先級級別來組織所要調(diào)度的任務(wù)。對于每個優(yōu)先級級別,任務(wù)管理單元300將指向與任務(wù)相對應(yīng)的TMD322的指針的列表存儲在調(diào)度器表321中,其中所述列表可以實現(xiàn)為鏈表。可以將TMD322存儲在PP存儲器204或系統(tǒng)存儲器104中。任務(wù)管理單元300接受任務(wù)并將任務(wù)存儲在調(diào)度器表321中的速度與任務(wù)管理單元300調(diào)度任務(wù)用于執(zhí)行的速度是解耦的。因此,任務(wù)管理單元300可以在調(diào)度任務(wù)之前收集數(shù)個任務(wù)。之后可以基于優(yōu)先級信息或使用其他技術(shù)諸如輪叫調(diào)度來調(diào)度所收集的任務(wù)。
[0039]工作分布單元340包括具有槽的任務(wù)表345,每個槽可以被用于正在執(zhí)行的任務(wù)的TMD322所占用。當任務(wù)表345中有空閑槽時,任務(wù)管理單元300可以調(diào)度任務(wù)用于執(zhí)行。當沒有空閑槽時,未占用槽的較高優(yōu)先級任務(wù)可以驅(qū)逐占用槽的較低優(yōu)先級任務(wù)。當任務(wù)被驅(qū)逐時,該任務(wù)被停止,并且如果該任務(wù)的執(zhí)行沒有完成,則將指向該任務(wù)的指針添加到所要調(diào)度的任務(wù)指針的列表以使得任務(wù)的執(zhí)行稍后將恢復(fù)。當生成子處理任務(wù)時,在任務(wù)的執(zhí)行期間,將指向該子任務(wù)的指針添加到所要調(diào)度的任務(wù)指針的列表??梢杂稍谔幚砑宏嚵?30中執(zhí)行的TMD322生成子任務(wù)。
[0040]不同于由任務(wù)/工作單元207從前端212接收的任務(wù),子任務(wù)從處理集群陣列230接收。子任務(wù)不被插入工作隊列或傳送到前端。當生成子任務(wù)或?qū)⒂糜谧尤蝿?wù)的數(shù)據(jù)存儲在存儲器中時不通知CPU102。通過工作隊列提供的任務(wù)與子任務(wù)之間的另一個區(qū)別是通過工作隊列提供的任務(wù)由應(yīng)用程序來定義而子任務(wù)是在任務(wù)執(zhí)行期間動態(tài)生成的。
[0041]任務(wù)處理概述
[0042]圖3B是根據(jù)本發(fā)明一個實施例的在圖2的PPU202之一內(nèi)的GPC208的框圖。每個GPC208可配置為并行執(zhí)行大量線程,其中術(shù)語“線程”是指在特定輸入數(shù)據(jù)集上執(zhí)行的特定程序的實例。在一些實施例中,單指令、多數(shù)據(jù)(SIMD)指令發(fā)出技術(shù)用于在不提供多個獨立指令單元的情況下支持大量線程的并行執(zhí)行。在其他實施例中,單指令、多線程(SMT)技術(shù)用于使用配置為向GPC208中的每一個內(nèi)的處理引擎集發(fā)出指令的公共指令單元來支持大量一般來說同步的線程的并行執(zhí)行。不同于所有處理引擎通常都執(zhí)行同樣指令的SMD執(zhí)行機制,SIMT執(zhí)行通過給定線程程序允許不同線程更容易跟隨分散執(zhí)行路徑。本領(lǐng)域普通技術(shù)人員應(yīng)該理解SMD處理機制代表SMT處理機制的功能子集。
[0043]經(jīng)由將處理任務(wù)分布到流多處理器(SM) 310的管線管理器305來有利地控制GPC208的操作。管線管理器305還可配置為通過為由SM310所輸出的處理數(shù)據(jù)指定目的地來控制工作分布交叉開關(guān)330。
[0044]在一個實施例中,每個GPC208包括M個SM310,其中M≥1,每個SM310配置為處理一個或多個線程組。另外,如本領(lǐng)域已知的,每個SM310有利地包括可以管線化的同樣功能執(zhí)行單元集(例如執(zhí)行單元和加載-存儲單元一在圖3C中示出為Exec單元302和LSU303 ),其允許在前一個指令完成之前發(fā)出新指令。可提供功能執(zhí)行單元的任何組合。在一個實施例中,功能單元支持各種各樣的操作,包括整數(shù)和浮點運算(例如加法和乘法)、比較操作、布爾操作(and、OR、X0R)、移位和各種代數(shù)函數(shù)的計算(例如平面插值、三角函數(shù)、指數(shù)函數(shù)和對數(shù)函數(shù)等等);以及相同功能單元硬件可均衡地用來實施不同的操作。
[0045]如本文之前所定義的,傳送到特定GPC208的一系列指令構(gòu)成線程,并且跨SM310內(nèi)的并行處理引擎(未示出)的某一數(shù)目的并發(fā)執(zhí)行線程的集合在本文中稱為“線程束(warp)”或“線程組”。如本文所使用的,“線程組”是指對不同輸入數(shù)據(jù)并發(fā)執(zhí)行相同程序的一組線程,所述組的一個線程被指派到SM310內(nèi)的不同處理引擎。線程組可以包括比SM310內(nèi)的處理引擎數(shù)目少的線程,在這種情況下一些處理引擎將在該線程組正在被處理的周期期間處于閑置狀態(tài)。線程組還可以包括比SM310內(nèi)的處理引擎數(shù)目多的線程,在這種情況下處理將在連續(xù)的時鐘周期內(nèi)發(fā)生。因為每個SM310可以并發(fā)支持多達G個線程組,結(jié)果是在任何給定時間在GPC208中可以執(zhí)行多達G*M個線程組。
[0046]此外,多個相關(guān)線程組可以在SM310內(nèi)同時活動(在執(zhí)行的不同階段)。該線程組集合在本文中稱為“協(xié)作線程陣列”(“CTA”)或“線程陣列”。特定CTA的大小等于m*k,其中k是線程組中并發(fā)執(zhí)行線程的數(shù)目并且通常是SM310內(nèi)的并行處理引擎數(shù)目的整數(shù)倍,以及m是SM310內(nèi)同時活動的線程組的數(shù)目。CTA的大小一般由編程者以及可用于CTA的硬件資源諸如存儲器或寄存器的容量來確定。
[0047]每個SM310包含一級(LI)高速緩存(圖3C所示)或使用用于實施加載和存儲操作的SM310外部的相應(yīng)LI高速緩存中的空間。每個SM310都還有權(quán)訪問在所有GPC208之間共享并且可用于在線程之間轉(zhuǎn)移數(shù)據(jù)的二級(L2)高速緩存。最后,SM310還有權(quán)訪問片夕卜“全局”存儲器,所述“全局”存儲器可以包括例如并行處理存儲器204和/或系統(tǒng)存儲器104。應(yīng)該理解,PPU202外部的任何存儲器可用作全局存儲器。此外,一點五級(L1.5)高速緩存335可以包括在GPC208內(nèi),其配置為接收并保持由SM310所請求的經(jīng)由存儲器接口 214從存儲器獲取的數(shù)據(jù),包括指令、一致(uniform)數(shù)據(jù)和常數(shù)數(shù)據(jù),并將所請求的數(shù)據(jù)提供給SM310。在GPC208中具有多個SM310的實施例有利地共享了高速緩存在L1.5高速緩存335中的公共指令和數(shù)據(jù)。
[0048]每個GPC208可以包括配置為將虛擬地址映射到物理地址中的存儲器管理單元(MMU) 328ο在其他實施例中,MMU328可以駐留在存儲器接口 214內(nèi)。MMU328包括用于將虛擬地址映射到像素塊(tile)的物理地址的頁表條目(PTE)集和可選地包括高速緩存行索引。MMU328可以包括地址轉(zhuǎn)換后備緩沖區(qū)(TLB)或可以駐留在多處理器SM310或LI高速緩存或GPC208內(nèi)的高速緩存。物理地址經(jīng)處理以分布表面數(shù)據(jù)訪問位置來允許高效請求在分區(qū)單元215之間交錯。高速緩存行索引可用于確定用于高速緩存行的請求是命中還是未命中。
[0049]在圖形和計算應(yīng)用中,GPC208可配置為使得每個SM310耦連到用于實施紋理映射操作例如確定紋理樣本位置、讀取紋理數(shù)據(jù)以及過濾該紋理數(shù)據(jù)的紋理單元315。從內(nèi)部紋理LI高速緩存(未示出)或者在一些實施例中從SM310內(nèi)的LI高速緩存讀取紋理數(shù)據(jù)并根據(jù)需要從在所有GPC208之間共享的L2高速緩存、并行處理存儲器204或系統(tǒng)存儲器104中獲取紋理數(shù)據(jù)。為了將所處理的任務(wù)提供給另一個GPC208用于進一步處理或為了經(jīng)由交叉開關(guān)單元210將所處理的任務(wù)存儲在L2高速緩存、并行處理存儲器204或系統(tǒng)存儲器104中,每個SM310將所處理的任務(wù)輸出到工作分布交叉開關(guān)330。preROP (預(yù)光柵操作)325配置為從SM310接收數(shù)據(jù)、將數(shù)據(jù)引導(dǎo)到分區(qū)單元215內(nèi)的ROP單元以及針對顏色混合實施優(yōu)化、組織像素顏色數(shù)據(jù)和實施地址轉(zhuǎn)譯。
[0050]應(yīng)該理解本文所述的內(nèi)核架構(gòu)是示例性的并且變化和修改都是可能的。任何數(shù)目的處理單元例如SM310或紋理單元315、preR0P325可以包括在GPC208內(nèi)。進一步地,如圖2所示,PPU202可以包括任何數(shù)目的GPC208,所述GPC208有利地在功能上彼此相似以使得執(zhí)行行為不取決于哪個GPC208接收特定處理任務(wù)。進一步地,每個GPC208有利地使用分開且各異的處理單元、LI高速緩存來獨立于其他GPC208操作以為一個或多個應(yīng)用程序執(zhí)行任務(wù)。
[0051]本領(lǐng)域普通技術(shù)人員應(yīng)該理解圖1、2、3A和3B所描述的架構(gòu)決不限制本發(fā)明的范圍并且在不脫離本發(fā)明范圍的情況下本文所教導(dǎo)的技術(shù)可以在任何經(jīng)適當配置的處理單元上實現(xiàn),所述處理單元包括但不限于一個或多個CPU、一個或多個多核CPU、一個或多個PPU202、一個或多個GPC208、一個或多個圖形或?qū)S锰幚韱卧鹊取?br>
[0052]在本發(fā)明的實施例中,使用計算系統(tǒng)的PPU202或其他處理器來使用線程陣列執(zhí)行通用計算是可取的。為線程陣列中的每個線程指派在線程的執(zhí)行期間對于線程可訪問的唯一的線程標識符(“線程ID”)??杀欢x為一維或多維數(shù)值的線程ID控制線程處理行為的各方面。例如,線程ID可用于確定線程將要處理輸入數(shù)據(jù)集的哪部分和/或確定線程將要產(chǎn)生或?qū)戄敵鰯?shù)據(jù)集的哪部分。
[0053]每線程指令序列可包括定義線程陣列的代表性線程和一個或多個其他線程之間的協(xié)作行為的至少一個指令。例如,每線程指令序列可能包括在序列中的特定點處掛起用于代表性線程的操作執(zhí)行直到諸如其他線程的一個或多個到達該特定點的時間為止的指令、用于代表性線程將數(shù)據(jù)存儲在其他線程的一個或多個有權(quán)訪問的共享存儲器中的指令、用于代表性線程原子地讀取和更新存儲在其他線程的一個或多個基于它們的線程ID有權(quán)訪問的共享存儲器中的數(shù)據(jù)的指令等等。CTA程序還可以包括計算數(shù)據(jù)將從其讀取的共享存儲器中的地址的指令,該地址是線程ID的函數(shù)。通過定義合適的函數(shù)并提供同步技術(shù),可以以可預(yù)測的方式由CTA的一個線程將數(shù)據(jù)寫入共享存儲器中的給定位置并由同一個CTA的不同線程從該位置讀取數(shù)據(jù)。因此,數(shù)據(jù)在線程之間共享的任何期望模式可以得到支持,以及CTA中的任何線程可以與同一個CTA中的任何其他線程共享數(shù)據(jù)。如果存在數(shù)據(jù)在CTA的線程之間的共享,則其范圍由CTA程序確定;因此,應(yīng)該理解的是,在使用CTA的特定應(yīng)用中,CTA的線程可能會或可能不會真正互相共享數(shù)據(jù),這取決于CTA程序,術(shù)語“CTA”和“線程陣列”在本文作為同義詞使用。
[0054]圖3C是根據(jù)本發(fā)明一個實施例的圖3B的SM310的框圖。SM310包括配置為經(jīng)由L1.5高速緩存335從存儲器接收指令和常數(shù)的指令LI高速緩存370。線程束調(diào)度器和指令單元312從指令LI高速緩存370接收指令和常數(shù)并根據(jù)該指令和常數(shù)控制本地寄存器堆304和SM310功能單元。SM310功能單元包括N個exec (執(zhí)行或處理)單元302和P個加載-存儲單元(LSU) 303。
[0055]SM310提供具有不同級別的可訪問性的片上(內(nèi)部)數(shù)據(jù)存儲。特殊寄存器(未示出)對于LSU303可讀但不可寫并且用于存儲定義每個線程的“位置”的參數(shù)。在一個實施例中,特殊寄存器包括每線程(或SM310內(nèi)的每exec單元302) —個的存儲線程ID的寄存器;每個線程ID寄存器僅由各自的exec單元302可訪問。特殊寄存器還可以包括附加寄存器,其對于執(zhí)行由TMD322所代表的同一個處理任務(wù)的所有線程(或由所有LSU303)可讀,其存儲CTA標識符、CTA維數(shù)、CTA所屬網(wǎng)格(grid)的維數(shù)(或隊列位置,如果TMD322編碼隊列任務(wù)而不是網(wǎng)格任務(wù)的話)、以及CTA被指派到的TMD322的標識符。
[0056]如果TMD322是網(wǎng)格TMD,則TMD322的執(zhí)行會啟動和執(zhí)行固定數(shù)目的CTA以處理存儲在隊列525中的固定量的數(shù)據(jù)。將CTA的數(shù)目指定為網(wǎng)格寬度、高度和深度的乘積。可以將固定量的數(shù)據(jù)存儲在TMD322中或TMD322可以存儲指向?qū)⒂蒀TA所處理的數(shù)據(jù)的指針。TMD322還存儲由CTA所執(zhí)行的程序的開始地址。
[0057]如果TMD322是隊列TMD,那么使用TMD322的隊列特點,這意味著將要被處理的數(shù)據(jù)量不一定是固定的。隊列條目存儲用于由指派到TMD322的CTA所處理的數(shù)據(jù)。隊列條目還可以代表在線程執(zhí)行期間由另一個TMD322所生成的子任務(wù),從而提供嵌套并行性。通常線程或包括線程的CTA的執(zhí)行被掛起直到子任務(wù)的執(zhí)行完成??梢詫㈥犃写鎯υ赥MD322中或與TMD322分開存儲,在該情況下TMD322存儲指向該隊列的隊列指針。有利地,當代表子任務(wù)的TMD322正在執(zhí)行時可以將由子任務(wù)所生成的數(shù)據(jù)寫到隊列。隊列可以實現(xiàn)為循環(huán)隊列以使得數(shù)據(jù)的總量不限于隊列的大小。
[0058]屬于網(wǎng)格的CTA具有指示網(wǎng)格內(nèi)各自CTA的位置的隱含網(wǎng)格寬度、高度和深度參數(shù)。在初始化期間響應(yīng)于經(jīng)由前端212從設(shè)備驅(qū)動程序103所接收的命令來寫特殊寄存器并且在處理任務(wù)的執(zhí)行期間特殊寄存器不改變。前端212調(diào)度每個處理任務(wù)用于執(zhí)行。每個CTA與具體TMD322相關(guān)聯(lián)用于一個或多個任務(wù)的并發(fā)執(zhí)行。此外,單個GPC208可以并發(fā)執(zhí)行多個任務(wù)。
[0059]參數(shù)存儲器(未示出)存儲可由同一個CTA內(nèi)的任何線程(或任何LSU303)讀取但不可由其寫入的運行時間參數(shù)(常數(shù))。在一個實施例中,設(shè)備驅(qū)動程序103在引導(dǎo)SM310開始執(zhí)行使用參數(shù)的任務(wù)之前將這些參數(shù)提供給參數(shù)存儲器。任何CTA內(nèi)的任何線程(或SM310內(nèi)的任何exec單元302)可以通過存儲器接口 214訪問全局存儲器。可以將全局存儲器的各部分存儲在LI高速緩存320中。
[0060]每個線程將本地寄存器堆304用作暫存空間;每個寄存器被分配以專用于一個線程,并且在本地寄存器堆304的任何部分中的數(shù)據(jù)僅對于寄存器被分配到的線程可訪問。本地寄存器堆304可以實現(xiàn)為物理上或邏輯上分為P個通道的寄存器堆,每個通道具有一定數(shù)目的條目(其中每個條目可以存儲例如32位字)。將一個通道指派到N個exec單元302和P個下載-存儲單元LSU303的每一個,并且利用用于執(zhí)行同一個程序的不同線程的數(shù)據(jù)來填充不同通道中的相應(yīng)條目以幫助SIMD執(zhí)行。可以將通道的不同部分分配到G個并發(fā)線程組中的不同線程組,以使得本地寄存器堆304中的給定條目僅對于特定線程可訪問。在一個實施例中,保留本地寄存器堆304內(nèi)的某些條目用于存儲線程標識符,實現(xiàn)特殊寄存器之一。此外,一致LI高速緩存375存儲用于N個exec單元302和P個下載-存儲單元LSU303的每個通道的一致值或常數(shù)值。
[0061]共享存儲器306對于單個CTA內(nèi)的線程可訪問;換言之,共享存儲器306中的任何位置對于同一個CTA內(nèi)的任何線程(或?qū)τ赟M310內(nèi)的任何處理引擎)可訪問。共享存儲器306可以實現(xiàn)為具有允許任何處理引擎對共享存儲器中的任何位置讀取或?qū)懭氲幕ミB的共享寄存器堆或共享片上高速緩存存儲器。在其他實施例中,共享狀態(tài)空間可能映射到片外存儲器的每CTA區(qū)上并被高速緩存在LI高速緩存320中。參數(shù)存儲器可以實現(xiàn)為在實現(xiàn)共享存儲器306的同一個共享寄存器堆或共享高速緩存存儲器內(nèi)的指定部分,或者實現(xiàn)為LSU303對其具有只讀訪問權(quán)限的分開的共享寄存器堆或片上高速緩存存儲器。在一個實施例中,實現(xiàn)參數(shù)存儲器的區(qū)域還用于存儲CTA ID和任務(wù)ID,以及CTA和網(wǎng)格維數(shù)或隊列位置,實現(xiàn)特殊寄存器的各部分。SM310中的每個LSU303耦連到統(tǒng)一地址映射單元352,統(tǒng)一地址映射單元352將為在統(tǒng)一存儲器空間中所指定的加載和存儲指令所提供的地址轉(zhuǎn)換為每個各異存儲器空間中的地址。因此,指令可以用于通過指定統(tǒng)一存儲器空間中的地址來訪問本地、共享或全局存儲器空間中的任何一個。
[0062]每個SM310中的LI高速緩存320可以用于高速緩存私有的每線程本地數(shù)據(jù)還有每應(yīng)用全局數(shù)據(jù)。在一些實施例中,可以將每CTA共享數(shù)據(jù)高速緩存在LI高速緩存320中。LSU303經(jīng)由存儲器和高速緩存互連380耦連到共享存儲器306和LI高速緩存320。
[0063]基于工作隊列的GPU工作創(chuàng)建
[0064]如本文所更詳細闡述的,本發(fā)明使得在PPU202上執(zhí)行的線程能夠通過工作隊列和命令塊的方式在該PPU202內(nèi)本地生成并執(zhí)行工作。在一個實施例中,設(shè)備驅(qū)動程序103,作為用于建立使得線程能夠本地生成并執(zhí)行工作的存儲器對象的初始化過程,生成屬于PPU202的工作隊列,并且將屬于PPU202的工作隊列的GP_GET指針設(shè)置為包括在屬于PPU202的工作隊列中的第一條目。設(shè)備驅(qū)動程序103還在初始化過程期間將屬于PPU202的工作隊列的GP_PUT指針設(shè)置為包括在屬于PPU202的工作隊列中的最后條目,從而建立屬于PPU202的工作隊列中的條目的范圍,由線程所生成的新的工作可被加載到其中并且隨后由PPU202執(zhí)行。以下結(jié)合圖4A提供對初始化過程的詳細描述。
[0065]為了組織GP_GET指針前進通過屬于PPU202的工作隊列的方式-如本文所闡述的,其控制哪個PPU所生成的工作由PPU202執(zhí)行-本發(fā)明的實施例采用信號量,其是存儲在CPU102和PPU202 二者都可訪問的全局存儲器中的對象,該全局存儲器例如PP存儲器204。如以下所進一步詳細描述的,基于由在PPU202上本地執(zhí)行的線程所生成的工作,將獲得或釋放信號量的命令插入到由工作隊列的條目所指向的不同的命令塊,以建立PPU202通過其執(zhí)行本地生成的工作的受控制的調(diào)度。以下結(jié)合圖4B-4C對線程如何將工作插入工作隊列的詳細描述進行描述。
[0066]圖4A示出了根據(jù)本發(fā)明一個實施例的、用于初始化使得在圖2的PPU202之一上執(zhí)行的線程能夠本地生成工作的工作隊列的方法400。為了清楚,以下所包括的方法400的描述包括對圖5和圖6A-6F的引用,其示出了貫穿方法400所論述的各存儲器對象之間的示范性關(guān)系和內(nèi)容。盡管結(jié)合圖1、2、3A、3B和3C的系統(tǒng)對方法步驟進行了描述,但是本領(lǐng)域普通技術(shù)人員應(yīng)該理解配置為以任何順序?qū)嵤┓椒ú襟E的任何系統(tǒng)均在本發(fā)明的范圍內(nèi)。
[0067]如所示的,方法400始于步驟402,其中設(shè)備驅(qū)動程序103在于CPU102上執(zhí)行的同時接收工作請求,并且工作請求包括使在PPU202上執(zhí)行的線程在PPU202內(nèi)本地生成并執(zhí)行附加工作的指令。在一個實施例中,工作請求引用由設(shè)備驅(qū)動程序103所支持的特定應(yīng)用編程接口(API)內(nèi)的函數(shù),其使得開發(fā)者能夠向設(shè)備驅(qū)動程序103指示工作請求當被執(zhí)行時將使在PPU202上執(zhí)行的一個或多個線程本地生成將由PPU202執(zhí)行的附加(即嵌套工作)。以此方式,使設(shè)備驅(qū)動程序103根據(jù)以下所描述的步驟404-416建立工作隊列。
[0068]在步驟404,設(shè)備驅(qū)動程序103生成屬于PPU202的工作隊列,其中屬于PPU202的工作隊列包括多個條目,并且每個條目可以配置為指向非空命令塊。屬于PPU202的工作隊列的一個示例示出為圖5中的工作隊列504,其包括多個條目506。在步驟405,設(shè)備驅(qū)動程序103還在屬于PPU202的工作隊列中分配兩個存儲器塊:一個用于信號量X,一個用于信號量Y-其可以在圖6A-6F中的信號量獲得和釋放命令中被引用-并且將信號量X和信號量Y初始化為零。對于在步驟402所接收的每個工作請求,設(shè)備驅(qū)動程序103生成命令塊,其包含:“內(nèi)核啟動”、“等待空閑”、“信號量釋放X”和“信號量獲得Y”命令,并且將屬于CPU的信道(例如圖6所示的屬于CPU的信道602)中的一個或多個條目指向這些所生成的命令塊,如在圖6A-6F所示的以及以下所進一步詳細描述的。
[0069]在步驟406,設(shè)備驅(qū)動程序103生成包含阻塞直到將值寫入信號量X的存儲器塊的信號量獲得命令的命令塊。以此方式,間接指向信號量獲得命令的GP_GET指針阻止主機接口 206增大GP_GET指針直到信號量X被解阻塞。該命令塊的示例在圖5中示出為命令塊518-1,其中第一命令塊518-1中的信號量獲得命令針對信號量514-1,其存在于存儲器的特定區(qū)域。信號量獲得命令阻塞主機接口 206直到將值寫入存儲器的該區(qū)域(即信號量被釋放)。在一個實施例中,將多個信號量組織為包括與屬于PPU202的工作隊列數(shù)目相同的條目的數(shù)據(jù)對象,其在圖5中示出為信號量512。另外在圖5中示出了信號量512的信號量條目514和工作隊列504的條目506之間存在的——對應(yīng)516。
[0070]如本文所描述的,GP_GET指針是屬于PPU202的工作隊列的多個條目的第一可用條目的索引。在步驟408,設(shè)備驅(qū)動程序103讀取屬于PI3U的工作隊列(例如圖6B的屬于PPU的信道612)的GP_GET指針并且將工作隊列中的第一可用條目指向在步驟406所生成的命令塊。這在圖6B中示出為指向工作隊列614的第一條目的GP_GET615。在步驟410,設(shè)備驅(qū)動程序103將GP_PUT指針指向?qū)儆赑PU202的工作隊列的多個條目中的最后條目,以允許線程將位于GP_GET和GP_PUT之間的自由條目指向包括本地生成的PPU202工作的所生成的命令塊。在一個實施例中,將GP_PUT指針指向由函數(shù)“wrap (GP_GET_1, work_queue_entry_count)”所產(chǎn)生的返回值,其中work_queue_entry_count表示工作隊列中的條目的總數(shù)。在一個實施例中,wrap ()函數(shù)以基于工作隊列中的條目的數(shù)目的方式加以執(zhí)行。更具體地,如果work_queue_entry_count的值不是2的冪,那么wrap ()函數(shù)被執(zhí)行如下:
[0071]int wrap(inl x, int work queue entry_counI) {
if (X.< 0) { return x + work queue enlry count; }
else if (x >= work—queue—entry—count { return x -
work—queue—entry_count; }
else { return x; }
}
否則,如果work—queue—entry—count的值是2的冪,那么、vrap ()函數(shù)被執(zhí)行如下:
int wrap(int x, int log2_pushbbufer_entry count) {
return (x & ((I ? log2_pushbbufer_entry count) -1));
I
I
[0072]由于PCI Express規(guī)范中的限制,用于任何信道的GP_GET和GP_PUT的值對在PPU202上運行的線程是不可訪問的。結(jié)果是,線程無法通過操縱這些值將工作添加到屬于PPU202的工作隊列。為了消除該缺陷,在步驟412對通過其線程能夠以受控制的方式并發(fā)地將工作添加到工作隊列中的方法進行了描述。在該步驟中,設(shè)備驅(qū)動程序103生成“softGP_PUT ”指針和“ shadow GP_PUT ”指針,其中“ soft GP_PUT ”指針經(jīng)初始化以指向在由屬于PPU的工作隊列的GP_GET指針所 指向的條目之后的條目,并且“ shadow GP_PUT”指針經(jīng)初始化以指向與屬于PPU的工作隊列的GP_PUT指針相同的條目。不同于GP_GET指針和GP_PUT指針,“soft GP_PUT”指針和“shadow GP_PUT”指針二者都對線程是可訪問的。以該方式,線程可以原子地更新并且讀取“soft GP_PUT”指針和“shadow GP_PUT”指針以確定新的工作可以插入其中的屬于PPU202的工作隊列下一個可用條目。
[0073]在步驟414,主機接口 206執(zhí)行在步驟404所插入的“等待空閑”命令,等待直到在PPU202上執(zhí)行的所有線程已經(jīng)指示它們已經(jīng)完成執(zhí)行為止,包括它們所生成的所有存儲器事務(wù)。在圖6A中示出為WFI命令的該步驟阻止GP_GET606被增大直到線程已經(jīng)完成為止。在接收到這類指示時,方法400繼續(xù)進行到步驟416,其中主機接口 206執(zhí)行信號量釋放命令,其釋放在步驟406所生成的信號量以使屬于PPU202的工作隊列中的PI3U所生成的工作開始執(zhí)行。以下結(jié)合6C-6F對在主機接口 206釋放信號量之后發(fā)生什么的示范性示出進行了描述。
[0074]圖4B-4C示出了根據(jù)本發(fā)明一個實施例的、用于通過線程在用于圖1的計算機系統(tǒng)的并行處理子系統(tǒng)之一上執(zhí)行的方式本地生成工作的方法450。為了清楚,以下所包括的方法450的描述包括對圖5和6A-6F的引用,其示出了貫穿方法450所論述的各存儲器對象之間的示范性關(guān)系和內(nèi)容。盡管結(jié)合圖1、2、3A、3B和3C的系統(tǒng)對方法步驟進行了描述,但是本領(lǐng)域普通技術(shù)人員應(yīng)該理解配置為以任何順序?qū)嵤┓椒ú襟E的任何系統(tǒng)均在本發(fā)明的范圍內(nèi)。
[0075]如所示的,方法450始于步驟452,其中在PPU202之一內(nèi)執(zhí)行的線程接收I)指向?qū)儆赑PU202的工作隊列的指針-該屬于PPU202的工作隊列由設(shè)備驅(qū)動程序103根據(jù)圖4A的步驟404生成-其配置為使能在PPU202上的工作的本地生成和執(zhí)行,2) “soft GP_PUT”指針-其也由設(shè)備驅(qū)動程序103根據(jù)圖4A的步驟412生成-以及3) “shadow GP_PUT”指針-其由設(shè)備驅(qū)動程序103根據(jù)圖4A的步驟412進一步生成。
[0076]在步驟454,線程生成N個命令塊,每個命令塊包括多個命令。這類命令塊的示例在圖5中示出為命令塊518-2,其包括由線程所生成的多個基于PPU的命令520。在步驟456,線程利用基于PPU202的指令填充命令塊。
[0077]在步驟458,線程生成另一個命令塊并且它將信號量獲得命令插入命令塊的第一條目。該命令當稍后由主機接口 206執(zhí)行時將使它阻塞直到將值寫入與信號量相對應(yīng)的存儲器的區(qū)域。這類單條目命令塊的示例在圖5中示出為命令塊518-3。在步驟460,線程發(fā)出原子請求以將“soft GP_PUT”增大N+1。由原子增大請求所返回的值用作已經(jīng)為線程的工作所分配的屬于PPU202的工作隊列中的N+1個條目(將用來指向在步驟454中所生成的命令塊的N個條目和將用來指向在步驟458中所生成的命令塊的一個條目)的序列中的第一條目的索引。
[0078]在步驟462,線程確定在屬于PPU202的工作隊列中是否存在可以分別指向在步驟454和458所生成的N+1個命令塊的足夠的可用自由條目。在一個實施例中,該確定通過將由步驟460的原子增大請求所返回的值與“shadow GP_PUT”指針作比較做出,以確?!皊oftGP_PUT”加上N+1的加法不超過“shadow GP_PUT”指針,其指示在屬于PPU202的工作隊列中存在足夠的可用自由條目。之后線程將屬于PPU的工作隊列中的N個條目指向在步驟454中所生成的命令塊,并且進一步地將在屬于PPU202的工作隊列中的N+1個經(jīng)分配的條目中的最后一個指向具有在步驟458所生成的信號量獲得命令的命令塊。
[0079]在步驟464,線程確定由線程所生成的所有新的工作是否已經(jīng)被完全插入屬于PPU的工作隊列。當所有新的工作已經(jīng)事實上完全被插入工作隊列時,那么在步驟466,線程釋放與緊接在由步驟460的原子增大所導(dǎo)致的條目之前的工作隊列條目相對應(yīng)的信號量。在該情況下信號量釋放通過將對應(yīng)信號量獲得命令配置為等待的值寫到信號量的存儲器塊來實施。這將允許一旦主機接口 206可以調(diào)度包括在由步驟454和458中的線程所生成的命令塊中的工作(命令),就由主機接口 206執(zhí)行它們。這將僅在插入工作隊列中的由線程在步驟454和458中所生成的命令塊之前的所有命令塊執(zhí)行之后發(fā)生,其可以包括信號量獲得命令,諸如那些在步驟458或在步驟406中所插入的,其將阻止主機接口 206取得進步,暫停它們的釋放。步驟464的示范性場景在圖6D和6E中示出。
[0080]在步驟468,線程通過專用邏輯的方式確定附加工作是否需要被插入屬于PPU202的工作隊列。如果需要,那么方法450前進到步驟470,其中線程將指向包含“等待空閑”(WFI)命令、“信號量釋放Y”命令和“信號量獲得X”命令的命令塊的條目插入屬于PPU202的工作隊列,跟隨在步驟454到464中所描述的方法之后。當主機接口 206執(zhí)行這些命令時,首先,“等待空閑”命令保證屬于PI3U的信道612中的所有工作(還稱為屬于PPU202的工作隊列)已經(jīng)完成,其次,“信號量釋放Y”命令將值寫入信號量Y的存儲器塊,其解阻塞由在步驟404所生成的“信號量獲得Y”命令阻塞的屬于CPU的工作隊列中的任何工作。最后,“信號量獲得X”命令在主機接口 206處理屬于PI3U的信道612的同時阻塞主機接口 206的進一步進展。該事件的示范性場景在圖6F中示出。
[0081]圖6A-6F示出了根據(jù)本發(fā)明一個實施例的、使得工作能夠在PPU202之一內(nèi)被本地生成并且執(zhí)行的兩個不同信道之間的示范性交互。如圖6A所示,屬于CPU的信道602包括工作隊列604,工作隊列604包括多個條目,GP_GET指針606和GP_PUT指針608。屬于CPU的信道602代表通過其CPU102能夠使PPU202執(zhí)行工作的信道。在該示例中,包括在內(nèi)核啟動中的工作根據(jù)本文所描述的技術(shù)使附加工作在PPU202內(nèi)生成并且在PPU202內(nèi)執(zhí)行。
[0082]在圖6A中,GP_GET指針606指向包括對由設(shè)備驅(qū)動程序103所支持的特定API內(nèi)的函數(shù)的引用的內(nèi)核啟動,設(shè)備驅(qū)動程序103使得開發(fā)者能夠向主機接口 206指示當工作請求被執(zhí)行時其將使在PPU202上執(zhí)行的一個或多個線程本地生成將由PPU202加以執(zhí)行的附加(即嵌套工作)。設(shè)備驅(qū)動程序103根據(jù)以上結(jié)合圖4A所描述的技術(shù)初始化在圖6B中所示出的屬于PPU的信道612。
[0083]如圖6B所示,屬于PI3U的信道612包括多個條目,其包括當屬于CPU的信道602內(nèi)的“釋放X”條目指向GP_GET606時被解阻塞的“獲得X”條目。另外在圖6B中示出了 GP_PUT616,其已經(jīng)被設(shè)置為指向工作隊列614的最后條目,以建立線程可以把將要被執(zhí)行的新的工作插入其中的條目的范圍。另外在圖6B中示出了第一命令塊(PBS-1),其由當生成“PBS-2”的線程指示沒有附加工作將由線程生成時由線程解阻塞的“獲得A”信號量條目所跟隨。屬于PPU的信道612還包括第二命令塊(“PBS-2”),其由當線程確定沒有附加工作需要被生成并且實施步驟468時被解阻塞的“獲得B”信號量條目所跟隨。
[0084]圖6C示出了屬于CPU的信道602內(nèi)的信號量X的釋放,其在圖4A的步驟416發(fā)生并且使GP_GET指針615移動到工作隊列614中的下一個條目,即PBS-1。圖6D示出了包括在PBS-1中的工作的執(zhí)行。當生成PBS-2的線程指示PBS-2已經(jīng)完全被插入工作隊列中時釋放信號量A,在此之后主機接口 206將GP_GET推進到指向包含PBS-2的條目。圖6E示出了包括在PBS-2中的工作的執(zhí)行。最后,信號量B當線程確定不再有工作將被生成并且實施步驟468時被釋放。示出在圖6D和6E 二者中的事件代表以上所描述的方法450的方法步驟464-466。最后,圖6F示出了信號量Y的釋放,其使控制返回到屬于CPU的信道602。特別地,圖6F示出了以上所描述的方法450的步驟470。
[0085]組合起來,本發(fā)明所描述的實施例使得在PPU202上執(zhí)行的線程能夠通過屬于PPU202的工作隊列和命令塊的方式在PPU202內(nèi)本地生成并執(zhí)行工作。屬于PPU202的工作隊列的GP_GET和GP_PUT指針由設(shè)備驅(qū)動程序103設(shè)置以創(chuàng)建線程能夠直接將新的工作插入其中用于執(zhí)行的屬于PPU202的工作隊列內(nèi)的條目的范圍,其中工作存儲在由屬于PPU202的工作隊列中的條目所指向的命令塊中。線程還將屬于PPU202的工作隊列中的條目指向信號量,以阻止GP_GET在線程完成它們的工作生成之前前進通過屬于PPU202的工作隊列并且執(zhí)行本文所包括的工作。
[0086]所公開的實施例的一個優(yōu)勢是在PPU202上執(zhí)行的線程可以在PPU202內(nèi)創(chuàng)建嵌套工作而不需要向CPU102發(fā)出這樣做的請求。結(jié)果是,跨通信路徑113消耗較少的帶寬,并且進一步地,CPU102的工作負載減少,從而提高效率。此外,線程能夠執(zhí)行有用的嵌套工作而不需要依賴CPU102授權(quán)或不必等待CPU102響應(yīng)執(zhí)行嵌套工作的請求。
[0087]本發(fā)明的一個實施例可被實施為與計算機系統(tǒng)一起使用的程序產(chǎn)品。該程序產(chǎn)品的程序定義實施例的各功能(包括本文中描述的方法)并且可以被包含在各種計算機可讀存儲介質(zhì)上。示出的計算機可讀存儲介質(zhì)包括但不限于:(i)不可寫的存儲介質(zhì)(例如,計算機內(nèi)的只讀存儲器設(shè)備,諸如可由CD-ROM驅(qū)動器讀取的壓縮光盤只讀存儲器(CD-ROM)盤、閃存、只讀存儲器(ROM)芯片或任何類型的固態(tài)非易失性半導(dǎo)體存儲器),在其上存儲永久性信息jP(ii)可寫的存儲介質(zhì)(例如,磁盤驅(qū)動器或硬盤驅(qū)動器內(nèi)的軟盤或者任何類型的固態(tài)隨機存取半導(dǎo)體存儲器),在其上存儲可更改的信息。
[0088]以上已參照特定實施例對本發(fā)明進行了描述。然而,本領(lǐng)域普通技術(shù)人員將理解的是,可對此做出各種修改和變化而不脫離如隨附權(quán)利要求書中所闡釋的本發(fā)明的較寬精神和范圍。因此,前面的描述以及附圖應(yīng)被視為是例示性而非限制性的意義。
[0089]因此,本發(fā)明的實施例的范圍在隨附的權(quán)利要求書中加以闡述。
【權(quán)利要求】
1.一種用于配置工作隊列以使能在并行處理子系統(tǒng)中執(zhí)行的線程在所述并行處理子系統(tǒng)內(nèi)生成并執(zhí)行工作的方法,所述方法包括: 生成所述工作隊列,其中所述工作隊列包括多個條目并且與第一指針和第二指針相關(guān)聯(lián),所述第一指針和所述第二指針中的每一個對所述線程是不可訪問的; 建立所述工作隊列中的自由條目的范圍,通過: 將所述第一指針指向所述多個條目的第一條目;以及 將所述第二指針指向所述多個條目的最后條目; 生成指向所述多個條目的所述第一條目的第三指針,其中所述第三指針對所述線程是可訪問的; 生成指向所述多個條目的所述最后條目的第四指針,其中所述第四指針對所述線程是可訪問的; 將所述工作隊列的所述第一條目指向包含指向被阻塞的信號量的信號量獲得命令的命令塊; 經(jīng)由所述第三和第四指針將工作加載到所述工作隊列中; 確定所述線程已經(jīng)完成加載工作;以及 釋放所述信號量以使所述第一指針前進到所述工作隊列中的下一個條目并且使所述并行處理子系統(tǒng)執(zhí)行由所述線程所生成的工作。
2.如權(quán)利要求1所述的方法,其中所述第一指針和所述第二指針二者都包括基于快速外圍部件互連(PC1-E)的指針。
3.如權(quán)利要求1所述的方法,其中所述第三指針和所述第四指針二者都存儲在對所述線程可訪問的、包括在所述并行處理子系統(tǒng)中的存儲器的區(qū)域。
4.如權(quán)利要求1所述的方法,其中釋放所述第一信號量包括將值寫入所述第一信號量所針對的存儲器的區(qū)域。
5.如權(quán)利要求1所述的方法,其中所述工作隊列響應(yīng)于檢測到所述線程正在引用一個或多個應(yīng)用編程接口(API)函數(shù)而生成,所述一個或多個應(yīng)用編程接口(API)函數(shù)針對在所述并行處理子系統(tǒng)內(nèi)生成并執(zhí)行工作。
6.如權(quán)利要求1所述的方法,其中所述工作隊列中的每個條目配置為指向命令塊。
7.如權(quán)利要求1所述的方法,其中每個命令塊配置為存儲由所述并行處理子系統(tǒng)可執(zhí)行的指令或命令。
8.一種并行處理子系統(tǒng),包括使能在所述并行處理子系統(tǒng)中執(zhí)行的線程在所述并行處理子系統(tǒng)內(nèi)生成并執(zhí)行工作的工作隊列,所述系統(tǒng)包括: 所述并行處理子系統(tǒng);以及 驅(qū)動程序,與所述并行處理子系統(tǒng)相配合,其中所述驅(qū)動程序配置為: 生成所述工作隊列,其中所述工作隊列包括多個條目并且與第一指針和第二指針相關(guān)聯(lián),其中所述第一指針和所述第二指針中的每一個對所述線程是不可訪問的; 建立所述工作隊列中的自由條目的范圍,通過: 將所述第一指針指向所述多個條目的第一條目;以及 將所述第二指針指向所述多個條目的最后條目; 生成指向所述多個條目的所述第一條目的第三指針,其中第三指針對所述線程是可訪問的; 生成指向所述多個條目的所述最后條目的第四指針,其中所述第四指針對所述線程是可訪問的; 將所述工作隊列的所述第一條目指向包含指向被阻塞的信號量的信號量獲得命令的命令塊; 經(jīng)由所述第三和第四指針將工作加載到所述工作隊列中; 確定所述線程已經(jīng)完成將工作加載到所述工作隊列中;以及 釋放所述信號量以使所述第一指針前進到所述工作隊列中的下一個條目并且使所述并行處理子系統(tǒng)執(zhí)行由所述線程所生成的工作。
9.如權(quán)利要求8所述的并行處理子系統(tǒng),其中所述工作隊列響應(yīng)于檢測到所述線程正在引用一個或多個應(yīng)用編程接口(API)函數(shù)而生成,所述一個或多個應(yīng)用編程接口(API)函數(shù)針對在所述并行處理子系統(tǒng)內(nèi)生成并執(zhí)行工作。
10.如權(quán)利 要求8所述的并行處理子系統(tǒng),其中所述工作隊列中的每個條目配置為指向命令塊。
【文檔編號】G06F9/445GK103793206SQ201310518042
【公開日】2014年5月14日 申請日期:2013年10月28日 優(yōu)先權(quán)日:2012年10月26日
【發(fā)明者】依格納西奧·利亞馬斯, 克雷格·羅斯·杜特韋勒, 杰弗里·A·博爾茲, 丹尼爾·埃利奧特·韋克斯勒 申請人:輝達公司