本發(fā)明涉及數(shù)據(jù)處理系統(tǒng),并且具體地,涉及包括一個或更多個可編程處理級(“著色器(shader)”)的圖形處理系統(tǒng)的操作。
背景技術(shù):
圖形處理通常按流水線方式來執(zhí)行,并且一個或更多個流水線級(stage)針對數(shù)據(jù)進(jìn)行操作以生成最終渲染(render)輸出,例如,被顯示的幀。許多圖形處理流水線現(xiàn)在包括一個或更多個可編程處理級,通稱為“著色器”。例如,圖形處理流水線可以包括以下中的一個或更多個,并且典型地包括全部:幾何著色器、頂點(diǎn)著色器以及片段(像素)著色器。這些著色器是可編程處理級,它們針對輸入的數(shù)據(jù)值執(zhí)行著色器程序以生成需要的輸出數(shù)據(jù)集(例如,在頂點(diǎn)著色器的情況下,恰當(dāng)?shù)刈儞Q并照亮頂點(diǎn)數(shù)據(jù)),以供圖形流水線的其余部分處理和/或輸出。圖形處理流水線的著色器可以共用可編程處理電路,或者它們都可以是獨(dú)特的可編程處理單元。
技術(shù)實(shí)現(xiàn)要素:
圖形處理單元(GPU)著色器核心是這樣的處理單元,即,其通過針對諸如渲染目標(biāo)的要生成的圖形輸出(例如,幀)中的每一個圖形項運(yùn)行小程序來執(zhí)行圖形處理(在這點(diǎn)上,“項”通常是頂點(diǎn)或片段(像素))。這通常使能實(shí)現(xiàn)高度并行性,因為典型的渲染輸出(例如,幀)展現(xiàn)了相當(dāng)大量的頂點(diǎn)和片段,每一個頂點(diǎn)和片段都可獨(dú)立處理。
要由圖形處理流水線的指定“著色器”執(zhí)行的著色器程序?qū)⒂尚枰酶呒壷骶幊陶Z言(如GLSL、HLSL、OpenCL C等)的圖形處理的應(yīng)用來提供。著色器程序?qū)⒂杀硎景聪嚓P(guān)語言標(biāo)準(zhǔn)(規(guī)范)定義的希望編程步驟的“表達(dá)式”構(gòu)成。接著,高級著色器程序被著色器語言編譯器翻譯成用于目標(biāo)圖形處理流水線的二進(jìn)制代碼。該二進(jìn)制代碼將由“指令”構(gòu)成,所述指令在用于所指定的目標(biāo)圖形處理流水線的指令集規(guī)范中指定。用于將著色器語言表達(dá)式轉(zhuǎn)換成二進(jìn)制代碼指令的編譯處理可以經(jīng)由編譯器內(nèi)的程序的許多中間表述來進(jìn)行。因此,用高級著色器語言編寫的程序可以被翻譯成編譯器專用中間表示(并且在該編譯器內(nèi)可以有幾個連續(xù)中間表示),并且最終中間表示被翻譯成用于目標(biāo)圖形處理流水線的二進(jìn)制代碼指令。
改進(jìn)著色器執(zhí)行效率的一種已知方式是將執(zhí)行線程(其中,每一個線程例如對應(yīng)于一個頂點(diǎn)或一個片段(像素))分組成線程“組”或“束”,其中,一組中的線程一次一個指令地鎖步運(yùn)行,即,該組中的每一個線程在移動到下一指令之前執(zhí)行相同的單一指令。這樣,可以在該組中的所有線程之間共享指令裝入(fetch)和調(diào)度資源。(用于這些線程組的其它術(shù)語包括:“子組”、“warp”以及“波前(wavefront)”)。為方便起見,在此將使用術(shù)語線程組,但這旨在涵蓋所有等同術(shù)語和排布結(jié)構(gòu),除非另外加以表明)。
在這種線程組中,針對每一個線程執(zhí)行共享指令,并且在特定線程需要存儲器存取(例如,針對加載、存儲以及原子(atomics))時,通過該線程獲取“鎖定(lock)”,以確保獨(dú)占地存取該線程訪問的存儲器中的數(shù)據(jù),即,排除其它線程訪問該存儲器位置,每一個線程都獲取獨(dú)立的鎖定。然而,因為該線程不能保證所有情況下的獨(dú)立前向進(jìn)展(因為由一個線程執(zhí)行的一些步驟可能取決于其它線程執(zhí)行的其它步驟),所以一個線程獲取的鎖定可能造成整個線程組的死鎖。這接著造成這些線程中的一個或更多個無限期地拖延,等待該鎖定變得可用。
例如,簡單的代碼序列
可以非直觀地死鎖。
這是因為該序列需要代碼流分支(divergence),并且來自分支路徑(即,具有不同程序計數(shù)器)的線程必須從執(zhí)行中掩蔽掉。在具有“最低程序計數(shù)器優(yōu)先(lowest program counter first”)”安排策略的系統(tǒng)中,未獲得鎖定的線程因此有利,但這些線程接著無限期地空轉(zhuǎn),等待所述鎖定。
該問題的一種解決方案是將代碼重新排序,以適應(yīng)所用特定系統(tǒng)的調(diào)度行為,例如,利用下列代碼序列:
然而,這要求編譯器不優(yōu)化指令序列,或者支持針對指令的語義排序。
因此,申請人認(rèn)為,存在改進(jìn)線程組的處理的余地,例如,在包括一個或更多個著色器級的圖形處理流水線中。
根據(jù)本發(fā)明的第一方面,提供了一種操作數(shù)據(jù)處理系統(tǒng)的方法,所述數(shù)據(jù)處理系統(tǒng)包括執(zhí)行流水線,所述執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程被一起組合成線程組,其中,所述線程組中的線程一次一個指令地鎖步執(zhí)行,該方法包括以下步驟:
針對要由所述數(shù)據(jù)處理系統(tǒng)的所述執(zhí)行流水線的執(zhí)行級針對線程組執(zhí)行的、包括存儲器事務(wù)的操作來說:
向所述執(zhí)行級發(fā)出指令或指令集,以使所述執(zhí)行級:
針對作為整體的線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果,并且
響應(yīng)于所述指令或指令集,所述執(zhí)行流水線的所述執(zhí)行級:
針對作為整體的線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
根據(jù)本發(fā)明的第二方面,提供了一種數(shù)據(jù)處理系統(tǒng),該數(shù)據(jù)處理系統(tǒng)包括:
執(zhí)行流水線,該執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程被一起組合成線程組,其中,所述線程組中的線程被一次一個指令地鎖步執(zhí)行;以及
編譯器,該編譯器編譯針對所述執(zhí)行流水線的程序,以生成用于所述執(zhí)行流水線的所述執(zhí)行級的指令,
其中,所述編譯器被配置成,針對所述執(zhí)行流水線的執(zhí)行級要針對線程組執(zhí)行的、包括存儲器事務(wù)的操作:
向所述執(zhí)行級發(fā)出指令或指令集,以使所述執(zhí)行級:
針對作為整體的線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果,并且
其中,所述執(zhí)行流水線的至少一個執(zhí)行級被配置成響應(yīng)于所述指令或指令集:
針對作為整體的線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
本發(fā)明涉及執(zhí)行數(shù)據(jù)處理流水線中的操作,其中,執(zhí)行線程被一起組合成線程組(“warp”),并且線程組中的線程被一次一個指令地鎖步執(zhí)行,即,線程組中的每一個線程在移動到下一指令之前執(zhí)行相同的單一指令。線程組可以包含任何合適和需要數(shù)量的線程。優(yōu)選地,線程組由四個單獨(dú)線程組成。
在本發(fā)明中,針對要執(zhí)行的一個或更多個操作(涉及存儲器事務(wù)的操作),向所述執(zhí)行流水線的可編程執(zhí)行級發(fā)出針對所述操作由線程組的所述線程執(zhí)行的指令或指令集。所述指令或指令集針對作為整體的所述線程組執(zhí)行,并且線程組(warp)范圍的操作的結(jié)果被遞送至所述線程組中的所有活動線程。(活動線程是當(dāng)前正在執(zhí)行指令或者正在等待執(zhí)行指令的線程,即,與已經(jīng)分支或終止它們的執(zhí)行的不活動線程相反)。
由此,不針對所述線程組中的每一個線程來執(zhí)行針對所述操作的所述指令或指令集,而是針對作為整體的所述線程組,由所述執(zhí)行級來執(zhí)行所述指令或指令集。
通過針對作為整體的所述線程組執(zhí)行所述操作,即,針對以鎖步執(zhí)行的所有活動線程,有助于防止線程死鎖。這是因為,針對線程組中的所有活動線程一起執(zhí)行操作,使得在線程可以執(zhí)行所述操作之前,沒有線程必須等待針對另一線程的操作完成,例如,在利用鎖來訪問存儲器的同時。
而且,因為針對作為整體的所述線程組來執(zhí)行所述操作,并由此例如使各個線程單獨(dú)地執(zhí)行所述操作變得冗余,所以減少了所涉及的處理、所需帶寬、所傳遞的數(shù)據(jù)以及由此消耗的電力。
所述操作可以包括涉及存儲器事務(wù)的任何合適和需要的數(shù)據(jù)處理操作。
在優(yōu)選實(shí)施方式中,所述操作包括原子操作(atomic operation)?!霸印贝鎯ζ鞑僮魇亲x取存儲器位置、在存儲器值與寄存器值之間執(zhí)行算術(shù)運(yùn)算并接著將算術(shù)運(yùn)算的結(jié)果寫回至同一存儲器位置的操作序列。執(zhí)行該序列操作以使得對于每一個觀察者來說,看起來好像該序列根本未執(zhí)行或已全部執(zhí)行。該序列操作作為一個不可分割的單元加以執(zhí)行,因此叫做“原子”。
針對作為整體的所述線程組執(zhí)行的所述原子操作可以包括任何合適和需要的原子操作。例如,所述原子操作可以包括置換操作,例如,包含用于改變一組數(shù)據(jù)的次序的置亂(shuffle)指令、(多個)類似低級指令(例如,縮減操作)、(多個)基本的算術(shù)指令(例如,加、減、除等)、或者(多個)比較或交換指令等。
在優(yōu)選實(shí)施方式中,針對作為整體的所述線程組執(zhí)行的所述原子操作包括鎖定操作?!版i定”操作是這樣的操作,即,針對獲取所述鎖定的執(zhí)行線程保留獨(dú)占地訪問存儲部(例如,存儲器),以使其正在訪問的存儲部中的數(shù)據(jù)在所述鎖定形成時不能被另一執(zhí)行線程訪問并由此潛在地改變。由此,一般來說,當(dāng)鎖定形成時,利用所述執(zhí)行線程可以使用的所述數(shù)據(jù)來執(zhí)行另一操作,例如,算術(shù)運(yùn)算,并接著將其結(jié)果提供給所述線程組中的所述活動線程。
應(yīng)當(dāng)清楚,這種特定類型的原子操作(即,鎖定操作)特別適于本發(fā)明,因為該操作有助于解決當(dāng)一個或更多個線程在等待當(dāng)前被另一線程保持的鎖定時,線程組中的線程死鎖的問題。通過針對作為整體的所述線程組獲取并利用所述鎖定,即,使得作為整體的所述線程組可以獨(dú)占使用被所述線程組訪問的存儲器中的數(shù)據(jù),這有助于防止所述線程死鎖,因為不需要針對每一個單獨(dú)線程的單獨(dú)鎖定。
用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的所述指令或指令集可以按任何合適和需要的方式來提供。優(yōu)選地,用于所討論的執(zhí)行級的所述編譯器包括發(fā)至所述執(zhí)行流水線的所述指令集中的所述指令或多個指令,如下所述。
在一個優(yōu)選實(shí)施方式中,用于針對作為整體的所述線程組執(zhí)行所述操作的所述指令對于應(yīng)用程序接口可見,因此程序員可以在針對要執(zhí)行的所述操作的應(yīng)用程序代碼中明確地包括所述指令(其中,響應(yīng)于此,所述編譯器接著生成用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的指令或指令集)。
在實(shí)施方式中,所述編譯器另外或者取而代之地被配置成(能夠)自動(其自身的決斷)提供用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的所述指令或指令集,即,不需要將所述指令或指令集例如通過程序員明確地包括在所述應(yīng)用程序代碼中。因而,優(yōu)選的是,所述方法還包括以下步驟(并且所述編譯器被配置成):自動將用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的指令或指令集插入用于所述操作的經(jīng)過編譯的應(yīng)用程序代碼中。
所述編譯器可以自動地按任何合適和需要的方式來提供所述指令或指令集。例如,所述編譯器可以被配置成在編譯所述程序代碼時,例如通過識別所述應(yīng)用程序代碼中的一個或更多個特定步驟,識別插入用于針對作為整體的線程組執(zhí)行操作的指令或指令集的機(jī)會。
(當(dāng)然,所述編譯器可以不識別向執(zhí)行級發(fā)出用于針對作為整體的所述線程組執(zhí)行操作的指令或指令集的機(jī)會,在該情況下,所述編譯器將不發(fā)出用于針對作為整體的線程組執(zhí)行操作的指令或指令集,例如,如果未被確定為對所述操作的執(zhí)行有益)。
用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的所述指令或指令集可以被配置成僅應(yīng)用至單個線程組,其它線程組在執(zhí)行所述操作時不遭遇該指令或指令集。然而,優(yōu)選的是,為執(zhí)行所述操作的所有線程組提供用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的所述指令或指令集,并且執(zhí)行所述操作的所有所述線程組都遇到所述指令或指令集。
在優(yōu)選實(shí)施方式中,所述編譯器被配置成(能夠)將所述程序代碼中的步驟重新排序,例如,用于改進(jìn)其針對線程組的執(zhí)行效率。對于可以針對線程組中的每一個線程單獨(dú)執(zhí)行的操作(例如,每線程的鎖定操作),例如,原子操作,因為這些操作可以自然分支,因而使編譯器難于將它們優(yōu)化,例如,因為對所述程序代碼中的步驟重新排序可能引入死鎖。然而,根據(jù)本發(fā)明,當(dāng)針對作為整體的所述線程組來執(zhí)行所述操作時,因為很少有死鎖的風(fēng)險,所以使得對于所述程序代碼中的剩余其它步驟較容易重新排序。這意味著所述編譯器可以較安全地對所述程序代碼中的步驟重新排序,或者以降低的死鎖風(fēng)險來重新調(diào)度針對作為整體的所述線程組執(zhí)行的所述操作。
因此,優(yōu)選的是,所述方法包括以下步驟(并且所述編譯器被配置成):相對于所討論的著色器程序中的其它指令,對針對作為整體的線程組執(zhí)行操作的指令或指令集(的發(fā)出)進(jìn)行重新排序。由此,所述編譯器可以向前或向后移動用于針對作為整體的線程組執(zhí)行操作的所述指令或指令集。這種重新排序可以有助于優(yōu)化(OpenCL)驅(qū)動器軟件實(shí)現(xiàn)。
在優(yōu)選實(shí)施方式中,僅針對作為整體的線程組執(zhí)行所述操作一次,即,執(zhí)行所述指令一次。由此,一旦已經(jīng)針對作為整體的線程組執(zhí)行了所述操作(例如,當(dāng)線程組中的其中一個線程初始地遇到所述操作時),并且將所述操作的結(jié)果提供給所述線程組中的所有活動線程,在這個實(shí)施方式中,當(dāng)例如所述線程組中的另一線程隨后遇到所述操作時,不再執(zhí)行所述操作。這是因為已經(jīng)將所述操作的結(jié)果提供給所述線程組中的所有活動線程,因此遇到所述操作的線程可以通過簡單地引用所述結(jié)果(例如,從寄存器讀取)而非自身執(zhí)行所述操作。
可以按照任何合適和需要的方式針對作為整體的所述線程組來執(zhí)行所述操作,并且可以將所述操作的結(jié)果提供給所述線程組的所有活動線程。
在一個實(shí)施方式中,由所述執(zhí)行級針對所述線程組的線程中的代表該線程組中的其它線程的一個線程執(zhí)行所述指令或指令集,使得針對作為整體的所述線程組來執(zhí)行所述操作,并且將所述操作的結(jié)果提供給所述線程組的所有活動線程。由此,當(dāng)所述線程中的一個線程遇到(例如,因達(dá)到必要的程序計數(shù)器)所述指令或指令集(優(yōu)選為第一線程遇到所述指令)時,所述執(zhí)行級僅針對該線程(但代表作為整體的所述線程組)執(zhí)行所述指令或指令集。
可以按任何合適和需要的方式,針對代表所述線程組中的其它線程的一個線程來執(zhí)行所述指令或指令集。優(yōu)選的是,將所述線程組中的、除正在被執(zhí)行所述指令或指令集的線程以外的其它所有線程(例如,遇到所述指令或指令集)掩蔽掉,由此使這些被掩蔽的線程暫時不活動。遮蔽所述線程組中的所述其它線程防止在通過所述一個線程執(zhí)行所述指令或指令集時這些線程遇到所述指令,使得針對作為整體的所述線程組執(zhí)行操作。在執(zhí)行了所述指令或指令集并將所述操作的結(jié)果提供給所述線程組的所有活動線程時,可以去除所述掩蔽。
因此,在一個優(yōu)選實(shí)施方式中,所述方法包括以下步驟(并且所述執(zhí)行級被配置成):當(dāng)所述執(zhí)行級接收到所述指令或指令集時,已針對所述線程組中的線程裝入所述指令或指令集:除了已裝入所述指令或指令集的所述線程以外,所述執(zhí)行級掩蔽所述線程組中的所有(例如,活動)線程;并且所述執(zhí)行級針對所述線程執(zhí)行用于針對作為整體的所述線程組執(zhí)行所述操作并且向所述線程組的所有活動線程提供所述操作的結(jié)果的所述指令或指令集。
在另一實(shí)施方式中,所述線程組中的每一個執(zhí)行線程都被設(shè)置成在遇到所述指令或指令集時檢查其它線程的狀態(tài),例如,檢查另一線程是否已執(zhí)行或開始執(zhí)行所述指令或指令集。這有助于確保所述指令或指令集僅被執(zhí)行一次,否則這可能導(dǎo)致所述線程和/或線程組死鎖。在這種情況下,所述線程將不鎖步執(zhí)行。
在另一實(shí)施方式中,響應(yīng)于所述指令或指令集,所述執(zhí)行級針對所述線程組集總地執(zhí)行所述操作,即,與針對代表所述線程組的一個線程執(zhí)行所述指令或指令集的上述實(shí)施方式相比。因此,優(yōu)選的是,所述方法包括以下步驟(并且所述執(zhí)行級被配置成):當(dāng)所述執(zhí)行級接收到所述指令或指令集時,所述執(zhí)行級針對所述線程組集總地執(zhí)行所述指令或指令集。
可以按任何合適和需要的方式,針對所述線程組集總地執(zhí)行所述指令或指令集。在一個實(shí)施方式中,所述執(zhí)行級針對所述線程組執(zhí)行所述指令或指令集(即,被設(shè)置成執(zhí)行針對所述程序(例如,著色器)的所有其它指令的執(zhí)行級,該程序針對所述線程組執(zhí)行)。
在另一實(shí)施方式中,由與正在用于執(zhí)行針對所述線程的操作的所述執(zhí)行級分離的執(zhí)行級執(zhí)行所述指令或指令集,即,使得不針對特定線程(例如代表所述線程組)執(zhí)行所述指令或指令集,而是單獨(dú)地針對作為整體的所述線程組來執(zhí)行。優(yōu)選的是,所述單獨(dú)的執(zhí)行級包括標(biāo)量引擎(scalar engine),例如,其被布置在用于所述線程組的所述執(zhí)行級的旁邊。所述單獨(dú)的執(zhí)行級(例如,所述標(biāo)量引擎)因而被配置成向所述線程組的活動線程返回所述操作的結(jié)果。
一旦所述執(zhí)行流水線的所述執(zhí)行級執(zhí)行了所述操作,就向所述線程組中的所有活動線程提供所述操作的結(jié)果,即,將統(tǒng)一(同一)結(jié)果提供給所有活動線程。(假定所述線程組中的任何不活動線程不需要所述操作的結(jié)果)。所述結(jié)果可以按任何合適和需要的方式提供給所述線程組中的所述活動線程。
在優(yōu)選實(shí)施方式中,所述結(jié)果被提供給一個或更多個存儲裝置,例如,存儲器或寄存器,所述結(jié)果可以被所述線程組中的所述活動線程讀取。所述存儲裝置可以包括可由所述線程組中的所有活動線程讀取的共享存儲裝置,例如,共享存儲器或寄存器。這特別方便,因為可能存在將存儲裝置(例如,寄存器)用于作為整體的所述線程組的其它理由,例如,用于存儲與執(zhí)行針對所述線程組的操作而一起使用的其它數(shù)據(jù)。在另一實(shí)施方式中,針對所述線程組中的每一個活動線程,所述存儲裝置可以包括分離的存儲裝置,例如,分離(例如,專用)的存儲器或寄存器。
在一個實(shí)施方式中,向所述線程組中的所述活動線程廣播所述操作的結(jié)果,例如,所述執(zhí)行級向所述活動線程發(fā)送消息,使得所述活動線程獲知所述結(jié)果可例如從存儲裝置讀取。
所述執(zhí)行級可以與被提供了所述操作的結(jié)果的(多個)特定存儲裝置(例如,針對線程的寄存器)相關(guān)聯(lián),因此所述執(zhí)行級可能已預(yù)先獲知將所述操作的結(jié)果返回至哪里。在另一實(shí)施方式中,向所述線程組中的所有活動線程提供所述操作的結(jié)果的所述指令或指令集包含被提供所述操作的結(jié)果的所述存儲裝置(例如,寄存器)的位置的指示。該指示接著被所述執(zhí)行級用于確定將所述操作的結(jié)果提供至哪里。
為允許將所述操作的結(jié)果提供給所述線程組中的活動線程,例如,通過向所述線程組中的活動線程廣播消息和/或通過將所述結(jié)果提供給針對所述線程組中的每一個活動線程的單獨(dú)存儲裝置,優(yōu)選的是,所述執(zhí)行級獲知所述線程組中的哪些線程是活動的(當(dāng)所述執(zhí)行級包括標(biāo)量引擎時特別是這種情況)。這可以按任何合適和需要的方式實(shí)現(xiàn)。優(yōu)選的是,向所述線程組中的所有活動線程提供所述操作的結(jié)果的所述指令或指令集包括對所述線程組中的所述活動線程的指示。
在另一實(shí)施方式中,例如,其中,將所述操作的結(jié)果提供給針對所述線程組中的每一個活動線程的單獨(dú)存儲裝置,將例如對針對不活動線程的寄存器的寫入掩蔽掉,以防止將所述結(jié)果提供給這些線程。
根據(jù)本發(fā)明的方法和數(shù)據(jù)處理系統(tǒng)可以被設(shè)置成與執(zhí)行時分支的程序代碼一起工作。所述執(zhí)行的分支可以發(fā)生在執(zhí)行針對作為整體的所述線程組的所述操作之前和/或之后。如果在針對作為整體的所述線程組執(zhí)行所述操作之前所述線程分支,則優(yōu)選地,將所述分支(例如,不活動的)線程掩蔽,以幫助防止任何潛在死鎖。
由此,可以僅針對在所述執(zhí)行級執(zhí)行所述指令或指令集時收斂(例如,自然收斂,盡可能合適)的那些線程執(zhí)行所述操作。所述分支線程(即,在執(zhí)行所述指令或指令集時,例如因在“if,then,or”語句下具有不同條件而不收斂的那些線程)被優(yōu)選地掩蔽掉(例如,停止),并且不執(zhí)行所述操作。優(yōu)選的是,所述分支線程還包括任何不活動線程。這允許僅針對所述活動線程執(zhí)行所述操作,并將結(jié)果僅提供給所述活動線程。
本發(fā)明還擴(kuò)展至編譯器本身。由此,根據(jù)本發(fā)明另一方面,提供了一種編譯器,該編譯器編譯程序以生成針對執(zhí)行流水線的執(zhí)行級的指令,該執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程被一起組合成線程組,其中,該線程組中的線程一次一個指令地鎖步執(zhí)行,其中,所述編譯器被配置成,針對要由所述執(zhí)行流水線的執(zhí)行級針對線程組執(zhí)行的、包括存儲器事務(wù)的操作:
向所述執(zhí)行級發(fā)出指令或指令集,使所述執(zhí)行級:
針對作為整體的所述線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
根據(jù)本發(fā)明另一方面,提供了一種編譯程序以生成針對執(zhí)行流水線的執(zhí)行級的指令的方法,該執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程被一起組合成線程組,其中,該線程組中的線程一次一個指令地鎖步執(zhí)行,該方法包括以下步驟:
針對要由所述數(shù)據(jù)處理系統(tǒng)的所述執(zhí)行流水線的執(zhí)行級針對線程組執(zhí)行的、包括存儲器事務(wù)的操作:
向所述執(zhí)行級發(fā)出指令或指令集,使所述執(zhí)行級:
針對作為整體的所述線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
本發(fā)明還擴(kuò)展至具有可響應(yīng)于(和利用)本發(fā)明的指令來執(zhí)行處理的一個或更多個執(zhí)行級的執(zhí)行流水線。
因此,根據(jù)本發(fā)明的另一方面,提供了一種用于數(shù)據(jù)處理系統(tǒng)的執(zhí)行流水線,該執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程可以一起組合成線程組,其中,該線程組中的線程一次一個指令地鎖步執(zhí)行,其中:
在執(zhí)行指令流中的指令時,響應(yīng)于所述指令流中的、用于執(zhí)行針對線程組的操作的指令或指令集,所述執(zhí)行流水線的至少一個執(zhí)行級被配置成:
針對作為整體的所述線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
根據(jù)本發(fā)明另一方面,提供了一種操作用于數(shù)據(jù)處理系統(tǒng)的執(zhí)行流水線的方法,該執(zhí)行流水線包括執(zhí)行用于執(zhí)行數(shù)據(jù)處理操作的指令的一個或更多個可編程執(zhí)行級,并且其中,執(zhí)行線程可以一起組合成線程組,其中,該線程組中的線程一次一個指令地鎖步執(zhí)行,該方法包括以下步驟:
所述執(zhí)行流水線的至少一個執(zhí)行級在執(zhí)行指令流中的指令時,響應(yīng)于所述指令流中的、用于執(zhí)行針對線程組的操作的指令或指令集:
針對作為整體的所述線程組執(zhí)行所述操作;以及
向所述線程組的所有活動線程提供所述操作的結(jié)果。
本領(lǐng)域技術(shù)人員應(yīng)當(dāng)清楚,本發(fā)明的這些方面在適當(dāng)時候可以并且優(yōu)選地包括在此描述的本發(fā)明的優(yōu)選和可選特征中的一個或更多個或全部。
優(yōu)選地,執(zhí)行流水線的所有執(zhí)行級(各執(zhí)行級)可以按本發(fā)明的方式來工作。
各可編程處理級(執(zhí)行單元)可以包括任何合適的可編程硬件部件,如可編程處理電路。各可編程處理級可被提供為獨(dú)立于針對處理流水線的其它可編程級的電路部件,或者可編程處理級可以共用它們的可編程處理電路中的一些或全部(因而被不同地編程以用作需要的可編程處理級)。
如上所述,優(yōu)選的是,本發(fā)明的數(shù)據(jù)處理系統(tǒng)包括圖形處理系統(tǒng),該圖形處理系統(tǒng)包括圖形處理流水線。在這種情況下,所述圖形處理流水線可以被用于執(zhí)行圖形處理(在該情況下,優(yōu)選的是,線程組中的每一個線程都對應(yīng)于一個頂點(diǎn)或一個片段(像素)和/或采樣點(diǎn)),但其還可以被操作為計算著色器流水線(例如,根據(jù)OpenCL)(在該情況下,每一個線程例如將對應(yīng)于合適的計算著色器工作項)。
因此,所述執(zhí)行流水線可以是圖形處理流水線、計算著色器流水線等。
在這些排布結(jié)構(gòu)中,所述圖形(或其它)處理流水線優(yōu)選地包括一系列不同的處理級,其中每一個都例如執(zhí)行不同操作,以提供所述處理流水線的輸出。優(yōu)選的是,所述處理流水線包括一個或更多個(例如,多個)處理級,例如,所述處理級一起工作來實(shí)現(xiàn)本發(fā)明的操作。
對于圖形和/或計算著色器處理流水線的情況來說,執(zhí)行單元(級)優(yōu)選地包括處理流水線的可編程著色級,諸如頂點(diǎn)著色器、片段著色器等。這些級可以如所需要地按任何合適的方式實(shí)現(xiàn),并且可以分別和在合適時執(zhí)行任何需要和合適的著色功能(例如,頂點(diǎn)著色、片段著色等)。對于片段著色器的情況來說,例如,該片段著色器可以渲染圖元或多個圖元以生成一組渲染輸出值,例如,表示用于顯示的幀。這些輸出值接著可以被導(dǎo)出至外部存儲器以供存儲和使用,如導(dǎo)出到顯示器的幀緩沖器。
除了可編程處理(著色器)級,圖形處理流水線還可以包含圖形處理流水線可包含的任何其它合適和需要的處理級,諸如光柵化器(rasteriser)、早期深度(或早期深度和模板)測試器、后期深度(或深度和模板)測試器、混合器(blender)、圖塊(tile)緩沖器、寫出輸出單元等。
本發(fā)明可以被用于圖形(或其它)處理流水線可以用于生成的所有形式的輸出,諸如用于顯示的幀、渲染至紋理輸出、計算著色器輸出等。來自該處理的輸出(例如,片段著色的)數(shù)據(jù)值優(yōu)選地導(dǎo)出至外部(例如,主)存儲器,以供存儲和使用,如導(dǎo)出到顯示器的幀緩沖器。
本發(fā)明可應(yīng)用于任何合適形式或配置的圖形處理器。特別可應(yīng)用于基于圖塊的圖形處理器和圖形處理系統(tǒng)。由此,在優(yōu)選實(shí)施方式中,圖形處理系統(tǒng)和圖形處理流水線分別是基于圖塊的系統(tǒng)和流水線。
在特別優(yōu)選的實(shí)施方式中,本發(fā)明的各種功能在單個圖形處理平臺上執(zhí)行,該單個圖形處理平臺生成并輸出渲染的片段數(shù)據(jù)(例如被寫入用于顯示裝置的幀緩沖器)。
本發(fā)明可以在任何合適系統(tǒng)中實(shí)現(xiàn),如適當(dāng)配置的基于微處理器的系統(tǒng)。在優(yōu)選實(shí)施方式中,本發(fā)明在計算機(jī)和/或基于微處理器的系統(tǒng)中實(shí)現(xiàn)。
本發(fā)明的各種功能可以按任何需要和合適的方式來執(zhí)行。例如,本發(fā)明的功能可以按需要以硬件或軟件實(shí)現(xiàn)。由此,例如,除非以其它方式指出,本發(fā)明的各種功能部件、級以及“裝置”可以包括合適的處理器或多個處理器、控制器或多個控制器、功能單元、電路、處理邏輯、微處理器裝置等,它們可工作以執(zhí)行各種功能等,諸如可以被編程成按需要方式工作的適當(dāng)?shù)膶S糜布考?或可編程硬件部件。
在此,還應(yīng)注意到,本領(lǐng)域技術(shù)人員應(yīng)清楚,本發(fā)明的各種功能、級等可以在指定處理器上復(fù)制和/或并行執(zhí)行。等同地,若需要,各種處理級可以共用處理電路等。
受限于執(zhí)行上述特定功能所需要的任何硬件,該數(shù)據(jù)處理系統(tǒng)和流水線可以另外包括該數(shù)據(jù)處理流水線所包括的一般功能單元等中的任一個或更多個或全部。
本領(lǐng)域技術(shù)人員還應(yīng)清楚,本發(fā)明的所有描述的方面和實(shí)施方式在合適時候可以(并且優(yōu)選地)包括在此描述的優(yōu)選和可選特征中的任一個或更多個或全部。
根據(jù)本發(fā)明的方法可以至少部分地利用軟件(例如,計算機(jī)程序)來實(shí)現(xiàn)。由此,可以看到,當(dāng)從另一方面觀看時,本發(fā)明提供一種計算機(jī)軟件、計算機(jī)程序元素以及計算機(jī)程序。在被安裝在數(shù)據(jù)處理裝置上時,該計算機(jī)軟件特別適于執(zhí)行在此描述的方法,計算機(jī)程序元素包括在數(shù)據(jù)處理裝置上運(yùn)行該程序元素時用于執(zhí)行在此描述的方法的計算機(jī)軟件代碼部分,并且計算機(jī)程序包括當(dāng)在數(shù)據(jù)處理系統(tǒng)上運(yùn)行該程序時適于執(zhí)行在此描述的方法或多個方法的全部步驟的代碼手段。數(shù)據(jù)處理器可以是微處理器系統(tǒng)、可編程FPGA(現(xiàn)場可編程門陣列)等。
本發(fā)明還擴(kuò)展至包括這種軟件的計算機(jī)軟件載體,其在被用于操作包括數(shù)據(jù)處理裝置的圖形處理器、渲染器或微處理器系統(tǒng)時,使與所述數(shù)據(jù)處理裝置、所述處理器、渲染器或系統(tǒng)結(jié)合地執(zhí)行本發(fā)明的方法的步驟。這種計算機(jī)軟件載體可以是諸如ROM芯片、CD ROM、RAM、閃速存儲器或磁盤的物理存儲介質(zhì),或者可以是諸如通過導(dǎo)線的電子信號、光學(xué)信號或諸如到衛(wèi)星的無線電信號等的信號。
還應(yīng)清楚,不是本發(fā)明方法的所有步驟都需要通過計算機(jī)軟件來執(zhí)行,因此,根據(jù)本發(fā)明的更廣泛方面提供一種計算機(jī)軟件并且這種軟件安裝在計算機(jī)軟件載體上、用于執(zhí)行在此闡述的方法的步驟中的至少一個步驟。
因此,本發(fā)明的裝置可以適當(dāng)?shù)鼐唧w實(shí)施為與計算機(jī)系統(tǒng)一起使用的計算機(jī)程序產(chǎn)品。這種實(shí)現(xiàn)可以包括固定在諸如計算機(jī)可讀介質(zhì)(例如,軟盤、CD ROM、ROM、RAM、閃速存儲器或硬盤)的有形非暫時介質(zhì)上的一系列計算機(jī)可讀指令。這種實(shí)現(xiàn)還可以包括可通過有形介質(zhì)(包括但不限于光或模擬通信線路),或者無形地利用無線技術(shù)(包括但不限于微波、紅外線或其他傳輸技術(shù)),經(jīng)由調(diào)制解調(diào)器或其它接口裝置傳送至計算機(jī)系統(tǒng)的一系列計算機(jī)可讀指令。所述一系列計算機(jī)可讀指令具體實(shí)施先前在此描述的全部或部分功能。
本領(lǐng)域技術(shù)人員應(yīng)當(dāng)清楚,這種計算機(jī)可讀指令可以采用許多編程語言來編寫,以與許多計算機(jī)架構(gòu)或操作系統(tǒng)一起使用。而且,這種指令可以利用當(dāng)前或?qū)淼娜魏未鎯ζ骷夹g(shù)來存儲,包括但不限于半導(dǎo)體、磁或光,或者利用當(dāng)前或?qū)淼娜魏瓮ㄐ偶夹g(shù)來傳送,包括但不限于光、紅外線或微波。設(shè)想的是,這種計算機(jī)程序產(chǎn)品可以作為具有附隨打印或電子文檔(例如,收縮包裝軟件)的可去除介質(zhì)進(jìn)行分發(fā),利用計算機(jī)系統(tǒng)預(yù)先加載(例如,預(yù)先加載在系統(tǒng)ROM或固定盤上),或者通過網(wǎng)絡(luò)(例如,因特網(wǎng)或萬維網(wǎng))從服務(wù)器或電子公告板發(fā)布。
附圖說明
下面,僅通過示例的方式并且參照附圖對本發(fā)明的許多優(yōu)選實(shí)施方式進(jìn)行描述,其中:
圖1示意性地示出示例性計算機(jī)圖形處理系統(tǒng);
圖2示意性地示出了可以按本發(fā)明的方式工作的圖形處理流水線;
圖3示意性地示出了一組執(zhí)行線程;
圖4示出了圖2所示的執(zhí)行線程組的操作的流程圖;
圖5示意性地示出了可按本發(fā)明的方式工作的著色器核心的架構(gòu)布局;
圖6示出了可按本發(fā)明的方式工作的編譯器的操作的流程圖;
圖7a、圖7b及圖7c示意性地示出了本發(fā)明的各個實(shí)施方式的執(zhí)行操作;
圖8a和圖8b示意性地示出了本發(fā)明的各個實(shí)施方式的處理結(jié)果;以及
圖9示出了根據(jù)本發(fā)明實(shí)施方式的操作的流程圖。
具體實(shí)施方式
下面,在處理用于顯示的計算機(jī)圖形的背景下,對本發(fā)明的許多優(yōu)選實(shí)施方式進(jìn)行描述。
圖1示意性地示出典型的計算機(jī)圖形處理系統(tǒng)。
在主處理器1上執(zhí)行的諸如游戲的應(yīng)用2將需要由關(guān)聯(lián)的圖形處理單元(圖形處理流水線)3來執(zhí)行圖形處理操作。為此,該應(yīng)用將生成API(應(yīng)用編程接口)調(diào)用,該API調(diào)用通過運(yùn)行在主處理器1上的用于圖形處理流水線3的驅(qū)動器4來解釋,以生成針對圖形處理器3的恰當(dāng)命令,從而生成應(yīng)用2所需的圖形輸出。為此,響應(yīng)于來自運(yùn)行在用于圖形輸出(例如,用于生成要顯示的幀)的主系統(tǒng)1上的應(yīng)用2的命令,將一組“命令”提供給圖形處理器3。
圖2更詳細(xì)地示出了本實(shí)施方式的圖形處理流水線3。
圖2中示出的圖形處理流水線3是基于圖塊的渲染器,因此將生成渲染輸出數(shù)據(jù)陣列的圖塊(如要生成的輸出幀)。
(在基于圖塊的渲染方面,不是如即時模式渲染中那樣有效地一舉處理整個渲染輸出(例如,幀),而是將該渲染輸出(例如,要顯示的幀)劃分成多個較小的子區(qū)域,通稱為“圖塊”。每一個圖塊(子區(qū)域)都單獨(dú)渲染(通常一個接一個),并接著將經(jīng)渲染的圖塊(子區(qū)域)重新組合以提供完整的渲染輸出,例如,用于顯示的幀。在這種布置中,渲染輸出通常被劃分成規(guī)則大小和形狀的子區(qū)域(圖塊)(例如通常是方形或矩形),但這不是必須的)。
渲染輸出數(shù)據(jù)可以通常是旨在用于在顯示裝置(諸如屏幕或打印機(jī))上顯示的輸出幀,但也可以包括例如旨在供以后渲染處理中使用的中間數(shù)據(jù)(也稱為“渲染至紋理”輸出)等。
在要顯示計算機(jī)圖形圖像時,通常首先將其定義為一系列圖元(多邊形),接著將圖元依次劃分(光柵化)成用于圖形渲染的圖形片段。在正常的圖形渲染操作期間,渲染器將修改與每個片段相關(guān)聯(lián)的(例如)顏色(紅、綠、藍(lán),RGB)和透明度(alpha a)數(shù)據(jù),使得可以正確顯示片段。一旦片段已經(jīng)完全經(jīng)過渲染器,則將它們的關(guān)聯(lián)數(shù)據(jù)值存儲在存儲器中準(zhǔn)備輸出,例如用于顯示。
圖2示出了與本實(shí)施方式的操作相關(guān)的圖形處理流水線3的主要部件和流水線級。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)清楚,可以存在圖2中未例示的圖形處理流水線的其它部件。在此還應(yīng)注意,圖2僅是示意性的,而且例如實(shí)際上,所示的功能單元和流水線級可以共用大量硬件電路,即使它們在圖2中被示意性地示出為單獨(dú)的級。還應(yīng)清楚,如圖2所示的圖形處理流水線的級、部件以及單元等中的每一個都可以如需地實(shí)現(xiàn),并因此例如包括用于執(zhí)行必要操作和功能的恰當(dāng)電路和/或處理邏輯等。
如圖2所示,圖形處理流水線3包括多個級,這些級包括頂點(diǎn)著色器20、外殼著色器21、曲面細(xì)分器(tesselator)22、域著色器23、幾何著色器24、光柵化級25、早期Z(深度)和模板測試級26、片段著色形式的渲染器27、后期Z(深度)和模板測試級28、混合級29、圖塊緩沖器30,以及下采樣與寫出(多重采樣分辨)級31。
頂點(diǎn)著色器20采取與針對要生成的輸出所定義的頂點(diǎn)等相關(guān)聯(lián)的輸入數(shù)據(jù)值,并且處理那些數(shù)據(jù)值以生成一組對應(yīng)的“頂點(diǎn)著色”輸出數(shù)據(jù)值,供圖形處理流水線3的隨后的級使用。頂點(diǎn)著色例如修改輸入數(shù)據(jù)以在要渲染的圖像中考慮光照效果。
外殼著色器21針對多組的片(patch)控制點(diǎn)執(zhí)行操作,并且生成被稱為片常數(shù)的附加數(shù)據(jù),曲面細(xì)化級22細(xì)分幾何形狀以創(chuàng)建外殼的較高級表示,域著色器23對曲面細(xì)化級輸出的頂點(diǎn)執(zhí)行操作(類似于頂點(diǎn)著色器),而幾何著色器24處理諸如三角形、點(diǎn)或線的整個圖元。響應(yīng)于提供給圖形處理流水線3的命令和頂點(diǎn)數(shù)據(jù),這些級與頂點(diǎn)著色器21一起有效地執(zhí)行所有必要的片段前端操作(諸如變換與光照操作)和用于設(shè)置要渲染的圖元的圖元設(shè)置。
圖形處理流水線3的光柵化級25工作以將組成渲染輸出的圖元(例如,要顯示的圖像)光柵化為個別圖形片段以進(jìn)行處理。為此,光柵化級25接收用于渲染的圖形圖元,將圖元光柵化成采樣點(diǎn),并且生成具有恰當(dāng)位置(表示恰當(dāng)采用位置)的圖形片段以渲染圖元。
光柵化級生成的片段接著被向前發(fā)送至流水線的其余部分以供處理。
早期深度(Z)/模板測試級26對其從光柵化級25接收到的片段執(zhí)行深度(Z)測試,以查看在該級是否可以廢棄(剔除)任何片段。為此,早期Z/模板測試級26將從光柵化級25發(fā)出的片段的深度值(與片段相關(guān)聯(lián))與已經(jīng)渲染的片段的深度值(這些深度值被存儲在作為圖塊緩沖器30的一部分的深度(Z)緩沖器中)進(jìn)行比較,以確定新的片段是否會被已經(jīng)渲染的片段掩蔽。同時,執(zhí)行早期模板測試。
通過了片段早期Z和模板測試級26的片段接著被發(fā)送至片段著色級27。片段著色級27對通過早期Z和模板測試的片段執(zhí)行恰當(dāng)?shù)钠翁幚聿僮?,以處理該片段來生成恰?dāng)?shù)匿秩酒螖?shù)據(jù)。
該片段處理可以包括任何合適和需要的片段著色處理(諸如對片段執(zhí)行片段著色器程序、向片段應(yīng)用紋理、向片段應(yīng)用霧化或其它操作等),以生成恰當(dāng)?shù)钠螖?shù)據(jù)。在本實(shí)施方式中,片段著色級27采用著色器流水線的形式(可編程片段著色器)。
接著是“后期”片段Z和模板測試級28,其中,其針對著色片段執(zhí)行流水線深度測試的末端,以確定在最終的圖像中是否將實(shí)際看到渲染的片段。通過將從片段著色級27發(fā)出的片段的深度值(和片段相關(guān)聯(lián))與已渲染的片段的深度值(存儲在深度緩沖器中)進(jìn)行比較,該深度測試使用存儲在圖塊緩沖器30的Z緩沖器中的片段位置的Z緩沖值,來確定新片段的片段數(shù)據(jù)是否應(yīng)當(dāng)替換已渲染的片段的片段數(shù)據(jù)。該后期片段深度和模板測試級28還對片段執(zhí)行任何必需的“后期”alpha和/或模板測試。
通過后期片段測試級28的片段接著在混合級29中經(jīng)受(若需要的話)與已存儲在圖塊緩沖器30中的片段的任何必需的混合操作。對于片段而言必需的任何其它剩余操作(如抖動(dither)等)(未示出)也在該級執(zhí)行。
最后,(混合的)輸出片段數(shù)據(jù)(值)從它們例如可以被寫到圖塊緩沖器30,并且從圖塊緩沖器30輸出至幀緩沖器以進(jìn)行顯示。用于輸出片段的深度值還被恰當(dāng)?shù)貙懭雸D塊緩沖器30內(nèi)的Z緩沖器。(圖塊緩沖器將存儲顏色和深度緩沖,其針對該緩沖器表示的每一個采樣點(diǎn)(本質(zhì)上,針對被處理的圖塊的每一個采樣點(diǎn))分別存儲恰當(dāng)顏色等或Z值)。這些緩沖器存儲表示總的渲染輸出(例如,要顯示的圖像)的一部分(圖塊)的片段數(shù)據(jù)的陣列,并且緩沖器中的采樣值的各個組對應(yīng)于總的渲染輸出的相應(yīng)像素(例如,每個2×2組的采樣值可以對應(yīng)于輸出像素,其中,使用4倍多重采樣)。
圖塊緩沖器被設(shè)置為位于圖形處理流水線(芯片)上(本地)的RAM的一部分。
來自圖塊緩沖器30的數(shù)據(jù)被輸入至下采樣(多重采樣分辨)寫出級31,并且從該處輸出(寫回)至外部存儲器輸出緩沖器,如顯示裝置的幀緩沖器(未示出)。(該顯示裝置例如可以包括具有像素陣列的顯示器,諸如計算機(jī)監(jiān)視器或打印機(jī))。
下采樣與寫出單元31對存儲在圖塊緩沖器30中的片段數(shù)據(jù)下采樣,直至用于輸出緩沖器(裝置)的恰當(dāng)分辨率(即,使得生成與輸出裝置的像素相對應(yīng)的像素數(shù)據(jù)陣列),以生成用于輸出至輸出緩沖器的輸出值(像素)。
一旦處理了渲染輸出的圖塊并將其數(shù)據(jù)導(dǎo)出至主存儲器(例如,主存儲器中的幀緩沖器(未示出))以供存儲,就接著處理下一圖塊,等等,直到處理了足夠圖塊以生成整個渲染輸出(例如,要顯示的幀(圖像))為止。接著,針對下一渲染輸出(例如,幀)重復(fù)該處理等等。
用于圖形處理流水線3的其它排布結(jié)構(gòu)當(dāng)然是可能的。
上面描述了圖1所示的圖形處理系統(tǒng)的操作的某些特征。下面,對根據(jù)本發(fā)明的實(shí)施方式的、圖1所示圖形處理系統(tǒng)的操作的進(jìn)一步特征進(jìn)行描述。
可以從圖2看出,圖形處理流水線3包括多個可編程處理或“著色器”級,即,頂點(diǎn)著色器20、外殼著色器21、域著色器23、幾何著色器24以及片段著色器27。這些可編程著色器級執(zhí)行具有一個或更多個輸入變量并生成多組輸出變量的、由應(yīng)用提供的相應(yīng)著色器程序。為此,應(yīng)用2提供利用諸如GLSL、HLSL、OpenCL等的高級著色器編程語言實(shí)現(xiàn)的著色器程序。接著,這些著色器程序被著色器語言編譯器翻譯成用于目標(biāo)圖形處理流水線3的二進(jìn)制代碼。這可以包括在編譯器內(nèi)創(chuàng)建程序的一個或更多個中間表示。(編譯器例如可以是驅(qū)動器4的一部分,并且存在使該編譯器運(yùn)行的專用API調(diào)用。該編譯器執(zhí)行由此可以被看作響應(yīng)于應(yīng)用生成的API調(diào)用,而通過驅(qū)動器進(jìn)行的繪制調(diào)用準(zhǔn)備的一部分)。
圖形處理流水線中的每一個著色器(舉例來說,如圖2的實(shí)施方式中所示)是基于圖形處理流水線從應(yīng)用接收到的命令,通過針對要生成的圖形輸出中的每一個圖形項運(yùn)行小程序來執(zhí)行圖形處理(在這點(diǎn)上,“項”通常是頂點(diǎn)、片段或像素)的處理單元。本實(shí)施方式涉及如下情況:要由著色器執(zhí)行的執(zhí)行線程(其中,每一個線程都對應(yīng)于一個圖形項)已被組織成線程的“組”或“束”,所述線程將要一次一個指令地鎖步運(yùn)行并且要執(zhí)行原子存儲器操作(例如,鎖定操作)。
(“原子”存儲器操作是讀取存儲器位置、在存儲器值與寄存器值之間執(zhí)行算術(shù)運(yùn)算并接著將算術(shù)運(yùn)算的結(jié)果寫回至同一存儲器位置的操作序列。該序列操作被執(zhí)行為使得對于每一個觀察者來說,看起來好像該序列根本未執(zhí)行或者已全部執(zhí)行。該序列材質(zhì)作為一個不可分割的單元加以執(zhí)行,因此,叫做“原子”)。
圖3示出了針對這種線程組的執(zhí)行級51(“鎖步單元”)的示意圖,該執(zhí)行級包括四個單獨(dú)的執(zhí)行路線(lane)52(“路線1”、“路線2”、“路線3”、“路線4”),這些執(zhí)行路線執(zhí)行針對個別線程的指令執(zhí)行。針對線程,為每個執(zhí)行線程52單獨(dú)地提供由執(zhí)行路線52執(zhí)行的操作(通過執(zhí)行指令或指令集)的結(jié)果53(“原子MSG#1”、“原子MSG#2”、“原子MSG#3”、“原子MSG#4”)。
圖4是示出在執(zhí)行原子操作時針對線程組(舉例來說,如圖3所示)的操作的流程圖。首先,將用于原子操作的編譯指令從指令高速緩沖存儲器54中裝入,并且例如由執(zhí)行級解碼(步驟61,圖4)。該線程組中的執(zhí)行線程皆利用要在原子操作中(例如,在算術(shù)運(yùn)算中)中使用的、從線程的寄存器讀取的數(shù)據(jù)來完成所述指令(步驟62,圖4)。該原子操作由所述執(zhí)行級針對每個線程執(zhí)行(步驟63,圖4),這通常涉及將數(shù)據(jù)寫入至共享存儲器區(qū)或高速緩沖存儲器(步驟64,圖4)。
一旦執(zhí)行了該原子操作,就將該操作的結(jié)果53(“原子MSG#1”、“原子MSG#2”、“原子MSG#3”、“原子MSG#4”)(例如,因算術(shù)運(yùn)算而對寄存器數(shù)據(jù)的修改)寫回至用于該線程組中的每一個線程的寄存器(步驟65,圖4),使得該結(jié)果可以被該線程組中的每一個線程讀取。
圖5至圖9例示了上述操作的各種優(yōu)選實(shí)施方式。
圖5示出了根據(jù)本發(fā)明實(shí)施方式的著色器核心101(例如,圖1所示的圖形處理單元(流水線)3)的示意圖。著色器核心101包括多個執(zhí)行單元102(“warp單元”),其中每一個執(zhí)行單元都支持四個執(zhí)行線程的組。每個執(zhí)行單元102都包括四組寄存器103(即,每個線程一組寄存器,并且每組寄存器優(yōu)選地具有至少32個寄存器)以及共享的本地存儲器區(qū)104(“存儲庫(storage bank)”)。
每一個執(zhí)行單元102都與互連部105(“消息路徑”)數(shù)據(jù)通信。而且,與互連部105進(jìn)行數(shù)據(jù)通信的是標(biāo)量執(zhí)行單元106以及處理加載/存儲和原子操作的分離“加載/存儲/原子”流水線107,例如,針對外部系統(tǒng)存儲器或高速緩沖存儲器層級。
下面,參照圖6的流程圖,對根據(jù)本發(fā)明實(shí)施方式的用于著色器核心的編譯器的操作進(jìn)行描述。
如上所述,當(dāng)關(guān)聯(lián)的圖形處理單元(圖形處理流水線)要執(zhí)行應(yīng)用的圖形處理操作時,該應(yīng)用將生成由編譯器(未示出)接收的API(應(yīng)用編程接口)調(diào)用(例如,作為著色器程序的一部分)(步驟71,圖6)。這使得編譯器能夠生成針對圖形處理單元的恰當(dāng)指令,以生成該應(yīng)用所需的圖形輸出。這些指令對于每一個線程組(要針對其執(zhí)行著色器程序)來說是公共的,例如,繪制調(diào)用。
API調(diào)用由編譯器解析(步驟72,圖6),并且編譯器標(biāo)識要執(zhí)行的或者可以在線程組范圍的基礎(chǔ)上執(zhí)行的操作(步驟73,圖6)。
如果API調(diào)用在程序代碼中明確地包括用于要針對作為整體的線程組執(zhí)行的操作的步驟或多個步驟,則編譯器將API調(diào)用編譯成恰當(dāng)?shù)闹噶罨蛑噶罴园l(fā)至圖形處理單元進(jìn)行執(zhí)行(步驟74,圖6)。
另外或另選地,如果編譯器能夠在著色器程序中包括用于以自己的意志針對作為整體的線程組來執(zhí)行操作的指令或指令集,則編譯器將通過針對作為整體的線程組執(zhí)行操作,嘗試在API調(diào)用中標(biāo)識恰當(dāng)?shù)牟襟E和/或機(jī)會,以針對線程組來優(yōu)化該著色器程序(步驟74,圖6),如果編譯器標(biāo)識了這種步驟/機(jī)會,則自動將指令或指令集插入編譯的著色器程序中。
接著,將編譯的指令發(fā)至圖形處理單元(步驟75,圖6),例如,通過將指令寫入指令高速緩沖存儲器,執(zhí)行級可針對線程組從指令高速緩沖存儲器裝入所述指令。
圖7a、圖7b、圖7c、圖8a及圖8c皆示出了要用于執(zhí)行線程組的執(zhí)行的執(zhí)行單元102(“鎖步單元”)。類似于圖5中示出的,執(zhí)行單元102包括四個單獨(dú)執(zhí)行路線110(“路線1”、“路線2”、“路線3”、“路線4”),即,每執(zhí)行線程一個路線。
在圖7a、圖7b、圖7c及圖8a所示的執(zhí)行單元102中,仍然類似于圖5中示出的,針對每個單獨(dú)的執(zhí)行路線110設(shè)置單獨(dú)的一組寄存器103(“R1”)。
在圖8b所示的執(zhí)行單元102中,代替單獨(dú)的寄存器,設(shè)置了可由每一個執(zhí)行線程讀取的共享寄存器111。
在圖7c所示的系統(tǒng)中,類似于圖5中示出的,設(shè)置標(biāo)量執(zhí)行單元106,標(biāo)量執(zhí)行單元106與針對執(zhí)行線程組的執(zhí)行單元102數(shù)據(jù)通信。
參照圖5、圖7a、圖8a及圖9,將首先對在執(zhí)行針對作為整體的執(zhí)行線程組的操作時該執(zhí)行線程組的操作進(jìn)行描述。
圖9示出了示出根據(jù)如圖7a所示的實(shí)施方式的由一組執(zhí)行線程采取的執(zhí)行步驟的流程圖。
存儲在指令高速緩沖存儲器108中的編譯的指令在被執(zhí)行單元102的程序計數(shù)器(該程序計數(shù)器被每一個執(zhí)行線程共享)引用時被該執(zhí)行單元裝入(步驟201,圖9)。該線程組中的執(zhí)行線程皆輪流完成所述指令,所述指令被該線程組中的每一個線程共享并鎖步地執(zhí)行。
評估每一個指令或指令集有關(guān)是否為是要針對作為整體的線程組執(zhí)行的原子操作(步驟202,圖9),直到該線程組中的線程之一遇到這種要針對作為整體的線程組執(zhí)行的原子操作為止。(如果線程所遇到的指令不涉及要針對作為整體的線程組執(zhí)行的原子操作,則在該指令或指令集被確定為不涉及這種操作(步驟202,圖9)之后,該指令的執(zhí)行與針對參照圖2所述的操作相同)。
在原子級操作包括鎖定操作的實(shí)施方式中,鎖定操作程序代碼可以采取這樣的形式,即:
While(warp_mtx.try_lock());
//針對整個warp執(zhí)行鎖定工作
warp_mtx.unlock();
在一個實(shí)施方式中,這導(dǎo)致被發(fā)至該執(zhí)行級的下列原子交換指令(用于獲取和釋放鎖定):
WATOM32.lock.AXCHG r0,r1,d0//r0-src addr,r1-dst addr,d0-val,p=0
WATOM32.lock.AXCHG r0,d0,d1//r0-src addr,d0-dst,d1-val,p=0
第一指令交換該值(例如,其預(yù)期0,并且用1替換該值),以獲取鎖定(等同于“try_lock”指令),而第二指令交換該值(例如,保持該鎖定時預(yù)期為1,接著用0替換該值),以釋放鎖定。
該指令采取下列引數(shù)(argument):
該指令利用跨該線程組的線程的鎖定來執(zhí)行原子交換操作。如果源(src)位置未設(shè)置,則該操作利用原子比較和交換操作,自動將該操作的結(jié)果存儲至遇到該指令的第一個線程的目的地(dst)地址位置,以跳過該線程組中的所有其它活動線程。如果src位置已經(jīng)被設(shè)置,則該操作返回結(jié)果0,否則,返回結(jié)果1。
如果該操作是原子加(add)操作,例如,沒有利用鎖定,則在一個實(shí)施方式中,該指令采取這樣的形式,即:
WATOM64.atom.AADD r0,r1,d0//r0-src addr,r1-dst addr,d0-val,p=1
該指令自動執(zhí)行針對遇到該指令的第一活動線程的源(src)地址位置的原子加操作,而該線程組中的其它活動線程組利用現(xiàn)有結(jié)果。作為該操作的結(jié)果,返回該操作之前源(src)地址位置中的舊值。
返回至圖5、圖7a、圖8a及圖9,當(dāng)該線程組中的線程之一(例如,通過圖7a中的“路線1”執(zhí)行路線110執(zhí)行)遇到用于要針對作為整體的線程組執(zhí)行的原子操作的指令(從指令高速緩沖存儲器裝入(步驟201,圖9))時,通過執(zhí)行單元102將其識別為要針對作為整體的線程組執(zhí)行(步驟202,圖9)。執(zhí)行單元102接著掩蔽掉該線程組中的其它線程(步驟203,圖9),即,將它們呈現(xiàn)為不活動,如圖7a所示。
(在這個階段,如果要針對作為整體的線程組執(zhí)行的原子操作包括鎖定操作,則獲取對該線程存取的存儲器中的數(shù)據(jù)的鎖定,由此有效地獲取針對作為整體的線程組的鎖定)。
來自與鎖步單元102中的活動線程相對應(yīng)的執(zhí)行路線110的寄存器組103的數(shù)據(jù)接著被存取(步驟204,圖9),以用于原子操作,例如,算術(shù)運(yùn)算。接著,原子操作可以由與該線程相關(guān)聯(lián)的執(zhí)行路線110來執(zhí)行(步驟205,圖9),這通常涉及利用“加載/存儲/原子”流水線107來執(zhí)行針對共享存儲器區(qū)的原子操作并且將數(shù)據(jù)寫入該共享存儲器區(qū)(步驟206,圖9)。
一旦執(zhí)行了原子操作,就將操作的結(jié)果(統(tǒng)一結(jié)果(“原子MSG”)113)(例如,因算術(shù)運(yùn)算而修改的寄存器數(shù)據(jù))寫回執(zhí)行級102的每一條執(zhí)行路線110的寄存器組103(步驟207,圖9)。如圖7a和圖8a所示(除了針對為了執(zhí)行針對作為整體的線程組的操作而被掩蔽掉的任何執(zhí)行路線以外),使得結(jié)果可以在該線程組中的每一個線程達(dá)到針對該原子操作的所述指令或指令集時由每一個線程存取。
在將操作的結(jié)果寫入執(zhí)行路線110的寄存器組103后,去除針對執(zhí)行級102的執(zhí)行路線110的掩蔽(步驟208,圖9)。接著繼續(xù)處理圖形處理流水線從應(yīng)用接收到的命令,即,完成從指令高速緩沖存儲器裝入的指令,并且只要要針對作為整體的線程組執(zhí)行原子操作,就重復(fù)上面參照圖5、圖7a、圖8a及圖9描述的處理。
圖7b所示實(shí)施方式的操作非常類似于針對圖7a所示的實(shí)施方式描述的操作。唯一差異是,代替將針對遇到要針對作為整體的線程組執(zhí)行的原子操作的線程的執(zhí)行路線110(如圖7a所示的“路線1”)用于執(zhí)行該原子操作,由執(zhí)行單元102針對作為整體的線程組來執(zhí)行針對原子操作的指令或指令集,由此避免必須掩蔽掉任何執(zhí)行路線110。與圖7a所示實(shí)施方式類似地,將原子操作的結(jié)果寫回針對執(zhí)行單元102的執(zhí)行路線110的寄存器組103中的每一個寄存器。
圖7c所示實(shí)施方式的操作非常類似于針對圖7b所示的實(shí)施方式描述的操作,除了代替執(zhí)行單元102執(zhí)行指令或指令集,通過單獨(dú)的標(biāo)量執(zhí)行單元106來執(zhí)行原子操作的執(zhí)行(如圖5所示)。與圖7a和圖7b所示實(shí)施方式類似地,將原子操作的結(jié)果寫回針對執(zhí)行單元102的執(zhí)行路線110的寄存器組103中的每一個寄存器。
在另一實(shí)施方式中,如圖8b所示,設(shè)置可由執(zhí)行單元102中的每一個執(zhí)行路線110讀取的共享寄存器111。在這個實(shí)施方式中,向線程組中的所有活動線程提供原子操作的結(jié)果的步驟(步驟207,圖9)包括:將該結(jié)果寫入至共享寄存器111,針對單獨(dú)線程的執(zhí)行路線110可以從共享寄存器111讀取該結(jié)果。
根據(jù)上述內(nèi)容可以看出,針對作為整體的線程組(即,針對要鎖步執(zhí)行的所有線程)執(zhí)行warp范圍的操作有助于避免這些線程死鎖。這是因為該操作針對該線程組中的所有線程共同執(zhí)行的緣故,這樣,在一個線程可以執(zhí)行操作之前,不用等待另一線程完成該操作,例如在利用鎖定訪問存儲器的同時。
而且,因為所述操作針對作為整體的所述線程組來執(zhí)行,因此例如使得各個線程單獨(dú)執(zhí)行所述操作變得多余,所以縮減了所涉及的處理、所需的帶寬、所傳遞的數(shù)據(jù)及由此消耗的功率。