用于有條件的屏障和急迫的屏障的硬件調(diào)度的系統(tǒng)和方法
【專利摘要】提供用于屏障指令的硬件調(diào)度的方法和系統(tǒng)。發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令,并且當在程序的執(zhí)行期間每個線程到達屏障指令時,確定線程是否參與屏障指令。之后串行地執(zhí)行參與屏障指令的線程以處理跟隨在屏障指令之后的程序的一個或多個指令。還提供用于屏障指令的急迫調(diào)度的方法和系統(tǒng)。當大于最小數(shù)目的線程并且小于多個線程中的所有線程的線程的一部分到達屏障指令時,串行地執(zhí)行該部分中的線程中的每一個以處理跟隨在屏障指令之后的程序的一個或多個指令。
【專利說明】用于有條件的屏障和急迫的屏障的硬件調(diào)度的系統(tǒng)和方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及程序執(zhí)行,并且更具體地,涉及有條件的或急迫的(impatient)屏障(barrier)。
【背景技術(shù)】
[0002]常規(guī)的并行處理架構(gòu)支持多個線程的執(zhí)行。在程序的執(zhí)行期間使用常規(guī)的并行處理架構(gòu)實施的特定操作可能要求多個線程的同步。屏障指令(或柵欄(fence)指令)用來在這類程序的執(zhí)行期間使多個線程的執(zhí)行同步。并行處理架構(gòu)內(nèi)的調(diào)度單元識別屏障指令并且確保所有線程在任何線程執(zhí)行該特定屏障指令以后的指令之前到達該特定屏障指令。在一些情況下,不一定使屏障指令處的所有線程同步并且不要求同步的線程的執(zhí)行一定被延遲。
[0003]因此,存在對于解決調(diào)度執(zhí)行線程以處理屏障指令的問題和/或與現(xiàn)有技術(shù)相關(guān)聯(lián)的其他問題的需求。
【發(fā)明內(nèi)容】
[0004]提供用于調(diào)度有條件的屏障的執(zhí)行的系統(tǒng)和方法。發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令,并且當在程序的執(zhí)行期間每個線程到達屏障指令時,確定線程是否參與屏障指令。之后串行地執(zhí)行參與屏障指令的線程以處理跟隨在屏障指令之后的程序的一個或多個指令。
[0005]還提供用于屏障指令的急迫調(diào)度的方法和系統(tǒng)。發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令,并且當大于最小數(shù)目的線程并且小于多個線程中的所有線程的線程的一部分到達屏障指令時,串行地執(zhí)行該部分中的線程中的每一個以處理跟隨在屏障指令之后的程序的一個或多個指令。
【專利附圖】
【附圖說明】
[0006]圖1是示出了配置為實現(xiàn)本公開的一個或多個方面的計算機系統(tǒng)的框圖;
[0007]圖2是根據(jù)本公開的一個實施例的、用于圖1的計算機系統(tǒng)的并行處理子系統(tǒng)的框圖;
[0008]圖3A是根據(jù)本公開的一個實施例的、圖2的前端的框圖;
[0009]圖3B是根據(jù)本公開的一個實施例的、圖2的并行處理單元之一內(nèi)的通用處理集群的框圖;
[0010]圖3C是根據(jù)本公開的一個實施例的、圖3B的流多處理器的一部分的框圖;以及
[0011]圖4是根據(jù)本公開的一個示范性實施例的、示出了 CTA的線程塊的示意圖;
[0012]圖5A是根據(jù)本公開的一個示范性實施例的、圖3C的線程束(warp)調(diào)度器和指令單元的框圖;
[0013]圖5B是根據(jù)本公開的一個示范性實施例的、圖5A的調(diào)度單元和屏障調(diào)度單元的一部分的框圖;
[0014]圖6A示出了根據(jù)本公開的一個示范性實施例的、用于基于邏輯標識符調(diào)度指令用于執(zhí)行的方法;以及
[0015]圖6B示出了根據(jù)本公開的一個示范性實施例的、用于實施圖6A所示的步驟的方法。
[0016]圖6C示出了根據(jù)本公開的一個示范性實施例的、用于實施圖6B所示的步驟的方法。
【具體實施方式】
[0017]提供用于調(diào)度使得線程子集能夠參與屏障指令的有條件的屏障的執(zhí)行的系統(tǒng)和方法。發(fā)起線程的執(zhí)行以處理包括屏障指令的程序的指令,并且當每個線程到達屏障指令時,確定線程是否參與屏障指令。執(zhí)行參與屏障指令的線程以處理跟隨在屏障指令之后的程序的一個或多個指令。不參與屏障指令的線程可以繼續(xù)執(zhí)行而不等待其他線程到達屏障指令。
[0018]現(xiàn)在將關(guān)于各可選架構(gòu)和特征來闡述更多示例性的信息,根據(jù)用戶的期望可以采用所述架構(gòu)和特征來實現(xiàn)或不實現(xiàn)前述的技術(shù)。應(yīng)該特別注意下面的信息出于示例性的目的而闡述并且其不應(yīng)該被認為是以任何方式進行限制。下面特征中的任何一個可以可選地合并,排斥或無需排斥所述的其他特征。
[0019]圖1為示出了配置為實現(xiàn)本公開的一個或多個方面的計算機系統(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 (例如常規(guī)的基于陰極射線管或液晶顯示器的監(jiān)視器)的圖形子系統(tǒng)。系統(tǒng)盤114也連接到I/O橋107。交換器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é)議。
[0020]在一個實施例中,并行處理子系統(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)。
[0021]應(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。
[0022]圖2示出了根據(jù)本公開的一個實施例的并行處理子系統(tǒng)112。如所示的,并行處理子系統(tǒng)112包括一個或多個并行處理單元(PI3U) 202,每個并行處理單元202都耦連到本地并行處理(PP)存儲器204。通常,并行處理子系統(tǒng)包括U個PPU,其中U〉I。(本文中,類似對象的多個實例需要時以標識對象的參考數(shù)字和標識實例的括號中的數(shù)字來表示。)PPU202和并行處理存儲器204可使用一個或多個集成電路設(shè)備來實現(xiàn),諸如可編程處理器、專用集成電路(ASIC)或存儲器設(shè)備,或者以任何其他技術(shù)可行的方式來實現(xiàn)。
[0023]再參考圖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。
[0024]在操作中,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)的指針寫到入棧緩沖區(qū)(pushbuf f er )以發(fā)起對數(shù)據(jù)結(jié)構(gòu)中的命令流的處理。PPU202從一個或多個入棧緩沖區(qū)讀取命令流,然后相對于CPU102的操作異步地執(zhí)行命令??梢越?jīng)由設(shè)備驅(qū)動程序103由應(yīng)用程序為每個入棧緩沖區(qū)指定執(zhí)行優(yōu)先級以控制對不同入棧緩沖區(qū)的調(diào)度。
[0025]現(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集成在單個芯片上。
[0026]在一個實施例中,通信路徑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讀取每個入棧緩沖區(qū),并且將存儲在入棧緩沖區(qū)中的命令流輸出到前端212。
[0027]有利地,每個PPU202都實現(xiàn)高度并行處理架構(gòu)。如詳細示出的,PPU202 (O)包括處理集群陣列230,該陣列230包括C個通用處理集群(GPC)208,其中C≥1。每個GPC208能夠并發(fā)執(zhí)行大量的(例如,幾百或幾千)線程,其中每個線程是程序的實例(instance)。在各種應(yīng)用中,可分配不同的GPC208用于處理不同類型的程序或用于實施不同類型的計算。GPC208的分配可以取決于因每種類型的程序或計算所產(chǎn)生的工作量而變化。
[0028]GPC208從任務(wù)/工作單元207內(nèi)的工作分布單元接收所要執(zhí)行的處理任務(wù)。工作分布單元接收指向編碼為任務(wù)元數(shù)據(jù)(TMD)并存儲在存儲器中的處理任務(wù)的指針。指向TMD的指針包括在存儲為入棧緩沖區(qū)并由前端單元212從主機接口 206接收的命令流中。可以編碼為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ù)??蛇x地,TMD可包括控制將TMD添加到處理任務(wù)列表(或指向處理任務(wù)的指針的列表)的頭部還是尾部的參數(shù),從而提供除優(yōu)先級以外的另一級別的控制。
[0029]存儲器接口 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的可用帶寬。
[0030]任何一個GPC208都可以處理要被寫到并行處理存儲器204內(nèi)的任何DRAM220的數(shù)據(jù)。交叉開關(guān)單元210配置為路由每個GPC208的輸出到任何分區(qū)單元215的輸入或到另一個GPC208用于進一步處理。GPC208通過交叉開關(guān)單元210與存儲器接口 214通信,以對各種外部存儲器設(shè)備進行讀取或?qū)懭?。在一個實施例中,交叉開關(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ù)流。
[0031] 另外,GPC208可被編程以執(zhí)行與種類繁多的應(yīng)用相關(guān)的處理任務(wù),包括但不限于,線性和非線性數(shù)據(jù)變換、視頻和/或音頻數(shù)據(jù)過濾、建模操作(例如,應(yīng)用物理定律以確定對象的位置、速率和其他屬性)、圖像渲染操作(例如,曲面細分(tessellat1n)著色器、頂點著色器、幾何著色器、和/或像素著色器程序)等等。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。
[0032]PPU202可配備有任何容量(amount)的本地并行處理存儲器204,包括沒有本地存儲器,并且可以以任何組合方式使用本地存儲器和系統(tǒng)存儲器。例如,在統(tǒng)一存儲器架構(gòu)(UMA)實施例中,PPU202可以是圖形處理器。在這樣的實施例中,將不提供或幾乎不提供專用的圖形(并行處理)存儲器,并且PPU202會以排他或幾乎排他的方式使用系統(tǒng)存儲器。在UMA實施例中,PPU202可集成到橋式芯片中或處理器芯片中,或作為具有高速鏈路(例如,PCI Express)的分立芯片提供,所述高速鏈路經(jīng)由橋式芯片或其他通信手段將PPU202連接到系統(tǒng)存儲器。
[0033]如上所示,在并行處理子系統(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)等等。
[0034]多個并發(fā)任務(wù)調(diào)度
[0035]可以在GPC208上并發(fā)執(zhí)行多個處理任務(wù)并且處理任務(wù)在執(zhí)行期間可以生成一個或多個“子”處理任務(wù)。任務(wù)/工作單元207接收任務(wù)并動態(tài)調(diào)度處理任務(wù)和子處理任務(wù)用于由GPC208執(zhí)行。
[0036]圖3A為根據(jù)本公開的一個實施例的圖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ù)。
[0037]工作分布單元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ù)。
[0038]不同于由任務(wù)/工作單元207從前端212接收的任務(wù),子任務(wù)從處理集群陣列230接收。子任務(wù)不被插入入棧緩沖區(qū)或傳送到前端。當生成子任務(wù)或?qū)⒂糜谧尤蝿?wù)的數(shù)據(jù)存儲在存儲器中時不通知CPU102。通過入棧緩沖區(qū)提供的任務(wù)與子任務(wù)之間的另一個區(qū)別是通過入棧緩沖區(qū)提供的任務(wù)由應(yīng)用程序來定義而子任務(wù)是在任務(wù)執(zhí)行期間動態(tài)生成的。
[0039]任務(wù)處理概述
[0040]圖3B為根據(jù)本公開的一個實施例的在圖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處理機制的功能子集。類似地,SISD (單指令單數(shù)據(jù))或MMD (多指令多數(shù)據(jù))機制也代表SMT處理機制的功能子集。
[0041]經(jīng)由將處理任務(wù)分布到流多處理器(SM) 310的管線管理器305來有利地控制GPC208的操作。管線管理器305還可配置為通過為由SM310所輸出的處理數(shù)據(jù)指定目的地來控制工作分布交叉開關(guān)330。
[0042]在一個實施例中,每個GPC208包括M個SM310,其中M≥1,每個SM310配置為處理一個或多個線程組。另外,如本領(lǐng)域已知的,每個SM310有利地包括可以管線化的同樣功能執(zhí)行單元集(例如執(zhí)行單元和加載-存儲單元一在圖3C中示出為Exec單元302和LSU303 ),其允許在前一個指令已經(jīng)結(jié)束之前發(fā)出新指令。可提供功能執(zhí)行單元的任何組合。在一個實施例中,功能單元支持各種各樣的操作,包括整數(shù)和浮點運算(例如加法和乘法)、比較操作、布爾操作(AND、0R、X0R)、移位和各種代數(shù)函數(shù)的計算(例如平面插值、三角函數(shù)、指數(shù)函數(shù)和對數(shù)函數(shù)等等);以及相同功能單元硬件可均衡地用來實施不同的操作。
[0043]如本文之前所定義的,傳送到特定GPC208的一系列指令由一個或多個線程執(zhí)行,并且跨SM310內(nèi)的并行處理引擎(未示出)的某一數(shù)目的并發(fā)執(zhí)行線程的集合在本文中稱為“線程束”或“線程組”。如本文所使用的,“線程組”是指對不同輸入數(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個線程組。
[0044]此外,多個相關(guān)線程束可以在SM310內(nèi)同時活動(在執(zhí)行的不同階段)。該線程組集合在本文中稱為“協(xié)作線程陣列”(“CTA”)或“線程陣列”。每個CTA包括編程者所指定的在同一 SM310中執(zhí)行的線程束的數(shù)目。一個或多個CTA可潛在地在同一 SM310中并發(fā)執(zhí)行。CTA的大小一般由編程者以及可用于CTA的硬件資源諸如存儲器或寄存器的容量來確定。
[0045]每個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ù)。
[0046]每個GPC208可以包括配置為將虛擬地址映射到物理地址中的存儲器管理單元(MMU)328。在其他實施例中,MMU328可以駐留在存儲器接口 214內(nèi)。MMU328包括用于將虛擬地址映射到物理地址的頁表條目(PTE)集。MMU328可以包括地址轉(zhuǎn)譯后備緩沖區(qū)(TLB)或可以駐留在多處理器SM310或LI高速緩存或GPC208內(nèi)的高速緩存。物理地址經(jīng)處理以分布數(shù)據(jù)訪問位置來允許高效請求在分區(qū)單元215之間交錯。高速緩存行索引可用于確定用于聞速緩存行的請求是命中還是未命中。
[0047]在圖形和計算應(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)譯。
[0048]應(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ù)。
[0049]本領(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>
[0050]在本發(fā)明的實施例中,使用計算系統(tǒng)的PPU202或其他處理器來使用線程陣列執(zhí)行通用計算是可取的。為線程陣列中的每個線程指派在線程的執(zhí)行期間對于線程可訪問的唯一的線程標識符(“線程ID”)??杀欢x為一維或多維數(shù)值的線程ID控制線程處理行為的各方面。例如,線程ID可用于確定線程將要處理輸入數(shù)據(jù)集的哪部分和/或確定線程將要產(chǎn)生或?qū)戄敵鰯?shù)據(jù)集的哪部分。
[0051]每線程指令序列可包括定義線程陣列的代表性線程和一個或多個其他線程之間的協(xié)作行為的至少一個指令。例如,每線程指令序列可能包括在序列中的特定點處掛起用于代表性線程的操作執(zhí)行直到諸如其他線程的一個或多個到達該特定點的時間為止的指令、用于代表性線程將數(shù)據(jù)存儲在其他線程的一個或多個有權(quán)訪問的共享存儲器中的指令、用于代表性線程原子地讀取和更新存儲在其他線程的一個或多個基于它們的線程ID有權(quán)訪問的共享存儲器中的數(shù)據(jù)的指令等等。程序還可以包括計算數(shù)據(jù)將從其讀取的共享存儲器中的地址的指令,該地址是線程ID的函數(shù)。通過定義合適的函數(shù)并提供同步技術(shù),可以以可預(yù)測的方式由CTA的一個線程將數(shù)據(jù)寫入共享存儲器中的給定位置并由同一個CTA的不同線程從該位置讀取數(shù)據(jù)。因此,數(shù)據(jù)在線程之間共享的任何期望模式可以得到支持,以及CTA中的任何線程可以與同一個CTA中的任何其他線程共享數(shù)據(jù)。如果存在數(shù)據(jù)在CTA的線程之間的共享,則其范圍由程序確定;因此,應(yīng)該理解的是,在使用CTA的特定應(yīng)用中,CTA的線程可能會或可能不會真正互相共享數(shù)據(jù),這取決于程序,術(shù)語“CTA”和“線程陣列”在本文作為同義詞使用。
[0052]圖3C為根據(jù)本公開的一個實施例的圖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。
[0053]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的標識符。
[0054]如果TMD322是網(wǎng)格TMD,則TMD322的執(zhí)行會啟動和執(zhí)行固定數(shù)目的CTA以處理存儲在隊列中的固定量的數(shù)據(jù)。將CTA的數(shù)目指定為網(wǎng)格寬度、高度和深度的乘積??梢詫⒐潭康臄?shù)據(jù)存儲在TMD322中或TMD322可以存儲指向?qū)⒂蒀TA所處理的數(shù)據(jù)的指針。TMD322還存儲由CTA所執(zhí)行的程序的開始地址。
[0055]如果TMD322是隊列TMD,那么使用TMD322的隊列特點,這意味著將要被處理的數(shù)據(jù)量不一定是固定的。隊列條目存儲用于由指派到TMD322的CTA所處理的數(shù)據(jù)。隊列條目還可以代表在線程執(zhí)行期間由另一個TMD322所生成的子任務(wù),從而提供嵌套并行性。通常線程或包括線程的CTA的執(zhí)行被掛起直到子任務(wù)的執(zhí)行完結(jié)??梢詫㈥犃写鎯υ赥MD322中或與TMD322分開存儲,在該情況下TMD322存儲指向該隊列的隊列指針。有利地,當代表子任務(wù)的TMD322正在執(zhí)行時可以將由子任務(wù)所生成的數(shù)據(jù)寫到隊列。隊列可以實現(xiàn)為循環(huán)隊列以使得數(shù)據(jù)的總量不限于隊列的大小。
[0056]屬于網(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ù)。
[0057]參數(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訪問全局存儲器??梢詫⑷执鎯ζ鞯母鞑糠执鎯υ贚I高速緩存320中。
[0058]每個線程將本地寄存器堆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ù)值。
[0059]共享存儲器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)的指定段(sect1n),或者實現(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)一存儲器空間中的地址來訪問本地、共享或全局存儲器空間中的任何一個。
[0060]每個SM310中的LI高速緩存320可以用于高速緩存私有的每線程本地數(shù)據(jù)還有每應(yīng)用全局數(shù)據(jù)。在一些實施例中,可以將每CTA共享數(shù)據(jù)高速緩存在LI高速緩存320中。LSU303經(jīng)由存儲器和高速緩存互連380耦連到共享存儲器306和LI高速緩存320。
[0061]線程邏輯標識符
[0062]包括多個工作項的輸入工作緩沖區(qū)被指派到CTA用于處理。工作緩沖區(qū)可以包括用于像素塊(pixel tile)的工作項,其中每個工作項與像素塊的特定區(qū)域相對應(yīng)。等于工作緩沖區(qū)中的工作項的數(shù)目的若干線程附屬于“父”CTA。如果存在過多工作項,那么僅可用工作項的子集可以被附屬于“父”CTA。相對于父CTA的邏輯標識符被指派到每個線程并且邏輯標識符依次增量,以使得邏輯標識符指示線程被啟動的順序。在線性空間而非多維空間中定義邏輯標識符。當需要時,線程可以配置為基于邏輯標識符執(zhí)行代碼的關(guān)鍵(critical)段。當邏輯標識符由每個線程所使用以索引輸入工作緩沖區(qū)時,可以按工作順序(經(jīng)由邏輯至物理線程映射)執(zhí)行CTA的線程。重要的是,用于線程的邏輯標識符存儲在SM310內(nèi),所以即使處理工作被存儲在SM310外,也可以標識由邏輯標識符所指定的、序列中進行處理的下一個線程。之后,可以將用于下一個線程的處理工作加載到SM310中用于處理。
[0063]為了維護從邏輯線程ID至物理線程的映射,引入線程塊的概念,其中每個線程塊與固定的物理線程集相對應(yīng)(例如每塊16個線程)。當啟動新的工作時,一次為物理線程分配一個線程塊。以此方式,僅需要以每塊的粒度而非每線程的粒度維護映射。圖4是根據(jù)本公開的一個示范性實施例的、示出了 CTA的線程塊的示意圖。如圖4所示,16個CTA可正執(zhí)行在SM310內(nèi)并且每個CTA可使用八個不同屏障,每個屏障具有唯一的屏障標識符。屏障可以包括“頂”和“底”屏障指令以定義程序內(nèi)的關(guān)鍵代碼段的開始和終結(jié)。較簡單的屏障僅包括“頂”屏障指令。在一個實施例中,“頂”屏障指令的程序計數(shù)器作為標簽被附加到屏障標識符以允許同一屏障標識符被用在單個程序中的多個地方。當同一屏障標識符在程序中出現(xiàn)多于一次時,程序計數(shù)器唯一地區(qū)分不同屏障。在另一個實施例中,使用增量計數(shù)器來生成唯一的屏障標識符。
[0064]可以為每個CTA分配至少一個線程塊,其中線程塊包括16個線程。如圖4所示,在一個實施例中,可被分配到CTA的線程塊的最大數(shù)目是8。在另一個實施例中,線程塊包括64個線程并且每個CTA可以包括512個或更多個線程。保留16個線程束用于處理線程塊,其中每個線程束包括4個線程。因此,每個線程塊是具有被一起分配的資源的64個線程的組。如圖4所示,128個線程束可以同時由SM310處理并且四個線程塊可以分布到不同的執(zhí)行單元302用于跨不同執(zhí)行單元302的負載平衡。在其他實施例中,不同數(shù)目的線程可以包括在CTA中并且線程塊可以包括不同數(shù)目的線程。
[0065]給定與特定線程相關(guān)聯(lián)的邏輯標識符,可以確定包括特定線程的相應(yīng)線程組。在一個實施例中,通過舍去邏輯標識符的最低4位來計算線程塊。邏輯標識符的最低4位是線程塊內(nèi)的偏移。通過將線程塊映射到相應(yīng)的物理標識符基并且之后使用偏移來定位為線程所分配的處理資源來計算用于線程的物理標識符。例如,物理標識符的高位可以用來確定線程塊并且較低位可以用來確定線程塊內(nèi)的特定線程??傊?,邏輯標識符是用于CTA中的每個線程的面向CTA的標識符并且物理標識符是針對CTA的用于由SM310執(zhí)行的每個線程的面向硬件的標識符。
[0066]有條件的屏障指令調(diào)度
[0067]圖5A是根據(jù)本公開的一個示范性實施例的、圖3C的線程束調(diào)度器和指令單元312的框圖。如圖5A所示,線程束調(diào)度器和指令單元312包括指令高速緩存獲取單元412,其配置為從指令LI高速緩存370獲取包含用于線程束的指令的高速緩存行。在一個實施例中,每個高速緩存行是512位寬,在單個高速緩存行中存儲8個指令(64位寬)。指令高速緩存獲取單元412將指令輸出到指令調(diào)度單元420。
[0068]指令調(diào)度單元420接收指令和線程束標識符并且繼續(xù)調(diào)度指令用于執(zhí)行。指令調(diào)度單元420可以配置為維護與在SM310上所調(diào)度的每個線程束相關(guān)聯(lián)的優(yōu)先級以及基于優(yōu)先級調(diào)度所獲取的指令。例如,調(diào)度單元425可以在任何給定的時間維護與在SM310上所調(diào)度的16個不同線程束中的每一個相關(guān)聯(lián)的6位或10位優(yōu)先級值。可以基于各種因素指派優(yōu)先級。在一個實施例中,優(yōu)先級可以基于何時在SM310上調(diào)度線程束(即最長掛起的線程束可具有最高的優(yōu)先級)。在其他實施例中,用于每個線程束的優(yōu)先級可以由程序所指定或可以基于CTA,該程序由線程束所執(zhí)行的指令定義。
[0069]指令調(diào)度單元420包括調(diào)度單元425、線程狀態(tài)510和屏障調(diào)度單元430。調(diào)度單元425不一定按不同線程束的優(yōu)先級順序選擇指令,因為指令中的一個或多個可能由于數(shù)據(jù)依賴性而未就緒用于執(zhí)行,或者因為參與屏障指令的所有線程尚未到達屏障指令。當?shù)谝恢噶羁梢员话l(fā)出時,由調(diào)度單元425調(diào)度并且輸出指令。當?shù)谝恢噶畈荒鼙话l(fā)出時,調(diào)度單元425確定用于不同線程束的指令是否可以被發(fā)出用于各自的指令。在一些情況下,第一指令可以被發(fā)出,但是第一指令是低優(yōu)先級的,使得(來自不同線程束的)另一指令可能代替其被發(fā)出。在所有情況下,用于線程束的每個單獨線程的指令按用于各自的單獨線程的指令由線程束調(diào)度器和指令單元312接收的順序被發(fā)出。
[0070]調(diào)度單元425維護基于所發(fā)出的指令被更新的SM310的狀態(tài)模型。狀態(tài)模型允許調(diào)度單元425基于程序的動態(tài)執(zhí)行和SM310內(nèi)的資源的可用性來選擇指令。例如,將執(zhí)行指令的SM310或SM310內(nèi)的功能單元或紋理單元315可以被標識為指令所需的資源并且資源的可用性可以由調(diào)度單元425使用。
[0071]由調(diào)度單元425和屏障調(diào)度單元430維護和使用狀態(tài)信息。特別地,屏障和線程需要狀態(tài)信息。屏障狀態(tài)包括下面字段中的一個或多個:參考計數(shù)、重新掃描標志、急迫標志、靜態(tài)/動態(tài)/空閑字段和屏障類型(例如簡單有條件的關(guān)鍵段、有序的關(guān)鍵段)。屏障在空閑狀態(tài)中開始。當至少一個線程到達頂屏障指令時,屏障狀態(tài)從空閑改變?yōu)殪o態(tài)。當屏障“就緒(ready)”以被執(zhí)行時,調(diào)度單元425將狀態(tài)從靜態(tài)改變?yōu)閯討B(tài)。當屏障的執(zhí)行“完成(done)”時,屏障調(diào)度單元430將狀態(tài)從動態(tài)改變?yōu)榭臻e。
[0072]線程狀態(tài)存儲在線程狀態(tài)510中并且包括下面字段中的一個或多個:屏障標識符、父CTA的標識符、邏輯標識符、完成標志和清醒/休眠標志。在下面的段落中進一步詳細描述了線程狀態(tài)510和屏障狀態(tài)的使用。
[0073]當調(diào)度單元425標識特定屏障指令的第一出現(xiàn)時,意味著在程序的執(zhí)行期間CTA的第一線程已經(jīng)到達特定屏障指令,調(diào)度單元425將由屏障指令所指定的屏障標識符的狀態(tài)從“空閑”更新為“靜態(tài)”(假設(shè)第一線程造成與參考計數(shù)相比的屏障成員計數(shù)器的增量)。不一定CTA的所有線程參與被分配到CTA的每個屏障。參與特定屏障的每個線程指定與該特定屏障相對應(yīng)的屏障標識符并且線程可以一次參與一個屏障。在一個實施例中,線程可以使用指令謂詞指示參與特定屏障。不參與屏障的線程可以被調(diào)度以執(zhí)行由調(diào)度單元425所接收的指令。不參與屏障的線程直到所有參與線程已經(jīng)到達屏障指令為止才能執(zhí)行按程序順序在屏障指令之后的指令。
[0074]調(diào)度單元425配置為當用于特定屏障的“成員”完整時,將屏障狀態(tài)從靜態(tài)改變?yōu)閯討B(tài)。各種不同的條件可以用來確定成員完整。第一條件是已經(jīng)到達屏障指令的線程的數(shù)目等于被指派到父CTA的線程的數(shù)目。第二條件是已經(jīng)到達屏障指令的線程的數(shù)目等于為屏障所指定的參考計數(shù)。第三條件是已經(jīng)到達屏障指令以及參與屏障的線程的數(shù)目等于為屏障所指定的參考計數(shù)。參考值由程序指定并且指示被期望抵達屏障的線程的數(shù)目。不參與屏障的線程將在線程狀態(tài)510中存儲O用于屏障標識符。調(diào)度單元425可以配置為隨著線程到達屏障指令而增量與特定屏障相對應(yīng)的屏障成員計數(shù)器以確定用于屏障的成員是否完整。
[0075]隨著每個參與線程到達屏障指令,更新存儲在線程狀態(tài)510中的用于線程的狀態(tài)數(shù)據(jù)。具體地,將線程狀態(tài)設(shè)置為“休眠(asle印)”,指示線程被停止并且沒有正在執(zhí)行指令。一旦成員完整,調(diào)度單元425就將屏障標識符的狀態(tài)改變?yōu)椤皠討B(tài)”并且將CTA標識符和屏障標識符輸出到屏障調(diào)度單元430。屏障調(diào)度單元430配置為調(diào)度參與屏障指令的線程用于執(zhí)行。
[0076]屏障指令可以用來描繪程序的有序和無序的關(guān)鍵代碼段。頂屏障指令在關(guān)鍵代碼段的第一指令之前立即發(fā)生并且具有與頂屏障指令相同的屏障標識符的底屏障指令在關(guān)鍵代碼段的最后指令之后立即發(fā)生。表I示出了有序的關(guān)鍵代碼段的示例。
[0077]表I
[0078]BARRIER.TOP.0CS //開始有序的關(guān)鍵段
[0079]LD R0, [address] ; //對于本地工作,將CTA計數(shù)器加載到RO中
[0080]IMAD R2, R0, Rl, R3; //使用線程值來增量
[0081 ] ST [address],R2 //將來自R2的CTA計數(shù)器存儲到存儲器
[0082]BARRIER.BOT.0CS; //結(jié)束有序的關(guān)鍵段
[0083]屏障指令還可以用來描繪不具有順序約束的關(guān)鍵代碼段,即無序的關(guān)鍵代碼部分。無序的關(guān)鍵代碼段可以由屏障調(diào)度單元430以任意順序調(diào)度,或者邏輯標識符可被用來以邏輯標識符順序調(diào)度關(guān)鍵代碼段,正如有序的關(guān)鍵代碼段被調(diào)度一樣。屏障調(diào)度單元430將僅調(diào)度(有序的和無序的)關(guān)鍵代碼段用于由參與屏障的線程執(zhí)行。在一個實施例中,屏障指令不描繪關(guān)鍵代碼段并且用作(簡單的)有條件的屏障以使在屏障指令處的參與線程的執(zhí)行同步。換言之,僅存在單個的屏障指令而非頂和底指令。
[0084]在一些情況下,可以使能急迫的屏障調(diào)度并且調(diào)度單元425配置為將屏障轉(zhuǎn)變?yōu)閯討B(tài)狀態(tài)而不一定等待參與屏障的所有線程到達屏障指令。換言之,參與線程的子集可以在至少一個其他參與線程已經(jīng)到達屏障之前開始屏障的執(zhí)行。每個屏障可以指定是否為屏障使能急迫的調(diào)度。當使能急迫的屏障調(diào)度時,可以使用附加的條件來確定成員完整。
[0085]如先前所解釋的,調(diào)度單元425配置為使用各種不同的條件來確定用于特定屏障的成員完整。第四條件是發(fā)生超時??梢砸愿鞣N不同的方式測量超時??梢詮牡谝?參與)線程到達屏障來測量超時??梢詮牡谝?參與或非參與)線程到達屏障來測量超時??梢詮淖罱?參與)線程到達屏障來測量超時??梢詮淖罱?參與或非參與)線程到達屏障來測量超時。第五條件是發(fā)生超時或最小數(shù)目的線程已經(jīng)到達屏障。
[0086]急迫的屏障起到“減速帶”的作用以激勵一些線程的分組,而不要求線程等待參與屏障的所有線程到達屏障。因此,被期望具有本地化存儲器訪問樣式的線程的至少一部分可以被分組用于改善的高速緩存訪問性能。急迫的屏障可以用來執(zhí)行無序的關(guān)鍵的代碼。急迫的屏障可以用來執(zhí)行有序的關(guān)鍵的代碼,然而,參與急迫的屏障的線程可能不一定按順序執(zhí)行,因為較早(根據(jù)順序)的線程可能在較遲(根據(jù)順序)的線程已經(jīng)被執(zhí)行之后到達屏障。
[0087]當屏障作為急迫的屏障被調(diào)度時(即僅參與線程的一部分已經(jīng)到達屏障),調(diào)度單元425可以配置為使屏障無效,以使得在屏障轉(zhuǎn)變?yōu)閯討B(tài)狀態(tài)之后抵達的任何參與線程忽略屏障并且不等待其他參與線程。一般地,當屏障用來描繪代碼的關(guān)鍵段時,屏障不應(yīng)該被無效。應(yīng)該僅對不描繪關(guān)鍵代碼段的有條件的屏障實施無效以允許遲抵達的線程繼續(xù)執(zhí)行,如本文所進一步描述的。如果線程遲于代碼的經(jīng)無效的關(guān)鍵段抵達,則不應(yīng)該允許遲抵達的線程(例如,經(jīng)由預(yù)測)執(zhí)行所描繪的代碼以防止相消干擾。
[0088]遲抵達的線程處置
[0089]當為屏障使能急迫的調(diào)度時,在屏障已經(jīng)從靜態(tài)轉(zhuǎn)變?yōu)閯討B(tài)之后抵達的線程稍后可以或可以不被允許“加入”屏障。遲抵達的線程是否可以加入急迫的屏障,可以針對每個屏障加以指定或者可以針對可作為急迫的屏障被調(diào)度的所有屏障加以使能。維護完成標志,以使得屏障調(diào)度單元430可以辨別尚未被調(diào)度的遲抵達的線程(Clone=O并且asle印=1)和已經(jīng)執(zhí)行關(guān)鍵代碼段的(無論是否遲抵達的)線程(Clone=I ),但是其按邏輯順序在遲抵達的線程之后。當每個參與線程到達屏障指令時清除完成標志并且當線程執(zhí)行描繪關(guān)鍵代碼段的底屏障指令時設(shè)置完成標志。
[0090]當遲抵達的參與線程加入急迫的屏障時,調(diào)度單元425將線程狀態(tài)設(shè)置為done=0并且aSleep=l,指示遲抵達的參與線程被停止并且沒有正在執(zhí)行指令。調(diào)度單元425還設(shè)置用于屏障的重新掃描標志。重新掃描標志指示遲抵達的參與線程已經(jīng)加入急迫的屏障。當設(shè)置重新掃描標志時,屏障調(diào)度單元430將重新掃描線程狀態(tài)510以標識并且調(diào)度任何遲抵達的參與線程,即其線程狀態(tài)不被設(shè)置為Clone=I的線程。重新掃描將最佳地在當前掃描的執(zhí)行終結(jié)時被實施,但是可以在直到當前掃描終結(jié)時的任何時間實施。如果急迫的屏障沒有正在接受遲抵達的線程,則將由屏障記分板邏輯(未示出)防止線程發(fā)出。一旦屏障轉(zhuǎn)變回空閑,就允許線程發(fā)出并且重新開始屏障。
[0091]在一個實施例中,調(diào)度單元425配置為允許任何遲抵達的參與線程在等待參與線程的到達屏障的部分執(zhí)行之后忽略屏障。調(diào)度單元425保持遲抵達的參與線程“休眠”(利用所清除的完成標志)直到參與線程到達屏障的部分的執(zhí)行完整之后為止。當參與線程的該部分完結(jié)屏障的執(zhí)行之后,調(diào)度單元425將用于遲抵達的參與線程的線程狀態(tài)510更新為“清醒(awake)”,并且為所有參與線程設(shè)置完成標志。之后遲抵達的參與線程和參與線程的該部分中的線程繼續(xù)執(zhí)行。調(diào)度單元425可以將遲抵達的線程配置為執(zhí)行由屏障所描繪的代碼或者配置為在與完結(jié)屏障的執(zhí)行的線程的相同點處恢復(fù)執(zhí)行。
[0092]屏障調(diào)度
[0093]屏障調(diào)度單元430通過喚醒第一線程來調(diào)度參與屏障的線程,其中第一線程是具有最低邏輯標識符值的參與線程(除非使用不同的排序約定)。屏障調(diào)度單元430更新線程狀態(tài)510以指示第一線程清醒。因此,因為第一線程現(xiàn)在有資格被執(zhí)行,所以調(diào)度單元425將調(diào)度第一線程用于執(zhí)行。當?shù)谝痪€程到達底屏障時,屏障調(diào)度單元430由調(diào)度單元425通知并且線程狀態(tài)510由屏障調(diào)度單元430或調(diào)度單元425更新以指示第一線程休眠。當?shù)谝痪€程到達底屏障時,線程狀態(tài)510中的完成標志也由屏障調(diào)度單元430或調(diào)度單元425更新以指示第一線程完成。
[0094]之后屏障調(diào)度單元430喚醒下一個參與線程,這使能用于下一個參與線程的關(guān)鍵代碼段的執(zhí)行。屏障調(diào)度單元430繼續(xù)按邏輯順序喚醒每個參與線程直到最后的參與線程到達底屏障為止。當最后的參與線程到達底屏障時,屏障調(diào)度單元430可以配置為檢查遲抵達的線程,并且在確認所有參與線程具有被設(shè)置的完成標志之后,屏障的執(zhí)行是完整的并且屏障調(diào)度單元430更新線程狀態(tài)510以指示所有參與線程清醒。當針對下一個參與線程的搜索失敗時,屏障調(diào)度單元430可以確定最后的參與線程已經(jīng)被調(diào)度。調(diào)度單元425更新屏障狀態(tài)以指示屏障標識符是“空閑”,例如既非“靜態(tài)”也非“動態(tài)”。
[0095]當至少一個遲抵達的參與線程已經(jīng)加入急迫的屏障時,重新掃描標志被設(shè)置在屏障狀態(tài)中。屏障調(diào)度單元430可以配置為當喚醒下一個參與線程時搜索遲抵達的線程。因為遲抵達的線程可能根據(jù)邏輯順序是“亂序的”,所以屏障調(diào)度單元430可以按并非嚴格地是邏輯順序的順序喚醒參與線程。當最后的參與線程到達底屏障并且重新掃描標志被設(shè)置時,屏障調(diào)度單元430應(yīng)該在更新屏障標識符狀態(tài)之前檢查遲抵達的參與線程以指示屏障標識符是空閑的。屏障調(diào)度單元430清除重新掃描標志,無論屏障調(diào)度單元430何時完結(jié)對搜索遲抵達的線程的重新掃描。
[0096]當屏障是急迫的有條件的屏障并且屏障標識符狀態(tài)被從靜態(tài)改變?yōu)閯討B(tài)時,調(diào)度單元425可以配置為使屏障標識符無效,以使得沒有遲抵達的參與線程可以加入急迫的屏障??梢詢H使被調(diào)度而不等待所有參與線程的急迫的有條件的屏障無效。在一個實施例中,當每個遲抵達的線程加入急迫的屏障時調(diào)度單元425對為有條件的屏障的屏障標識符所維護的計數(shù)進行更新,并且僅當計數(shù)不等于參考值和/或發(fā)生屏障超時時使屏障標識符無效,此時屏障標識符從動態(tài)轉(zhuǎn)變?yōu)榭臻e。在又一個實施例中,屏障標識符不被無效并且如果任何其他參與線程到達屏障,則更新計數(shù)并且當計數(shù)等于參考值或屏障再次作為急迫的屏障被處理以調(diào)度參與線程的另一部分時調(diào)度單元425將屏障從靜態(tài)轉(zhuǎn)變?yōu)閯討B(tài)狀態(tài)。
[0097]屏障調(diào)度單元430還可以配置為利用非阻塞式底屏障來調(diào)度排他的關(guān)鍵代碼段和有序的關(guān)鍵代碼段。屏障調(diào)度單元430通過首先等待任何其他關(guān)鍵代碼段或排他的關(guān)鍵代碼段的執(zhí)行完結(jié)來調(diào)度參與排他的關(guān)鍵代碼段的第一線程。調(diào)度用于排他的關(guān)鍵代碼段的屏障用于排他的執(zhí)行。排他的關(guān)鍵代碼段可以是排他的有序的關(guān)鍵代碼段或排他的無序的關(guān)鍵代碼段。注意未參與屏障的線程可以與執(zhí)行排他的關(guān)鍵代碼段的線程同時執(zhí)行。排他的關(guān)鍵代碼段可以當在參與不同屏障的線程之間可能發(fā)生資源訪問沖突時使用。
[0098]屏障調(diào)度單元430通過允許線程繼續(xù)執(zhí)行緊跟在底屏障之后的隨后的指令而不等待所有參與線程執(zhí)行關(guān)鍵代碼段來利用非阻塞式底屏障來調(diào)度參與關(guān)鍵代碼段的線程。一旦由屏障調(diào)度單元430更新用于參與線程的線程狀態(tài)510以指示線程清醒,線程就在到達底屏障之后保持清醒。之后調(diào)度單元425能夠調(diào)度已經(jīng)完結(jié)關(guān)鍵代碼段的執(zhí)行的參與線程用于與當前正在執(zhí)行關(guān)鍵代碼段的一個其他參與線程同時執(zhí)行。當所有參與線程已經(jīng)到達底屏障時,屏障的執(zhí)行是完整的并且屏障調(diào)度單元430更新屏障狀態(tài)以指示屏障標識符既非“靜態(tài)”也非“動態(tài)”。
[0099]在一個實施例中,調(diào)度單元425實施動態(tài)屏障記分板檢查以確定是否可以在將第一指令輸出到解碼單元450之前發(fā)出第一指示。當?shù)谝恢噶钆c屏障標識符相關(guān)聯(lián)時,調(diào)度單元425等待在以下情況下發(fā)出第一指令:當(靜態(tài)或動態(tài)狀態(tài)中的)屏障與第一指令相比具有相同的屏障標識符和不同的標簽時或當(動態(tài)狀態(tài)中的)屏障具有相同的標識符和相同的標簽并且遲抵達的線程不被屏障標識符所接受時。
[0100]解碼單元450從指令調(diào)度單元420接收要被分派的下一個指令。解碼單元450實施指令的全解碼并且將經(jīng)解碼的指令傳送到分派單元470。另外,在一些實施例中,指令可以被雙倍或四倍地發(fā)出并且解碼單元450可以實現(xiàn)分開的解碼邏輯用于每個所發(fā)出的指令。分派單元470實現(xiàn)FIFO并且將經(jīng)解碼的值寫到本地寄存器堆304用于由執(zhí)行單元302或加載/存儲單元303執(zhí)行。在同時發(fā)出多個指令的實施例中,分派單元470可以將每個指令發(fā)出到SM310的功能單元的不同部分。記分板單元480管理并且追蹤每線程組已經(jīng)被解碼并且被分派的指令的數(shù)目。
[0101]圖5B是根據(jù)本公開的一個示范性實施例的、圖5A的調(diào)度單元425和屏障調(diào)度單元430的一部分的框圖。線程屏障抵達追蹤單元500更新用于被分配到CTA的每個屏障的屏障狀態(tài)信息。如先前所解釋的,屏障狀態(tài)信息指示哪些屏障標識符是“靜態(tài)”、“動態(tài)”或空閑(既非“靜態(tài)”也非“動態(tài)”)并且包括用于每個屏障標識符的重新掃描標志,該重新掃描標志當至少一個遲抵達的參與線程已經(jīng)加入急迫的屏障時被設(shè)置。當屏障標識符從“靜態(tài)”轉(zhuǎn)變?yōu)椤皠討B(tài)”時,將屏障標識符和CTA標識符輸出到FIF0505。隨著參與屏障的CTA的每個線程到達屏障指令,調(diào)度單元425更新存儲在線程狀態(tài)510中的參與線程的狀態(tài)以指示參與線程“休眠”。
[0102]當在屏障執(zhí)行槽515中執(zhí)行槽不可用時,F(xiàn)IF0505緩存動態(tài)屏障。在一個實施例中,屏障執(zhí)行槽515包括16個槽,每個槽可以由一個動態(tài)屏障占用。當在屏障執(zhí)行槽515中槽可用時,從FIF0505取出動態(tài)屏障并且將其插入到槽中。屏障仲裁單元520在占用屏障執(zhí)行槽515的槽的不同動態(tài)屏障之間進行仲裁??梢杂善琳现俨脝卧?20采用各種優(yōu)先級方案以在不同動態(tài)屏障之間進行仲裁。屏障仲裁單元520為線程選擇單元530提供動態(tài)屏障,可以由線程選擇單元530從該動態(tài)屏障選擇線程用于調(diào)度。
[0103]線程選擇單元530按由與線程陣列(即分配到CTA的)中的每個線程相關(guān)聯(lián)的邏輯標識符所指定的順序選擇線程。線程選擇單元530訪問屏障參與追蹤信息532以確定哪些線程參與動態(tài)屏障。線程選擇單元530訪問線程狀態(tài)510和屏障狀態(tài)信息(未示出)以標識任何遲抵達的參與線程。
[0104]并非被分配到CTA的一個或多個線程塊中的所有線程都一定參與由CTA所使用的每個屏障。如先前所解釋的,屏障由屏障標識符指定并且每個線程指示它是否參與屏障之一。線程選擇單元530在屏障的處理期間標識參與線程一次并且之后繼續(xù)選擇每個參與線程用于串行執(zhí)行。線程選擇單元530在選擇過程期間跳過非參與線程。當屏障是急迫的時,在選擇過程期間線程選擇單元530跳過非參與線程和尚未抵達屏障處的線程(或如果遲抵達的線程不能加入屏障則當屏障變成動態(tài)時未抵達的線程)。
[0105]在為特定屏障選擇第一線程用于執(zhí)行之前,線程選擇單元530確定屏障是否是描繪排他的關(guān)鍵代碼段的排他屏障。如果屏障是排他的,那么線程選擇單元530確定是否任何其他的線程陣列正在執(zhí)行關(guān)鍵代碼段或排他的關(guān)鍵代碼段,并且如果是,則線程選擇單元530在為排他屏障選擇第一線程用于執(zhí)行之前等待直到那些線程陣列中的線程完結(jié)執(zhí)行為止。在一個實施例中,在動態(tài)屏障占用屏障執(zhí)行槽515中的槽時FIF0505不取出排他屏障,并且在排他屏障占用屏障執(zhí)行槽515中的槽時FIF0505不取出屏障。
[0106]線程選擇單元530可以基于參與線程生成執(zhí)行掩碼。參與線程指定與隨屏障指令所提供的屏障標識符匹配的屏障標識符。當允許遲抵達的線程加入屏障時,線程選擇單元530可以重新生成執(zhí)行掩碼,設(shè)置掩碼中的位用于具有取非的“完成”標志的參與線程。線程選擇單元530按邏輯標識符順序搜索執(zhí)行掩碼以找出第一線程,以選擇用于執(zhí)行直到所有線程已經(jīng)被選擇。隨著每個參與線程被選擇,清除與參與線程相對應(yīng)的執(zhí)行掩碼的位并且將線程標記為完成。在一個實施例中,當多個線程塊被分配到CTA時,線程選擇單元530一次生成用于一個線程塊的執(zhí)行掩碼,由此將執(zhí)行掩碼中的位的數(shù)目限制于線程塊中的線程的數(shù)目。
[0107]當線程選擇單元530選擇參與線程用于執(zhí)行時,線程選擇單元530更新存儲在線程狀態(tài)510中的線程的狀態(tài)以指示線程“清醒”。之后調(diào)度單元425將發(fā)出線程用于執(zhí)行并且繼續(xù)發(fā)出線程用于關(guān)鍵代碼段中的每個指令直到到達屏障底。當?shù)竭_底屏障時,調(diào)度單元425通知線程選擇單元530并且線程選擇單元530確定屏障是否要求線程在繼續(xù)執(zhí)行按程序順序在關(guān)鍵代碼段之后的指令之前等待參與屏障的所有其他線程來執(zhí)行關(guān)鍵代碼段,即線程選擇單元530確定底屏障是否是非阻塞式底屏障。當屏障是非阻塞式屏障時,線程選擇單元530可以選擇下一個參與線程用于執(zhí)行而不將當前所選擇的參與線程置于“睡眠”。相反,存儲在線程狀態(tài)510中的下一個參與線程的狀態(tài)被更新為“清醒”并且已經(jīng)完結(jié)關(guān)鍵代碼段的執(zhí)行的任何參與線程按程序順序繼續(xù)執(zhí)行程序的隨后的指令。隨著每個參與線程到達底屏障,線程選擇單元530還設(shè)置各自的完成標志。
[0108]在一個實施例中,屏障用來確保用于使用紋理單元315處理數(shù)據(jù)的特定CTA的線程被實施而不允許來自不同CTA的線程干預(yù)。確保用于一個CTA的線程由紋理單元315 —起處理增加高速緩存命中的可能性,因為紋理訪問在CTA內(nèi)被局部化。紋理單元315是共享資源的示例并且屏障可以用來控制哪些線程訪問共享資源或可從局部性受益的資源。雖然線程可能不需要按特定順序執(zhí)行,但是描繪作為排他的關(guān)鍵代碼段從存儲器讀取紋理數(shù)據(jù)的紋理加載指令提供用于增加紋理讀將在L1.5高速緩存335中命中的可能性的機制??刂铺囟ㄙY源的(例如紋理單元315)的排他的關(guān)鍵代碼段中的指令能夠在與不使用相同資源的關(guān)鍵代碼段和/或排他的關(guān)鍵代碼段相同的時間執(zhí)行。屏障執(zhí)行槽515可以包括專用于描繪由紋理單元315執(zhí)行的指令的屏障的槽,或用于優(yōu)選局部化的受控制的訪問的任何資源的槽。由紋理單元315執(zhí)行的線程可以與由執(zhí)行單元302執(zhí)行的線程同時被調(diào)度用于執(zhí)行??梢詾椴煌钠琳蠘俗R符指定調(diào)度優(yōu)先級并且使用屏障指令所描繪的紋理加載指令可以或可以不利用高于其他屏障的優(yōu)先級被調(diào)度。
[0109]圖6A示出了根據(jù)本公開的一個實施例的、用于基于邏輯標識符調(diào)度指令用于執(zhí)行的方法的流程圖600。盡管結(jié)合圖1、2、3A-3C、5A和5B的系統(tǒng)描述了該方法步驟,但是本領(lǐng)域普通技術(shù)人員將理解配置為以任何順序?qū)嵤┰摲椒ú襟E的任何系統(tǒng)均在本公開的范圍內(nèi)。
[0110]方法600始于步驟605,其中分配到CTA的線程與邏輯標識符相關(guān)聯(lián)。邏輯標識符在線程的執(zhí)行期間被映射到由SM310引用的物理標識符。在步驟610,發(fā)起程序執(zhí)行并且調(diào)度單元425接收指令。在步驟615,調(diào)度單元425確定指令是否是屏障指令,并且如果指令不是屏障指令,則在步驟658,調(diào)度單元425通過將指令輸出到解碼單元450來繼續(xù)程序的執(zhí)行。
[0111]如果在步驟615,調(diào)度單元425確定指令是屏障指令,并且如果是,那么在步驟616,調(diào)度單元425根據(jù)用于屏障的成員條件來更新屏障成員。當對于CTA的第一線程來說到達屏障指令時,調(diào)度單元425還更新屏障的狀態(tài)以指示屏障是“靜態(tài)”(假設(shè)線程造成與參考計數(shù)相比的屏障成員計數(shù)器的增量)。那么在步驟617,調(diào)度單元425確定線程是否參與屏障指令。如果線程不參與屏障指令,那么調(diào)度單元425前進至步驟658,并且線程繼續(xù)程序的執(zhí)行。否則,線程參與屏障指令,并且在步驟620,調(diào)度單元425將線程的狀態(tài)更新為“休眠”。當屏障指令描繪非急迫的(有序的或無序的)關(guān)鍵代碼段的開始時,調(diào)度單元425成員條件應(yīng)該要求CTA中的所有參與線程在允許任何參與線程執(zhí)行關(guān)鍵代碼段之前到達屏障指令。
[0112]當屏障是急迫的屏障時,調(diào)度單元425不需要在允許參與線程的一部分被調(diào)度用于執(zhí)行之前等待所有參與線程到達屏障指令。因此,在步驟621,調(diào)度單元425確定線程是否參與其狀態(tài)已經(jīng)從靜態(tài)轉(zhuǎn)變?yōu)閯討B(tài)的急迫的屏障,以及是否允許遲抵達的線程加入屏障。換言之,調(diào)度單元425確定線程是否是可以加入急迫的屏障的遲抵達的線程,并且如果線程是可以加入急迫的屏障的遲抵達的線程,則在步驟625,調(diào)度單元425為急迫的屏障設(shè)置重新掃描標志。將已經(jīng)為遲抵達的線程清除完成標志。之后屏障調(diào)度單元430將檢測并且能夠選擇遲抵達的線程用于調(diào)度。如果在步驟621,調(diào)度單元425確定線程是可以不加入急迫的屏障的遲抵達的線程,那么調(diào)度單元425前進至步驟622。當屏障不是急迫的屏障時,調(diào)度單元425還將前進至步驟622。在一個實施例中,屏障的記分板可以用來指示急迫的屏障是否正在接受遲抵達的線程。
[0113]在步驟622,調(diào)度單元425根據(jù)可以用來確定成員完整的各種不同條件來確定成員是否完整,并且如果并非完整,則在步驟658,已經(jīng)到達屏障的參與線程保持休眠,而調(diào)度單元425繼續(xù)程序的執(zhí)行。否則,在前進至步驟655之前,調(diào)度單元425將屏障的狀態(tài)從“靜態(tài)”更新為“動態(tài)”并且將線程的屏障標識符和CTA標識符輸出到屏障調(diào)度單元430。
[0114]在步驟655,屏障調(diào)度單元430選擇參與線程用于執(zhí)行。當所有參與線程已經(jīng)完結(jié)關(guān)鍵代碼段的執(zhí)行時,程序執(zhí)行在步驟658繼續(xù)。結(jié)合圖6B描述步驟655的附加細節(jié)。在一個實施例中,如果屏障變成“懸掛”使得線程不能被執(zhí)行,則屏障可以用與被無效的屏障可被重置的相同方式即經(jīng)由特殊的指令被重置。
[0115]在一個實施例中,有條件的屏障用來使在屏障指令處的參與線程的執(zhí)行同步,并且在步驟620,用于每個參與線程的線程狀態(tài)被設(shè)置為休眠并且當在步驟622成員完整時,調(diào)度單元425將屏障的狀態(tài)從“靜態(tài)”更新為“動態(tài)”并且將存儲在線程狀態(tài)510中的所有參與線程的狀態(tài)更新為“清醒”。在步驟655,之后參與線程(或當有條件的屏障被急迫地調(diào)度時參與線程的一部分)繼續(xù)程序的執(zhí)行并且屏障調(diào)度單元430將屏障的狀態(tài)更新為既非“靜態(tài)”也非“動態(tài)”,即指示對于線程的至少一部分來說該屏障的執(zhí)行是完整的。
[0116]圖6B示出了根據(jù)本公開的一個實施例的、用于實施圖6A所示的步驟655的方法。盡管結(jié)合圖1、2、3A-3C、5A和5B的系統(tǒng)描述了該方法步驟,但是本領(lǐng)域普通技術(shù)人員將理解配置為以任何順序?qū)嵤┰摲椒ú襟E的任何系統(tǒng)均在本公開的范圍內(nèi)。
[0117]在步驟630,屏障調(diào)度單元430基于與參與屏障的線程相關(guān)聯(lián)的邏輯標識符選擇線程用于執(zhí)行。將所選擇的線程的狀態(tài)從“休眠”更新為“清醒”,以使得線程有資格執(zhí)行。結(jié)合圖6C描述步驟630的附加細節(jié)。當重新掃描標志被設(shè)置時,屏障調(diào)度單元430檢測任何遲抵達的線程并且可以選擇線程用于與邏輯標識符相比失序地執(zhí)行。更具體地,當屏障調(diào)度單元430調(diào)度“最后的”線程并且重新掃描標志被設(shè)置時,屏障調(diào)度單元430重新掃描執(zhí)行掩碼,其忽略具有被設(shè)置的“完成”標志的線程,并且調(diào)度任何遲抵達的線程。
[0118]在步驟635,關(guān)鍵代碼段內(nèi)的指令由分派單元470分派并且被執(zhí)行用于所選擇的線程。在步驟636,調(diào)度單元312接收與屏障標識符相關(guān)聯(lián)的底屏障指令并且更新線程的狀態(tài)以設(shè)置完成標志。在步驟638,調(diào)度單元312確定底屏障指令是否是阻塞式底屏障指令。當在步驟638調(diào)度單元312確定底屏障指令是阻塞式時,那么在步驟640,屏障調(diào)度單元430確定參與屏障的另一個線程是否需要執(zhí)行關(guān)鍵代碼段。如果另一個線程需要執(zhí)行關(guān)鍵代碼段,那么在步驟643,屏障調(diào)度單元430更新已經(jīng)到達底屏障指令的線程的狀態(tài),將其從“清醒”更新為“休眠”,以使得線程沒有資格執(zhí)行。否則,在步驟650,屏障調(diào)度單元430在前進至步驟652之前更新線程狀態(tài)510以指示參與屏障的所有線程是“清醒”的。
[0119]如果在步驟638底屏障指令不是阻塞式底屏障指令,那么在步驟642,屏障調(diào)度單元430確定參與屏障的另一個線程是否需要執(zhí)行關(guān)鍵代碼段。如果另一個線程需要執(zhí)行關(guān)鍵代碼段,則屏障調(diào)度單元430返回步驟630。否則,在步驟652,屏障調(diào)度單元430從屏障執(zhí)行槽515中的執(zhí)行槽移除屏障和CTA標識符并且更新屏障的狀態(tài)以指示屏障既非“靜態(tài)”也非“動態(tài)”。在該點處,當屏障是急迫的屏障時,如果屏障不描繪關(guān)鍵代碼段(即屏障是有條件的屏障時),調(diào)度單元425可以使屏障標識符無效,以使得遲抵達的線程可不再加入屏障。
[0120]之后調(diào)度單元425前進以繼續(xù)程序的執(zhí)行。在用于一個CTA屏障的關(guān)鍵代碼段的執(zhí)行期間,同一 CTA的其他屏障的其他線程以及其他CTA的線程屏障還可以繼續(xù)其他代碼的執(zhí)行。然而,如果屏障是排他的,則僅不包括在關(guān)鍵代碼內(nèi)的程序指令可以被執(zhí)行用于其他屏障。
[0121]圖6C示出了根據(jù)本公開的一個實施例的、用于實施圖6A所示的步驟630的方法。盡管結(jié)合圖1、2、3A-3C、5A和5B的系統(tǒng)描述了該方法步驟,但是本領(lǐng)域普通技術(shù)人員將理解配置為以任何順序?qū)嵤┰摲椒ú襟E的任何系統(tǒng)均在本公開的范圍內(nèi)。
[0122]對于每個調(diào)度循環(huán),步驟630由屏障調(diào)度單元430實施。在步驟660,屏障調(diào)度單元430標識屏障執(zhí)行槽515中的任何掛起屏障,該屏障執(zhí)行槽515存儲動態(tài)屏障并且具有可被調(diào)度的下一個線程。如果排他屏障正在被執(zhí)行,那么屏障調(diào)度單元430在標識任何掛起屏障之前等待直到排他屏障的執(zhí)行是完整的。在步驟622,屏障調(diào)度單元430選擇最高優(yōu)先級的動態(tài)屏障。在步驟665,屏障調(diào)度單元430確定所選擇的動態(tài)屏障是否是排他屏障,并且如果是排他屏障,則在步驟668,屏障調(diào)度單元430在前進至步驟670之前等待直到線程沒有正在執(zhí)行描繪(有序的或無序的)關(guān)鍵代碼段的任何其他屏障為止。注意屏障調(diào)度單元430可以在(串行地)執(zhí)行參與排他屏障的線程之前等待所有參與線程完結(jié)其他關(guān)鍵代碼段的執(zhí)行或僅等待當前正在執(zhí)行的線程完結(jié)關(guān)鍵代碼段的執(zhí)行。注意可以針對多個CTA并行地執(zhí)行多個非排他屏障,但是一次僅可以執(zhí)行一個排他屏障。
[0123]在步驟670,屏障調(diào)度單元430通過確定每個線程是否按名稱指定屏障來標識參與所選擇的屏障的線程。在步驟675,屏障調(diào)度單元430通過檢查與尚未執(zhí)行關(guān)鍵代碼段的每個參與線程相關(guān)聯(lián)的邏輯標識符來搜索下一個參與線程。在步驟680,屏障調(diào)度單元430在前進至步驟635之前更新存儲在線程狀態(tài)510中的、用于所選擇的參與線程的線程狀態(tài)以指示線程是“清醒”的。注意當重新掃描標志未被設(shè)置時,步驟670可以實施一次、每線程塊實施一次或每循環(huán)實施一次,以標識參與線程,因為屏障調(diào)度單元430可以配置為維護執(zhí)行掩碼。屏障調(diào)度單元430隨著每個先前的參與線程完結(jié)關(guān)鍵代碼段的執(zhí)行而高效地按邏輯順序喚醒參與線程,并且更新執(zhí)行掩碼。在一個實施例中,為每個線程塊計算執(zhí)行掩碼。當重新掃描標志被設(shè)置時,步驟670可以每循環(huán)實施一次以標識已經(jīng)到達屏障的參與線程。
[0124]雖然以上已經(jīng)描述了各種實施例,但是應(yīng)該理解它們僅通過示例而非限制的方式進行了呈現(xiàn)。因此,優(yōu)選實施例的寬度和范圍不應(yīng)該由以上所描述的示例性實施例所限制,而應(yīng)該僅根據(jù)跟隨的權(quán)利要求及其等同物被定義。
【權(quán)利要求】
1.一種方法,包括: 發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令; 對于所述多個線程中的每個線程,當在所述線程的執(zhí)行期間所述線程到達所述屏障指令時確定所述線程是否參與所述屏障指令;以及 串行地執(zhí)行參與所述屏障指令的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
2.如權(quán)利要求1所述的方法,進一步包括,在執(zhí)行參與所述屏障指令的所述線程中的每一個之前,等待參與所述屏障指令的最后抵達線程,其中所述最后抵達線程相對于參與所述屏障指令的所述多個線程中的其他線程最后到達所述屏障指令。
3.如權(quán)利要求1所述的方法,進一步包括,在執(zhí)行參與所述屏障指令的所述線程中的每一個之前,等待參與所述屏障指令的所述線程的一部分到達所述屏障指令并且等待允許作為急迫的屏障來調(diào)度所述屏障指令的條件被滿足。
4.如權(quán)利要求3所述的方法,進一步包括,在參與所述屏障指令的所述線程中的每一個的執(zhí)行期間: 將附加線程標識為參與所述屏障指令并且不包括在所述線程的所述部分中的遲抵達線程;以及 執(zhí)行所述附加線程以處理跟隨在所述屏障指令之后的所述程序的所述一個或多個指令。
5.如權(quán)利要求3所述的方法,進一步包括,在執(zhí)行參與所述屏障指令的所述線程的所述部分中的所述線程中的每一個之后,使與所述屏障指令相對應(yīng)的屏障標識符無效。
6.如權(quán)利要求3所述的方法,其中允許作為急迫的屏障來調(diào)度所述屏障指令的所述條件包括參與所述屏障指令的所述線程的所述部分包括大于最小數(shù)目的線程的若干線程。
7.如權(quán)利要求3所述的方法,其中允許作為急迫的屏障來調(diào)度所述屏障指令的所述條件包括超時到期。
8.如權(quán)利要求1所述的方法,其中所述屏障指令描繪關(guān)鍵代碼段。
9.如權(quán)利要求8所述的方法,進一步包括,在選擇另一個線程執(zhí)行所述關(guān)鍵代碼段之前等待第一線程執(zhí)行所述關(guān)鍵代碼段內(nèi)的全部指令。
10.如權(quán)利要求1所述的方法,進一步包括將所述線程與被映射到物理標識符的邏輯標識符相關(guān)聯(lián),其中所述物理標識符在所述線程的執(zhí)行期間由多線程處理核心引用。
11.如權(quán)利要求10所述的方法,其中執(zhí)行參與所述屏障指令的所述線程中的每一個包括基于所述邏輯標識符選擇所述線程用于串行執(zhí)行。
12.如權(quán)利要求1所述的方法,進一步包括將標簽附加到與所述屏障指令相對應(yīng)的屏障標識符以當所述屏障標識符用在所述程序中的多個地方時唯一地標識所述屏障指令的每次出現(xiàn)。
13.—種處理子系統(tǒng),包括: 指令調(diào)度單元,其配置為: 接收程序的指令用于由多個線程執(zhí)行,其中所述程序包括屏障指令; 當在每個線程的執(zhí)行期間所述線程到達所述屏障指令時,確定所述線程是否參與所述屏障指令;以及使能參與所述屏障指令的所述線程被選擇用于執(zhí)行;以及 多線程處理核心,其配置為串行地執(zhí)行參與所述屏障指令的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
14.如權(quán)利要求13所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在使能參與所述屏障指令的所述線程中的每一個之前,等待參與所述屏障指令的最后抵達線程,其中所述最后抵達線程相對于參與所述屏障指令的所述多個線程中的其他線程最后到達所述屏障指令。
15.如權(quán)利要求13所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在使能參與所述屏障指令的所述線程中的每一個之前,等待參與所述屏障指令的所述線程的一部分到達所述屏障指令,其中所述部分包括大于或等于最小數(shù)目的線程的若干線程。
16.如權(quán)利要求15所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在參與所述屏障指令的所使能線程的所述執(zhí)行期間: 將附加線程標識為參與所述屏障指令的遲抵達線程;以及 使能所述附加線程被選擇用于執(zhí)行。
17.如權(quán)利要求15所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在執(zhí)行參與所述屏障指令的所述線程的所述部分中的每個線程之后,使與所述屏障指令相對應(yīng)的屏障標識符無效。
18.如權(quán)利要求13所述的處理子系統(tǒng),其中所述屏障指令描繪關(guān)鍵代碼段。
19.如權(quán)利要求18所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在選擇另一個線程執(zhí)行所述關(guān)鍵代碼段之前等待第一線程執(zhí)行所述關(guān)鍵代碼段內(nèi)的全部指令。
20.如權(quán)利要求13所述的處理子系統(tǒng),其中所述線程與被映射到物理標識符的邏輯標識符相關(guān)聯(lián),并且其中所述物理標識符在參與所述屏障指令的所述線程的執(zhí)行期間由所述多線程處理核心引用。
21.如權(quán)利要求20所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為基于所述邏輯標識符選擇參與所述屏障指令的所述線程用于串行執(zhí)行。
22.—種方法,包括: 發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令; 等待所述多個線程中的所述線程的一部分到達所述屏障指令,其中所述部分包括大于最小數(shù)目的線程并且小于所述多個線程中的所述線程的全部的若干線程;以及 串行地執(zhí)行所述部分中的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
23.如權(quán)利要求22所述的方法,進一步包括,在所述部分中的所述線程中的每一個的執(zhí)行期間: 將到達所述屏障指令的附加線程標識為遲抵達線程;以及 執(zhí)行所述附加線程以處理跟隨在所述屏障指令之后的所述程序的所述一個或多個指令。
24.如權(quán)利要求22所述的方法,進一步包括,在執(zhí)行所述部分中的所述線程中的每一個之后,使與所述屏障指令相對應(yīng)的屏障標識符無效。
25.如權(quán)利要求22所述的方法,進一步包括,在執(zhí)行所述部分中的所述線程中的每一個之后,串行地執(zhí)行至少一個附加線程以處理跟隨在所述屏障指令之后的所述程序的所述一個或多個指令。
26.—種處理子系統(tǒng),包括: 指令調(diào)度單元,其配置為: 接收程序的指令用于由多個線程執(zhí)行,其中所述程序包括屏障指令; 等待所述多個線程中的所述線程的一部分到達所述屏障指令,其中所述部分包括大于最小數(shù)目的線程并且小于所述多個線程中的所述線程的全部的若干線程;以及使能所述部分中的所述線程被選擇用于執(zhí)行;以及 多線程處理核心,其配置為串行地執(zhí)行參與所述屏障指令的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
27.如權(quán)利要求26所述的處理子系統(tǒng),其中所述指令調(diào)度單元進一步配置為,在所述部分中的所使能的線程的所述執(zhí)行期間: 將到達所述屏障指令的附加線程標識為遲抵達線程;以及 使能所述附加線程被選擇用于執(zhí)行。
28.—種方法,包括: 發(fā)起多個線程的執(zhí)行以處理包括屏障指令的程序的指令; 對于所述多個線程中的每個線程,當在所述線程的執(zhí)行期間所述線程到達所述屏障指令時確定所述線程是否參與所述屏障指令;以及 在參與所述屏障指令的所述線程的全部已經(jīng)到達所述屏障指令之后,執(zhí)行參與所述屏障指令的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
29.如權(quán)利要求28所述的方法,其中當每個線程到達所述屏障指令時,參與所述屏障指令的所述線程更新為休眠狀態(tài)。
30.如權(quán)利要求28所述的方法,其中當參與所述屏障指令的所述線程的全部已經(jīng)到達所述屏障指令時,參與所述屏障指令的每個線程更新為清醒狀態(tài)。
31.如權(quán)利要求28所述的方法,進一步包括將標簽附加到與所述屏障指令相對應(yīng)的屏障標識符以當所述屏障標識符用在所述程序中的多個地方時唯一地標識所述屏障指令的每次出現(xiàn)。
32.如權(quán)利要求28所述的方法,進一步包括當不參與所述屏障指令的至少一個線程到達所述屏障指令時,繼續(xù)所述至少一個線程的執(zhí)行。
33.一種處理子系統(tǒng),包括: 指令調(diào)度單元,其配置為: 接收程序的指令用于由多個線程執(zhí)行,其中所述程序包括屏障指令; 當在所述線程的執(zhí)行期間每個線程到達所述屏障指令時,確定所述線程是否參與所述屏障指令;以及 使能參與所述屏障指令的所述線程被選擇用于執(zhí)行;以及 多線程處理核心,其配置為在參與所述屏障指令的所述線程的全部到達所述屏障指令之后,執(zhí)行參與所述屏障指令的所述線程中的每一個以處理跟隨在所述屏障指令之后的所述程序的一個或多個指令。
【文檔編號】G06F9/48GK104050032SQ201310745800
【公開日】2014年9月17日 申請日期:2013年12月30日 優(yōu)先權(quán)日:2013年3月11日
【發(fā)明者】約翰·埃里克·林霍爾姆, 泰羅·塔帕尼·卡拉斯, 蒂莫·奧斯卡伊·艾拉, 薩穆利·馬蒂亞斯·萊內(nèi) 申請人:輝達公司