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