圖形處理單元中的3d加速結(jié)構(gòu)的完全并行適當(dāng)?shù)貥?gòu)造的制作方法
【專利摘要】本發(fā)明涉及一種圖形處理單元中的3D加速結(jié)構(gòu)的完全并行適當(dāng)?shù)貥?gòu)造。一種用于并行地構(gòu)造二叉基數(shù)樹的系統(tǒng)和方法,該二叉基數(shù)樹用作用于構(gòu)造二級(jí)(secondary)樹的構(gòu)建塊。公開了具有用于使計(jì)算機(jī)系統(tǒng)實(shí)施方法的計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。該方法包括確定包括被索引化的基元節(jié)點(diǎn)的總數(shù)的多個(gè)基元,其中多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng)。該方法包括將多個(gè)基元排序。該方法包括以至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)的方式構(gòu)建層次樹。該方法包括與層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。
【專利說明】圖形處理單元中的3D加速結(jié)構(gòu)的完全并行適當(dāng)?shù)貥?gòu)造
[0001]相關(guān)申請(qǐng)的交叉引用
[0002]本申請(qǐng)是2012年3月9 日提交的、名為“FULLY PARALLEL IN-PLACE CONSTRUCTION0F3D ACCELERATION STRUCTURES ON A GPU” 的臨時(shí)專利申請(qǐng) 61/609,156 的變換并要求其優(yōu)先權(quán)和權(quán)益,本文在此通過援弓I的方式對(duì)其全文加以合并。
【背景技術(shù)】
[0003]近些年來,通用計(jì)算產(chǎn)生了一些用于構(gòu)造層次包圍盒(BVH)、八叉樹以及k-d樹的方法用于數(shù)百萬的實(shí)時(shí)的基元。一些方法目標(biāo)在于使用表面積啟發(fā)式(surface areaheuristic)最大化結(jié)果樹的質(zhì)量,而其他方法選擇用增加的構(gòu)造的速度換取樹的質(zhì)量。
[0004]正確的質(zhì)量與速度的權(quán)衡特別依靠于應(yīng)用。樹的質(zhì)量在經(jīng)常重新使用相同加速結(jié)構(gòu)用于數(shù)百萬的射線的射線追蹤中通常是優(yōu)選的。實(shí)時(shí)物理中的寬階段(BTOad-PhaseMi撞檢測(cè)和粒子交互表示其他極端,其中構(gòu)造速度是首要重要的一必須在每個(gè)時(shí)間步長(zhǎng)上重新構(gòu)造加速結(jié)構(gòu),并且詢問的數(shù)目通常相當(dāng)小。此外,某些應(yīng)用,諸如基于體素(voxel)的全局照明和表面重新構(gòu)造,具體依靠規(guī)則的八叉樹和k-d樹,其中樹的質(zhì)量是固定的。
[0005]目標(biāo)在于最大化構(gòu)造速度的現(xiàn)有方法的主要缺點(diǎn)是其以順序方式生成節(jié)點(diǎn)層次,通常一次一級(jí),因?yàn)楸仨氃谙乱粋€(gè)可以開始之前完成每輪處理。這限制了其在樹的頂級(jí)可達(dá)到的并行度的量,并可導(dǎo)致并行核心的嚴(yán)重的未充分利用。順序處理具有小工作負(fù)載,已是當(dāng)前GPU的瓶頸,當(dāng)前GPU要求數(shù)萬獨(dú)立的并行線程以完全利用其計(jì)算能力??深A(yù)計(jì)在將來隨著并行核心的數(shù)目持續(xù)增加,問題甚至?xí)@著。順序處理的另一個(gè)含義是現(xiàn)有方法以寬度優(yōu)先(breadth-first)的次序輸出層次,雖然考慮到數(shù)據(jù)所在位置和高速緩存命中率,深度優(yōu)先的次序?qū)⑼ǔJ莾?yōu)選的。
【發(fā)明內(nèi)容】
[0006]一種用于最大化諸如層次包圍體(BVH)、八叉樹以及k-d樹的層次樹的構(gòu)造中的平行度的計(jì)算機(jī)實(shí)現(xiàn)的方法和系統(tǒng)。本發(fā)明的實(shí)施例提供用于構(gòu)造BVH、八叉樹以及k-d樹的快速的方法,以便整體性能與可用核心的數(shù)目成線性比例,并且作為結(jié)果的數(shù)據(jù)結(jié)構(gòu)總是按照嚴(yán)格的深度優(yōu)先的次序。新穎的方法包括以完全數(shù)據(jù)并行的方式構(gòu)造二叉基數(shù)樹。二叉基數(shù)樹隨后用作用于有效地構(gòu)造其他類型的樹的構(gòu)建塊。
[0007]在一個(gè)實(shí)施例中,公開了具有用于使計(jì)算機(jī)系統(tǒng)執(zhí)行方法的計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。方法包括確定包括被索引化的基元節(jié)點(diǎn)的總數(shù)的多個(gè)基元,其中多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng)。方法包括將多個(gè)基元排序。方法包括以至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)的方式構(gòu)建層次樹。方法還包括與層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。也就是說,與層次樹的一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)的各自的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。
[0008]在另一個(gè)實(shí)施例中,公開了計(jì)算機(jī)系統(tǒng),包括處理器,以及耦連到該處理器并具有存儲(chǔ)在其中的指令的存儲(chǔ)器,該指令如果由計(jì)算機(jī)系統(tǒng)所執(zhí)行,那么使計(jì)算機(jī)系統(tǒng)執(zhí)行方法。方法包括確定包括被索引化的基元節(jié)點(diǎn)的總數(shù)的多個(gè)基元,其中多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng)。方法包括將多個(gè)基元排序。方法包括以至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)的方式構(gòu)建層次樹。方法還包括與層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。也就是說,與層次樹的一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)的各自的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。
[0009]在又一個(gè)實(shí)施例中,公開了包括用于為多個(gè)基元指派莫頓碼的裝置的系統(tǒng),所述多個(gè)基元包括被索引化的基元節(jié)點(diǎn)的總數(shù),其中多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng)。系統(tǒng)包括用于將多個(gè)基元排序的裝置。系統(tǒng)包括用于以至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)的方式構(gòu)建層次樹的裝置。系統(tǒng)還包括用于與層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)的裝置。也就是說,與層次樹的一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)的各自的祖先節(jié)點(diǎn)一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。
[0010]在一個(gè)實(shí)施例中,公開了具有用于使計(jì)算機(jī)系統(tǒng)執(zhí)行用于根據(jù)二叉樹構(gòu)造層次包圍體的方法的計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。方法包括提供二叉樹,該二叉樹包括多個(gè)葉節(jié)點(diǎn)和多個(gè)內(nèi)部節(jié)點(diǎn)。多個(gè)內(nèi)部節(jié)點(diǎn)的每個(gè)唯一地與2個(gè)子節(jié)點(diǎn)相關(guān)聯(lián),其中每個(gè)子節(jié)點(diǎn)包括內(nèi)部節(jié)點(diǎn)或葉節(jié)點(diǎn)。方法還包括通過從多個(gè)葉節(jié)點(diǎn)朝向根節(jié)點(diǎn)向上遍歷二叉樹,確定多個(gè)包圍體用于二叉樹中的節(jié)點(diǎn),其中每個(gè)父節(jié)點(diǎn)由稍后到達(dá)的相對(duì)應(yīng)的子節(jié)點(diǎn)處理一次。
[0011]在另一個(gè)實(shí)施例中,公開了系統(tǒng)用于根據(jù)層次樹結(jié)構(gòu)構(gòu)建層次包圍體。系統(tǒng)包括層次樹生成器用于構(gòu)建包括多個(gè)葉節(jié)點(diǎn)和多個(gè)內(nèi)部節(jié)點(diǎn)的二叉樹。多個(gè)內(nèi)部節(jié)點(diǎn)的每個(gè)唯一地與2個(gè)子節(jié)點(diǎn)相關(guān)聯(lián),其中每個(gè)子節(jié)點(diǎn)包括內(nèi)部節(jié)點(diǎn)或葉節(jié)點(diǎn)。系統(tǒng)還包括關(guān)系模塊用于生成父指針用于二叉樹中的每個(gè)節(jié)點(diǎn)。也就是說,當(dāng)構(gòu)建二叉樹時(shí),還生成從各自的子節(jié)點(diǎn)指向父節(jié)點(diǎn)的父指針。系統(tǒng)還包括調(diào)度器用于選擇一個(gè)或多個(gè)葉節(jié)點(diǎn)用于由多個(gè)線程并行地處理。葉節(jié)點(diǎn)與路徑相關(guān)聯(lián)用于確定包圍體,其中路徑在葉節(jié)點(diǎn)處開始并且向上穿過二叉樹穿過相關(guān)聯(lián)的并相對(duì)應(yīng)的父節(jié)點(diǎn)繼續(xù)。系統(tǒng)還包括包圍體生成器用于通過從多個(gè)葉節(jié)點(diǎn)朝向根節(jié)點(diǎn)向上遍歷二叉樹來確定多個(gè)包圍體用于二叉樹中的節(jié)點(diǎn),其中每個(gè)父節(jié)點(diǎn)由稍后到達(dá)的相對(duì)應(yīng)的子節(jié)點(diǎn)處理一次。系統(tǒng)還包括父節(jié)點(diǎn)遍歷器用于在第一線程上從第一子節(jié)點(diǎn)原子地遍歷到第一父節(jié)點(diǎn),其中所述第一父節(jié)點(diǎn)與所述第一子節(jié)點(diǎn)和第二子節(jié)點(diǎn)相關(guān)聯(lián)。系統(tǒng)還包括與父節(jié)點(diǎn)相關(guān)聯(lián)的計(jì)數(shù)器用于確定第一父節(jié)點(diǎn)之前是否已在第二線程上由第二子節(jié)點(diǎn)所遍歷到。包圍體生成器配置為當(dāng)?shù)谝桓腹?jié)點(diǎn)先前已在第二線程上由第二子節(jié)點(diǎn)所遍歷到時(shí),確定父包圍體用于使用第一線程的第一父節(jié)點(diǎn)。
[0012]在閱讀接下來以各種圖示所示出的實(shí)施例的詳細(xì)描述后,本領(lǐng)域的普通技術(shù)人員將認(rèn)識(shí)到本公開的各種實(shí)施例的這些和其他對(duì)象和優(yōu)點(diǎn)。
【專利附圖】
【附圖說明】
[0013]附圖被包含在本說明書中并形成本說明書的一部分,并且其中同樣的數(shù)字描繪同樣的元素,附圖示出了本公開的實(shí)施例,并且與描述一起意圖解釋本公開的原理。
[0014]圖1描繪了根據(jù)本公開的一個(gè)實(shí)施例的、適合用于實(shí)現(xiàn)本方法的示例性計(jì)算機(jī)系統(tǒng)的框圖。
[0015]圖2是根據(jù)本公開的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造層次樹的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖。
[0016]圖3是根據(jù)本公開的一個(gè)實(shí)施例的、在基數(shù)樹的構(gòu)造期間所使用的有序二叉基數(shù)樹(binary radix tree)的圖。
[0017]圖4是根據(jù)本公開的一個(gè)實(shí)施例的、在圖3中首先提出的、用于二叉基數(shù)樹的節(jié)點(diǎn)層次布局的圖。
[0018]圖5是根據(jù)本公開的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造二叉基數(shù)樹的方法的流程圖。
[0019]圖6是根據(jù)本公開的一個(gè)實(shí)施例的、用于構(gòu)造二叉基數(shù)樹的偽代碼的示圖。
[0020]圖7是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、配置為構(gòu)造BVH的系統(tǒng)的框圖。
[0021]圖8是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造BVH的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖。
[0022]圖9是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造BVH的、其中由稍后到達(dá)的子節(jié)點(diǎn)處理內(nèi)部的父節(jié)點(diǎn)的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖900。
【具體實(shí)施方式】
[0023]現(xiàn)在將對(duì)本公開的各種實(shí)施例進(jìn)行詳細(xì)參考,其示例在附圖中示出。雖然結(jié)合這些實(shí)施例加以描述,但應(yīng)理解其并不意圖將本公開限定于這些實(shí)施例。相反,本公開意在涵蓋可包括在如所附的權(quán)利要求所定義的本公開的精神和范圍內(nèi)的替代、修改以及等同物。此外,在本公開接下來的詳細(xì)描述中,闡述了大量具體細(xì)節(jié)以提供對(duì)本公開的徹底理解。然而,應(yīng)理解的是本公開可在沒有這些具體細(xì)節(jié)的情況下加以實(shí)施。在其他實(shí)例中,未詳細(xì)描述公知的方法、過程、部件和電路以避免對(duì)本公開的各方面內(nèi)容造成不必要的混淆。
[0024]注釋和命名法
[0025]接下來的部分詳細(xì)描述以過程、邏輯塊、處理以及對(duì)計(jì)算機(jī)存儲(chǔ)器內(nèi)的數(shù)據(jù)位的操作的其他象征性表示來提出。這些描述和表示是由數(shù)據(jù)處理領(lǐng)域技術(shù)人員用來向本領(lǐng)域的其他技術(shù)人員最有效地傳達(dá)他們工作的實(shí)質(zhì)所使用的手段。在本申請(qǐng)中,過程、邏輯塊、處理等等,被設(shè)想為得出期望結(jié)果的步驟或指令的自洽序列。步驟利用物理量的物理操縱。通常,盡管不是必要地,這些量采用能在計(jì)算機(jī)系統(tǒng)中被存儲(chǔ)、轉(zhuǎn)移、組合、比較和另外操縱的電或磁信號(hào)的形式。已經(jīng)證明,主要是出于共同使用的原因,將這些信號(hào)稱為事務(wù)、位、值、元素、符號(hào)、字符、樣本、像素等等有時(shí)是方便的。
[0026]然而,要牢記的是,所有的這些和類似的術(shù)語都要與適當(dāng)?shù)奈锢砹肯嚓P(guān)聯(lián),且僅僅是應(yīng)用于這些量的便捷標(biāo)簽。除非特別聲明,否則在下面的論述中很明顯,應(yīng)意識(shí)到貫穿本公開,利用術(shù)語諸如“排序”、“確定”、“構(gòu)建”、“指派”等等的討論,指的是計(jì)算機(jī)系統(tǒng)或類似的電子計(jì)算設(shè)備或處理器(如圖1的系統(tǒng)100)的動(dòng)作與處理(分別如圖2和5的流程圖200和500)。計(jì)算機(jī)系統(tǒng)或類似的電子計(jì)算設(shè)備對(duì)計(jì)算機(jī)系統(tǒng)存儲(chǔ)器、寄存器或其他這類信息存儲(chǔ)、傳輸或顯示設(shè)備內(nèi)以物理(電子)量表示的數(shù)據(jù)進(jìn)行操縱和轉(zhuǎn)換。
[0027]圖2是根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理數(shù)據(jù)的計(jì)算機(jī)實(shí)現(xiàn)的方法的示例的流程圖。雖然在流程圖中公開了具體步驟,但這種步驟是示例性的。也就是說,本發(fā)明的實(shí)施例非常適合于實(shí)施流程圖中列舉的各種其他步驟或步驟的變化。
[0028]圍繞基于硬件的、配置為用于監(jiān)視和執(zhí)行指令的部件討論了本發(fā)明的本文所描述的實(shí)施例。也就是說,本發(fā)明的實(shí)施例在微架構(gòu)的硬件設(shè)備內(nèi)實(shí)現(xiàn),并配置為用于監(jiān)視重要停滯情況以及實(shí)施適當(dāng)?shù)臅r(shí)鐘門控用于電源管理目的。
[0029]本文描述的其他實(shí)施例可一般圍繞著存在于某形式的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)可執(zhí)行指令加以討論,諸如由一臺(tái)或多臺(tái)計(jì)算機(jī)或其他設(shè)備執(zhí)行的程序模塊。以示例的方式但非限制,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括非暫時(shí)性計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。通常,程序模塊包括例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等,其執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。程序模塊的功能可以在各種實(shí)施例按照期望加以組合或分布。
[0030]計(jì)算機(jī)存儲(chǔ)介質(zhì)包括易失性和非易失性、可移動(dòng)的和不可移動(dòng)的以任意方法或技術(shù)實(shí)現(xiàn)的介質(zhì),用于存儲(chǔ)信息諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、電可擦可編程ROM(EEPR0M)、閃速存儲(chǔ)器或其他存儲(chǔ)器技術(shù)、壓縮光盤ROM (⑶-ROM)、數(shù)字多用盤(DVD)或其他光學(xué)存儲(chǔ)、盒式磁帶、磁帶、磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備、或任意其他可用來存儲(chǔ)期望信息并可訪問以檢索信息的介質(zhì)。
[0031]通信介質(zhì)可體現(xiàn)計(jì)算機(jī)可執(zhí)行指令、數(shù)據(jù)結(jié)構(gòu)及程序模塊,并包括任意信息遞送介質(zhì)。以示例的方式而非限制,通信介質(zhì)包括有線介質(zhì)諸如有線網(wǎng)絡(luò)或直接有線連接,以及無線介質(zhì)諸如聲、射頻(RF)、紅外及其他無線介質(zhì)。以上的任意組合也可包括在計(jì)算機(jī)可讀介質(zhì)范圍內(nèi)。
[0032]圖1是能夠?qū)崿F(xiàn)本公開的實(shí)施例的計(jì)算系統(tǒng)100的示例的框圖。計(jì)算系統(tǒng)100廣泛地表示能夠執(zhí)行計(jì)算機(jī)可讀指令的任意單或多處理器計(jì)算設(shè)備或系統(tǒng)。計(jì)算系統(tǒng)100的示例包括但不限于,工作站、膝上型計(jì)算機(jī)、客戶端終端、服務(wù)器、分布式計(jì)算系統(tǒng)、手持設(shè)備或任意其他計(jì)算系統(tǒng)或設(shè)備。在其最基本配置中,計(jì)算系統(tǒng)100可包括至少一個(gè)處理器110以及系統(tǒng)存儲(chǔ)器140。
[0033]中央處理單元(CPU) 110和圖形處理單元(GPU) 120均耦連到存儲(chǔ)器140。系統(tǒng)存儲(chǔ)器140總地表示能夠存儲(chǔ)數(shù)據(jù)和/或其他計(jì)算機(jī)可讀指令的任意類型或形式的易失性或非易失性存儲(chǔ)設(shè)備或介質(zhì)。系統(tǒng)存儲(chǔ)器140的示例包括但不限于,RAM、ROM、閃速存儲(chǔ)器或任意其他合適的存儲(chǔ)器設(shè)備。在圖1的示例中,存儲(chǔ)器140是共享存儲(chǔ)器,存儲(chǔ)器靠其存儲(chǔ)指令和數(shù)據(jù)用于CPUl 10和GPU120??商娲兀梢苑謩e有專用于CPUl 10和GPU120的分開的存儲(chǔ)器。存儲(chǔ)器可包括幀緩沖區(qū)用于存儲(chǔ)驅(qū)動(dòng)顯示屏130的像素?cái)?shù)據(jù)。
[0034]系統(tǒng)100包括用戶接口 160,在一個(gè)實(shí)現(xiàn)方案中,該用戶接口包括屏上光標(biāo)控制設(shè)備。用戶接口可包括鍵盤、鼠標(biāo)和/或觸摸屏設(shè)備(觸摸板)。
[0035]CPUllO和/或GPU120總地表示能夠處理數(shù)據(jù)或翻譯和執(zhí)行指令的任意類型或形式的處理單元。在某些實(shí)施例中,處理器110和/或120可從軟件應(yīng)用或硬件模塊接收指令。這些指令可使處理器110和/或120實(shí)施本文所描述和/或所示出的一個(gè)或多個(gè)示范性實(shí)施例的功能。例如,處理器110和/或120可單獨(dú)地或與其他元件組合地實(shí)施監(jiān)視、確定、選通以及檢測(cè)或本文所描述的等等中的一個(gè)或多個(gè)和/或是用于單獨(dú)地或與其他元件組合地實(shí)施上述操作的裝置。處理器110和/或120還可實(shí)施本文所描述的和/或所示出的任意其他步驟、方法或過程和/或是用于實(shí)施本文所描述的和/或所示出的任意其他步驟、方法或過程的裝置。
[0036]在一些實(shí)施例中,可將包括計(jì)算機(jī)程序的計(jì)算機(jī)可讀介質(zhì)加載到計(jì)算系統(tǒng)100。存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上的計(jì)算機(jī)程序的所有或一部分可隨后存儲(chǔ)在系統(tǒng)存儲(chǔ)器140和/或存儲(chǔ)設(shè)備的各部分中。當(dāng)由處理器110和/或120所執(zhí)行時(shí),被加載到計(jì)算系統(tǒng)100的計(jì)算機(jī)程序可使處理器110和/或120實(shí)施本文所描述的和/或所示出的示范性實(shí)施例的功能和/或是用于實(shí)施上述功能的裝置。附加地或可替代地,可在固件和/或硬件中實(shí)現(xiàn)本文所描述的和/或所示出的示范性實(shí)施例。
[0037]3D加速結(jié)構(gòu)的并行構(gòu)造
[0038]圖2是根據(jù)本公開的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造層次樹的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖200。在其他實(shí)施例中,流程圖200在包括處理器和耦連到該處理器的存儲(chǔ)器的計(jì)算機(jī)系統(tǒng)中實(shí)現(xiàn),該存儲(chǔ)器具有存儲(chǔ)在其中的指令,該指令如果由計(jì)算機(jī)系統(tǒng)所執(zhí)行那么使系統(tǒng)執(zhí)行用于并行地構(gòu)造層次樹的方法。在又一個(gè)實(shí)施例中,用于實(shí)施方法的指令存儲(chǔ)在具有計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上,該計(jì)算機(jī)可執(zhí)行指令用于使計(jì)算機(jī)系統(tǒng)實(shí)施用于并行地構(gòu)造層次樹的方法。在流程圖200中所概括的方法可由圖1的計(jì)算機(jī)系統(tǒng)100的一個(gè)或多個(gè)部件實(shí)現(xiàn)。
[0039]在實(shí)踐中,層次樹用于圖形中的實(shí)例以加速路徑跟蹤、實(shí)時(shí)射線追蹤、碰撞檢測(cè)、光子映射、基于體素的場(chǎng)景表示等。在實(shí)施例中,以并行方式快速地構(gòu)造樹。也就是說,在本發(fā)明的實(shí)施例中,從開始并行地處理層次樹的所有層級(jí)是可能的。這避免了未充分利用,以及使性能與GPU的大小成線性比例。
[0040]為了清楚起見,圍繞構(gòu)建層次包圍體或BVH描述了圖2的方法,但該方法也適合于構(gòu)建基于指針的八叉樹以及k-d樹。
[0041]在210,方法包括確定多個(gè)基元。該多個(gè)是相關(guān)聯(lián)的以及包括被索引化的基元節(jié)點(diǎn)的總數(shù)。多個(gè)基元與正在生成的層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng)。
[0042]在一個(gè)實(shí)施例中,為多個(gè)基元的每個(gè)指派莫頓碼(Morton code)。圍繞BVH,例如,通過查找基元的包圍盒的形心點(diǎn)、以及查看基元相對(duì)于場(chǎng)景包圍盒的位表示,生成莫頓碼用于每個(gè)基元。想法是擴(kuò)展每個(gè)坐標(biāo)的位,以及隨后將其交錯(cuò)以形成單個(gè)位串。
[0043]為繼續(xù)使用BVH的示例,由位串X0Y0Z0X1Y1Z1定義用于包含在三維(3D)單位立方體內(nèi)的給定點(diǎn)的莫頓碼,其中該點(diǎn)的X坐標(biāo)表示為:X0X1X2等,并且7和2坐標(biāo)類似??梢罁?jù)其軸對(duì)齊包圍盒(AABB)的形心來定義任意(arbitrary)3D基元的莫頓碼。在實(shí)踐中,在實(shí)施例中,可將莫頓碼限制到30或63位以將其分別存儲(chǔ)為32-位或64-位整數(shù)。
[0044]在220,方法包括根據(jù)其莫頓碼將多個(gè)基元排序。例如,在BVH的情況中,這沿著空間填充曲線排列它們,使得在3D中彼此相靠近的基元可能在所排序的序列中到達(dá)附近。
[0045]在230,方法包括至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)地構(gòu)建層次樹。也就是說,在本發(fā)明的實(shí)施例中,以僅要求關(guān)于輸入基元的數(shù)目成線性數(shù)量的存儲(chǔ)器的方式構(gòu)建層次樹。另外,在一個(gè)實(shí)施例中并行地構(gòu)建或構(gòu)造層次樹。
[0046]在240,方法包括與層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建內(nèi)部節(jié)點(diǎn)。也就是說,與層次樹的一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)各自的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。這樣,在本發(fā)明的實(shí)施例中,與至少一個(gè)節(jié)點(diǎn)的祖先節(jié)點(diǎn)的至少一個(gè)并行地構(gòu)造該至少一個(gè)節(jié)點(diǎn)。
[0047]在本發(fā)明的實(shí)施例中,通過構(gòu)造二叉基數(shù)樹實(shí)施層次樹的構(gòu)造,二叉基數(shù)樹根據(jù)莫頓碼的集合所定義。例如,在BVH的情況中,生成了節(jié)點(diǎn)層次,其中每個(gè)子樹與線性范圍的所排序基元相對(duì)應(yīng)。在現(xiàn)有技術(shù)中,二叉樹通常用于將串?dāng)?shù)據(jù)索引化。在一個(gè)實(shí)施例中,輸入是基元的集合,或多個(gè)定義葉節(jié)點(diǎn)的基元。在本實(shí)施例中,輸入是所排序的莫頓碼。進(jìn)一步地,二叉基數(shù)樹包括基元節(jié)點(diǎn)和一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)。每個(gè)內(nèi)部節(jié)點(diǎn)與由在各自的子樹中的相對(duì)應(yīng)基兀節(jié)點(diǎn)的基兀所共孚的最長(zhǎng)公共如綴相對(duì)應(yīng)。
[0048]圖3是根據(jù)本公開的一個(gè)實(shí)施例的二叉基數(shù)樹300的圖。具體地,基數(shù)樹300是包括具有索引數(shù)字“0-7”的8個(gè)葉節(jié)點(diǎn)的有序二叉基數(shù)樹。葉節(jié)點(diǎn)以辭典編纂的次序存儲(chǔ)5-位鍵值(key)的集合?;娜~節(jié)點(diǎn)示出為包括5-位,這用于說明目的,但可以是任意長(zhǎng)度,如先前所描述。內(nèi)部節(jié)點(diǎn)表示其公共前綴。進(jìn)一步地,每個(gè)內(nèi)部節(jié)點(diǎn)覆蓋線性范圍的鍵值,根據(jù)其第一不同位分區(qū)為2個(gè)子范圍,下文將參考圖4加以描述。
[0049]具體地,給定表示為位串的n個(gè)鍵值的集合,二叉基數(shù)樹(也稱Patricia樹)是其公共前綴的層次表示。由葉節(jié)點(diǎn)表示鍵值,并且每個(gè)內(nèi)部節(jié)點(diǎn)與由其各自的子樹中的鍵值所共享的最長(zhǎng)公共前綴相對(duì)應(yīng),如圖3所示。
[0050]與包含用于每個(gè)公共前綴的一個(gè)內(nèi)部節(jié)點(diǎn)的前綴樹相比較,基數(shù)樹用僅一個(gè)孩子省略節(jié)點(diǎn),在這個(gè)意義上來說其是緊湊的。因此,具有n個(gè)葉節(jié)點(diǎn)的每個(gè)二叉基數(shù)樹準(zhǔn)確地包含n-1個(gè)內(nèi)部節(jié)點(diǎn),如圖3所示。在一個(gè)實(shí)施例中,子節(jié)點(diǎn)是葉節(jié)點(diǎn)。在一個(gè)實(shí)施例中,二重鍵值要求特別的關(guān)注。
[0051]更具體地,在一個(gè)實(shí)施例中,僅考慮有序的樹,其中每個(gè)節(jié)點(diǎn)的孩子、以及因此葉節(jié)點(diǎn)是按詞典編篡的次序。這等同于要求鍵值的序列被排序,使由每個(gè)節(jié)點(diǎn)所覆蓋的鍵值能夠表示為線性范圍[i,j]。使用8 (i, j)來表示在鍵值匕和1 之間的最長(zhǎng)公共前綴的長(zhǎng)度,排列意味著對(duì)于任意i’,j’ G [i, j]有s a’,j’)> s (i, j)。通過比較給定節(jié)點(diǎn)的第一和最后的鍵值確定與給定節(jié)點(diǎn)相對(duì)應(yīng)的前綴,其中保證其他鍵值共享相同前綴。
[0052]實(shí)際上,每個(gè)內(nèi)部節(jié)點(diǎn)根據(jù)其鍵值的第一不同位,即跟隨8 (i, j)的一個(gè)將其鍵值分區(qū)。該位對(duì)于從h開始的某數(shù)目的鍵值是0并且對(duì)于剩余的直到h為止的那些是I。位是0的最后鍵值的索引被標(biāo)記為“分離位置”,由Y G所表示。由于位對(duì)于kY是0以及對(duì)于kY+1是1,分離位置必須滿足S (Y ; y+l)=6 (i,j)。作為結(jié)果的子范圍由[i, y]和[Y+1,j]給出,以及進(jìn)一步分別由左和右子節(jié)點(diǎn)所分區(qū)。
[0053]如圖3所示,根與全范圍的鍵值[0;7]相對(duì)應(yīng)。由于匕和匕在其第一位不同,范圍在Y =3處分離,導(dǎo)致子范圍[0,3]和[4,7]。左孩子進(jìn)一步基于第三位將[0,3]在Y=I處分離,右孩子基于第二位將[4,7]在y=4處分離。
[0054]圖4和5是示出了隨后用來構(gòu)造諸如BVH、八叉樹、k-d樹等的二級(jí)樹的二叉基數(shù)樹的構(gòu)造的圖。具體地,根據(jù)本公開的實(shí)施例,圖4是用于在圖3中首先提出的二叉基數(shù)樹的節(jié)點(diǎn)層次布局的圖,以及圖5是示出了用于并行地構(gòu)造二叉基數(shù)樹的方法的流程圖。
[0055]圖4是根據(jù)本公開的一個(gè)實(shí)施例的、在圖3中首先提出的有序二叉基數(shù)樹400的圖,其中葉節(jié)點(diǎn)被編號(hào)為“0-7”并且與以詞典編篡的次序所排序的5-位鍵值(例如莫頓碼)的集合相關(guān)聯(lián)。例如,葉節(jié)點(diǎn)“I”與5-位莫頓碼“0-0-0-1-0”相關(guān)聯(lián)以及葉節(jié)點(diǎn)“2”與5-位莫頓碼“O-O-1-O-O ”相關(guān)聯(lián)。
[0056]如圖4所示,為了使能二叉基數(shù)樹400的并行構(gòu)造,通過圖4中所示的布局,在內(nèi)部節(jié)點(diǎn)索引410和(葉節(jié)點(diǎn)的)基元索引420之間建立連接。也就是說,在某種程度上指派內(nèi)部節(jié)點(diǎn)的索引以使能不用依靠較早的結(jié)果來查找其孩子。具體地,如圖4所示,每個(gè)內(nèi)部節(jié)點(diǎn)已被指派“0-6”之間的索引,并且與相同索引的葉節(jié)點(diǎn)水平地對(duì)齊。例如,內(nèi)部節(jié)點(diǎn)索引3440與葉節(jié)點(diǎn)或基元索引3450水平地對(duì)齊。
[0057]并且,由每個(gè)內(nèi)部節(jié)點(diǎn)所覆蓋的鍵值(例如葉節(jié)點(diǎn))的范圍由水平條以及分離位置所指示,分離位置對(duì)應(yīng)于由圓所指示的鍵值之間不同的第一位。例如,內(nèi)部節(jié)點(diǎn)索引“3”440與包括葉節(jié)點(diǎn)“0-3”的范圍445 (由水平條所示)相關(guān)聯(lián)。分離位置由圓447所示,以及指示最高不同位在葉節(jié)點(diǎn)索引“I” 460和“2”470之間。
[0058]出于清楚和說明目的起見,葉節(jié)點(diǎn)和內(nèi)部節(jié)點(diǎn)分別存儲(chǔ)于2個(gè)分開的陣列L和I中。定義了圖4中的節(jié)點(diǎn)布局,以便根節(jié)點(diǎn)430位于Itl,并且其孩子以及任意內(nèi)部節(jié)點(diǎn)的孩子的索引根據(jù)其各自的分離位置加以指派,將參考圖5更完全地加以描述。例如,如果左孩子覆蓋超過一個(gè)鍵值那么其位于Iy,或如果其是葉那么位于Ly。類似地,右孩子位于IY+1或IY+1,如圖4所示。
[0059]圖4所示的節(jié)點(diǎn)布局的重要性質(zhì)是屬于每個(gè)內(nèi)部節(jié)點(diǎn)的基元索引的范圍包括其第一基元或葉節(jié)點(diǎn)、或其最后基元或葉節(jié)點(diǎn)并與之相一致。并且,根節(jié)點(diǎn)“0”430位于其范圍[0;n-l]的開始,使得任意內(nèi)部節(jié)點(diǎn)的左孩子位于其位置[i,y]的結(jié)尾,以及右孩子位于其范圍U+l;j]的開始。
[0060]圖5是根據(jù)本公開的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造二叉基數(shù)樹的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖500。在另一個(gè)實(shí)施例中,流程圖500在包括處理器和耦連到該處理器的存儲(chǔ)器的計(jì)算機(jī)系統(tǒng)內(nèi)實(shí)現(xiàn),該存儲(chǔ)器具有存儲(chǔ)在其中的指令,該指令如果由計(jì)算機(jī)系統(tǒng)所執(zhí)行那么使該系統(tǒng)執(zhí)行用于并行地構(gòu)造層次樹的方法。在又一個(gè)實(shí)施例中,用于實(shí)施方法的指令存儲(chǔ)在具有計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上,該計(jì)算機(jī)可執(zhí)行指令用于使計(jì)算機(jī)系統(tǒng)實(shí)施用于并行地構(gòu)造層次樹的方法。在流程圖500中所概括的方法可由圖1的計(jì)算機(jī)系統(tǒng)100的一個(gè)或多個(gè)部件實(shí)現(xiàn)。
[0061]在一個(gè)實(shí)施例中,圖5中所概括的方法在圖2的230中所概括的過程上擴(kuò)展以構(gòu)建層次樹。具體地,通過分區(qū)基元或葉節(jié)點(diǎn)生成節(jié)點(diǎn)層次。在一個(gè)實(shí)施例中,通過構(gòu)造根據(jù)表示葉節(jié)點(diǎn)的莫頓碼的集合所定義的基數(shù)樹實(shí)施分區(qū)。更具體地,通過穿過圖3和4中所示的樹布局在內(nèi)部節(jié)點(diǎn)索引和葉節(jié)點(diǎn)的基元索弓I之間建立連接來實(shí)施節(jié)點(diǎn)層次的并行構(gòu)造。也就是說,以使能不用依靠較早的結(jié)果來查找其子節(jié)點(diǎn)的方式指派用于內(nèi)部節(jié)點(diǎn)的索弓I。通過該方式,沒有同步在節(jié)點(diǎn)層次的層之間實(shí)施。并且,通過該方式,與層次樹的一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)各自的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建該內(nèi)部節(jié)點(diǎn)。
[0062]具體地,為了構(gòu)造二叉基數(shù)樹,圖5中所概括的過程確定由每個(gè)內(nèi)部節(jié)點(diǎn)所覆蓋的鍵值的范圍,并且確定每個(gè)內(nèi)部節(jié)點(diǎn)的孩子(因?yàn)檫@是二叉基數(shù)樹所以是2個(gè))。由于屬于每個(gè)內(nèi)部節(jié)點(diǎn)的基元索引的范圍包括其第一基元或葉節(jié)點(diǎn)、或其最后基元或葉節(jié)點(diǎn)以及與之均相一致,如上文所述,所以確定了范圍的一個(gè)結(jié)尾。通過觀察鄰居基元索引確定范圍的另一個(gè)結(jié)尾。在那之后,通過借助例如如圖4中所示出的節(jié)點(diǎn)布局查找分離位置可隨后標(biāo)識(shí)孩子,如下文所進(jìn)一步描述的。
[0063]在一個(gè)實(shí)施例中,使用圖6中所示出的偽代碼600實(shí)施了圖5中所概括的過程,其中偽代碼600構(gòu)造二叉基數(shù)樹。出于簡(jiǎn)便起見,在偽代碼600中,當(dāng)j篆[0,n-l]時(shí),8 (i,j)=_l。更具體地,在一個(gè)實(shí)施例中,并行地處理每個(gè)內(nèi)部節(jié)點(diǎn)Ii。
[0064]在510,圖5的方法包括,對(duì)于與內(nèi)部節(jié)點(diǎn)相對(duì)應(yīng)的給定的節(jié)點(diǎn)索弓丨,基于節(jié)點(diǎn)索引確定多個(gè)基元的基元索引的對(duì)應(yīng)范圍的方向。在基數(shù)樹內(nèi),每個(gè)內(nèi)部節(jié)點(diǎn)屬于基元索引的范圍。更具體地,在所指派的索引的內(nèi)部節(jié)點(diǎn)和具有相同索引號(hào)的基元索引之間存在關(guān)系。具體地,具有相同索引號(hào)的基元索引被包括在基元索引的對(duì)應(yīng)范圍中。進(jìn)一步地,給定的節(jié)點(diǎn)索引包括在對(duì)應(yīng)范圍中的開始的基元索引或結(jié)尾的基元索引。
[0065]具體地,根據(jù)鄰居基元索引確定范圍的方向。也就是說,通過觀察鄰居鍵值kh、H確定范圍的“方向”。方向由d表示,以便d=+l指示范圍在i開始,以及d=-l指示范圍在i結(jié)尾。因?yàn)槊總€(gè)內(nèi)部節(jié)點(diǎn)覆蓋至少2個(gè)鍵值,h和ki+d必須屬于Ii_d,這作為圖5的樹結(jié)構(gòu)的性質(zhì)得到確定。另外,因?yàn)樾值芸偸俏挥诒舜讼噜彽奈恢茫訧vd屬于兄弟節(jié)點(diǎn)Ih,這作為圖5的樹結(jié)構(gòu)的性質(zhì)得到確定。
[0066]更具體地,基于哪個(gè)鄰居基元具有最多的索引匹配確定范圍的方向。例如,在圖4中,用于內(nèi)部節(jié)點(diǎn)索引或“3”440的范圍以基元索引或葉節(jié)點(diǎn)“3”450開始或結(jié)尾。通過將諸如基元索引“2”470和基元索引“4”480的鄰居索引或葉節(jié)點(diǎn)與具有和內(nèi)部節(jié)點(diǎn)相同的索引的基元索引(例如基元索引“3”450)相比較來確定方向。這樣,基元索引“2”470具有“0-0-1-0-0”的莫頓碼序列,基元索引“3”450具有“0-0-1-0-1”的莫頓碼序列,以及基元索弓丨“4”具有“1-0-0-1-1”的莫頓碼序列。具有對(duì)基元索引“3”450的最多的匹配的基元索引是基元索引“2” 470。這樣,范圍445的方向向左以包括基元索引“2” 470,使得范圍445包括基元索引“0-3”。
[0067]例如,在偽代碼600的行2-3確定方向。也就是說,屬于Ii的鍵值共享必須與由定義的兄弟中的一個(gè)不同的公共前綴。這意味著用于前綴長(zhǎng)度的下界由Smin=S (i,1-d)給定,使得對(duì)于任意屬于Ii的kj有5 (i, j) > 6 minD通過將5 (i, 1-1)與5 (i, i+1)相比較來滿足該條件,并且選擇S使得8 (i,i+d)與較大的一個(gè)相對(duì)應(yīng),如偽代碼600的行3中所
/Jn o
[0068]在520,方法包括確定對(duì)應(yīng)范圍的長(zhǎng)度。更具體地,在實(shí)施例中,確定最大值或上界用于長(zhǎng)度。另外,在實(shí)施例中,通過實(shí)施二分搜索確定用于長(zhǎng)度的實(shí)際值。具體地,通過搜索滿足S (i,i+ld)>Smin的最大I確定范圍的其他結(jié)尾,如偽代碼600中所提供的。在一個(gè)實(shí)施例中,通過從值“2”開始并以指數(shù)方式增加值直到其不再滿足不等式為止來確定用于長(zhǎng)度的二的次方的上界1_>1,如偽代碼600的行6-8中所示。一旦確定上界,就在范圍[0; Ifflax-1]中使用二分搜索來確定長(zhǎng)度“I”。想法是依次考慮I的每個(gè)位,從最高的一個(gè)開始,以及將其設(shè)置為I除非新值無法滿足不等式,如偽代碼600的行10-13中所示。隨后由j=i+ld給定范圍的其他結(jié)尾。
[0069]在530,出于確定子索引用于與內(nèi)部節(jié)點(diǎn)相對(duì)應(yīng)的給定的索引的目的,方法包括確定對(duì)應(yīng)范圍中的基元索引之間的最高不同位。例如,在偽代碼600中,5 (i, j)表示與Ii相對(duì)應(yīng)的前綴的長(zhǎng)度,由Sntjd6K標(biāo)記。這是用來通過實(shí)施對(duì)滿足8 (i,i+sd)> Sntjd6的最大SG [0;1-1]的類似的二分搜索來查找分離位置Y,如偽代碼600的行17-20所示。如果d=+l,那么Y由i+sd給定,因?yàn)檫@是屬于左孩子的最高索引。如果d=-l,那么值減去值I以解釋反向索引。
[0070]例如,分離位置用于圖4的內(nèi)部節(jié)點(diǎn)“43”440。如所示,范圍445的基元索引“0_3”之間的最高不同位在基元索引“1”460和“2”470之間。也就是說,基元索引“I” 460具有“0-0-0-1-0”的莫頓碼序列以及基元索引“2”470具有“0-0-1-0-0”的莫頓碼序列。最高不同位發(fā)生在線490所示的第三位。
[0071]并且,在540,方法包括指派子節(jié)點(diǎn)索引用于和與上文所確定的最高不同位相關(guān)聯(lián)的基元索引相對(duì)應(yīng)的給定的節(jié)點(diǎn)索引。例如,在圖6的偽代碼600中,給定1、j和Y,Ii的孩子覆蓋范圍[min(i, j) ; Y ]和[Y +l;max(i; j)]。對(duì)于每個(gè)孩子,將其范圍的開始和結(jié)尾相比較以查看其是否是葉,以及隨后根據(jù)節(jié)點(diǎn)布局(例如圖4)涉及在索引Y或Y+1處的相對(duì)應(yīng)的節(jié)點(diǎn),如圖6的偽代碼600的行23-24中所示。
[0072]在一個(gè)實(shí)施例中,隨著單個(gè)內(nèi)核啟動(dòng),圖6的偽代碼600中所呈現(xiàn)的算法在GPU上實(shí)現(xiàn),其中每個(gè)線程負(fù)責(zé)一個(gè)內(nèi)部節(jié)點(diǎn)。假定鍵值的長(zhǎng)度固定,通過計(jì)算2個(gè)鍵值之間的邏輯的XOR和對(duì)作為結(jié)果的整數(shù)中的在前的(leading)零位進(jìn)行計(jì)數(shù)可有效地評(píng)估8 (i,j)。
[0073]在本發(fā)明的實(shí)施例中,圖1-6中所構(gòu)造的二叉基數(shù)樹用來構(gòu)造二級(jí)樹。在一個(gè)實(shí)施例中,根據(jù)本公開的一個(gè)實(shí)施例,根據(jù)二叉基數(shù)樹構(gòu)造了 BVH。具體地,按下列內(nèi)容構(gòu)造用于3D基元的集合的BVH: (I)根據(jù)其形心指派莫頓碼用于每個(gè)基元,(2)將莫頓碼排序,
(3)構(gòu)造二叉基數(shù)樹,以及(4)指派包圍盒用于每個(gè)內(nèi)部節(jié)點(diǎn)。
[0074]如果所有基元的莫頓碼是唯一的,那么應(yīng)注意的是二叉基數(shù)樹在結(jié)構(gòu)上與相對(duì)應(yīng)的線性BVH是同樣的一標(biāo)識(shí)莫頓碼之間的公共前綴等同于根據(jù)每個(gè)位遞歸地使基元成組(bucketing)。明確地處置復(fù)制莫頓碼的情況,因?yàn)閳D6的構(gòu)造算法依靠唯一的鍵值。在一個(gè)實(shí)施例中這通過用其索引的位表示來增擴(kuò)每個(gè)鍵值來完成,即k0i=ki_i,其中_指示字符串連接。在實(shí)踐中,不需要實(shí)際存 儲(chǔ)所增擴(kuò)的鍵值,因?yàn)楫?dāng)評(píng)估8 (i;j)時(shí)如果ki=k j那么其足以簡(jiǎn)單地使用i和j作為后備(fallback)。
[0075]依靠知悉位于每層級(jí)上的節(jié)點(diǎn)的集合是先驗(yàn)的的事實(shí),用于線性BVH的先前的方法以自底向上的方式順序地計(jì)算包圍盒。在一個(gè)實(shí)施例中,呈現(xiàn)了不同的方法,其中并行地處理從葉節(jié)點(diǎn)到根的路徑。每個(gè)線程從一個(gè)葉節(jié)點(diǎn)開始并使用在基數(shù)樹構(gòu)造期間記錄的父指針走上樹。線程被跟蹤以使用原子的計(jì)數(shù)器確定多少線程已訪問每個(gè)內(nèi)部節(jié)點(diǎn),使得當(dāng)?shù)诙€(gè)開始處理節(jié)點(diǎn)時(shí)第一個(gè)線程立即終止。這樣,每個(gè)節(jié)點(diǎn)精確地由一個(gè)線程所處理,導(dǎo)致O(H)時(shí)間復(fù)雜性。無論何時(shí)檢測(cè)到正由相同線程塊處理由給定的內(nèi)部節(jié)點(diǎn)所覆蓋的所有葉,可使用更快的共享存儲(chǔ)器原子減少全局原子的數(shù)目。
[0076]圖1-6中所構(gòu)造的二叉基數(shù)樹用來構(gòu)造諸如八叉樹的二級(jí)樹。為構(gòu)造八叉樹用于點(diǎn)的集合,給定的莫頓碼的每個(gè)3k-位前綴直接映射到在層級(jí)k的八叉樹節(jié)點(diǎn)。通過查看相對(duì)應(yīng)的二叉基數(shù)樹的邊緣,枚舉這些前綴,使得將具有長(zhǎng)度Sparait的前綴的父親與具有長(zhǎng)度S child的前綴的孩子相連接的邊緣表示長(zhǎng)度5 parent+l,...,6 child的所有子前綴。這些
之外,[Schild/3] — L5p?rm/3一可被3整除。在基數(shù)樹構(gòu)造期間評(píng)估這些計(jì)數(shù),以及隨后實(shí)施并行前綴求和以分配八叉樹節(jié)點(diǎn)。通過查看每個(gè)基數(shù)樹節(jié)點(diǎn)的直接祖先查找八叉樹節(jié)點(diǎn)的父未。
[0077]處理因此包括I個(gè)步驟:(I)計(jì)算用于點(diǎn)的莫頓碼,(2)將莫頓碼排序,(3)通過比較相鄰莫頓碼的每對(duì)來標(biāo)識(shí)復(fù)制物,即指出落入相同葉節(jié)點(diǎn)內(nèi)的點(diǎn),(4)使用并行縮并移除復(fù)制物,(5)構(gòu)造二叉基數(shù)樹,(6)實(shí)施并行前綴求和以分配八叉樹節(jié)點(diǎn),以及(7)查找每個(gè)節(jié)點(diǎn)的父親。
[0078]根據(jù)本公開的一個(gè)實(shí)施例,圖1-6中所構(gòu)造的二叉基數(shù)樹用來構(gòu)造諸如k-d樹的二級(jí)樹。在一個(gè)實(shí)施例中,由上文的步驟5所產(chǎn)生的基數(shù)樹可被直接地翻譯為在點(diǎn)上的k-d樹。每個(gè)內(nèi)部節(jié)點(diǎn)根據(jù)莫頓碼中在其公共前綴之后的下一個(gè)位將點(diǎn)分區(qū),等同于將其分類在3D中的軸對(duì)齊平面的一側(cè)。長(zhǎng)度8的前綴與垂直于第d主軸的平面相對(duì)應(yīng),其中d= 6 mod (取余)3。平面的位置由0.BdBd+3...BS_31給定,其中Bi表示前綴的第i個(gè)位。
[0079]構(gòu)造層次包圍體用于3D基元的集合
[0080]在本發(fā)明的一個(gè)實(shí)施例中,構(gòu)造了層次包圍體(BVH)用于三維(3D)基元的集合。在其他實(shí)施例中,基元可以是任意(arbitrary)維度(例如2D,4D等等)。在一個(gè)實(shí)現(xiàn)方案中,根據(jù)先前關(guān)于圖1-6所討論的基數(shù)樹構(gòu)造BVH。例如,層次包圍體用于將多個(gè)諸如三角形的3D基元索引化?;环纸M為節(jié)點(diǎn),以及每個(gè)節(jié)點(diǎn)存儲(chǔ)完全包含底層基元的包圍體。分層次地重復(fù)分組,以便根節(jié)點(diǎn)覆蓋整個(gè)場(chǎng)景。包圍體有助于諸如當(dāng)實(shí)施碰撞檢測(cè)或射線追蹤等時(shí)確定附加的信息。
[0081]在本發(fā)明的實(shí)施例中,包圍體完全包含意圖在體中所包含的基元的集合。在一個(gè)實(shí)現(xiàn)方案中,包圍體包括軸對(duì)齊包圍盒(AABB )。
[0082]圖7是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、配置為構(gòu)造BVH的系統(tǒng)700的框圖。具體地,系統(tǒng)700包括層次樹生成器710,配置為構(gòu)建包括多個(gè)葉節(jié)點(diǎn)和多個(gè)內(nèi)部節(jié)點(diǎn)的二叉樹。多個(gè)內(nèi)部節(jié)點(diǎn)的每個(gè)唯一地與2個(gè)子節(jié)點(diǎn)相關(guān)聯(lián),其中每個(gè)子節(jié)點(diǎn)包括內(nèi)部節(jié)點(diǎn)或葉節(jié)點(diǎn)。在一個(gè)實(shí)施例中,二叉樹是使用圖1-6中所先前描述的方法和系統(tǒng)所構(gòu)建的基數(shù)樹。在其他實(shí)施例中,二叉樹的任意種類適合于提供用于包圍體構(gòu)造的層次,諸如當(dāng)使用先前所構(gòu)建的二叉樹或?qū)哟斡糜谠诙鄠€(gè)場(chǎng)景上構(gòu)建多個(gè)層次包圍體時(shí)。
[0083]系統(tǒng)700還包括關(guān)系模塊720用于生成父指針用于二叉樹中的每個(gè)節(jié)點(diǎn)。也就是說,諸如從圖1-6的系統(tǒng)和方法所生成的先前所生成的二叉樹,為孩子提供關(guān)系和/或指針用于特定節(jié)點(diǎn)。關(guān)系模塊720將關(guān)系倒轉(zhuǎn)以便子節(jié)點(diǎn)與指向各自的父節(jié)點(diǎn)的父指針相關(guān)聯(lián)。通過該方式,當(dāng)使用自底向上遍歷方法構(gòu)建BVH時(shí)使用父指針。
[0084]系統(tǒng)700還包括包圍體生成器740用于確定多個(gè)包圍體用于二叉樹中的節(jié)點(diǎn)。更具體地,當(dāng)構(gòu)建二叉樹中的各自的節(jié)點(diǎn)的包圍體時(shí),從樹的多個(gè)葉節(jié)點(diǎn)朝向根節(jié)點(diǎn)向上遍歷二叉樹,使得并行地處理從葉節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑。并且,二叉樹中的每個(gè)父節(jié)點(diǎn)由源自相對(duì)應(yīng)的子節(jié)點(diǎn)的稍后到達(dá)的線程處理一次。
[0085]在一個(gè)實(shí)施例中,系統(tǒng)700還包括調(diào)度器730用于選擇一個(gè)或多個(gè)葉節(jié)點(diǎn)用于由多個(gè)線程并行地處理。也就是說,當(dāng)構(gòu)建包圍體用于二叉樹的內(nèi)部節(jié)點(diǎn)時(shí),調(diào)度器730為由包圍體生成器740所使用的線程指派葉節(jié)點(diǎn)。例如,調(diào)度器730確定為哪個(gè)線程指派二叉樹的哪個(gè)節(jié)點(diǎn),更具體地,指派哪個(gè)葉節(jié)點(diǎn),用于構(gòu)建這些葉節(jié)點(diǎn)的包圍體,以及用于隨后的父節(jié)點(diǎn)。在一個(gè)實(shí)施例中,調(diào)度器被包括在處理核心和/或包括圖形處理單元(GPU)的線程內(nèi)或支持上述內(nèi)容。
[0086]圖8是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造BVH的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖800。在另一個(gè)實(shí)施例中,流程圖800在包括處理器和耦連到該處理器的存儲(chǔ)器的計(jì)算機(jī)系統(tǒng)內(nèi)實(shí)現(xiàn),該存儲(chǔ)器具有存儲(chǔ)在其中的指令,該指令如果由計(jì)算機(jī)系統(tǒng)所執(zhí)行那么使系統(tǒng)執(zhí)行用于并行地構(gòu)造BVH的方法。在又一個(gè)實(shí)施例中,用于實(shí)施用于并行地構(gòu)造BVH的方法的指令存儲(chǔ)在具有計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上,該計(jì)算機(jī)可執(zhí)行指令用于使計(jì)算機(jī)系統(tǒng)實(shí)施用于并行地構(gòu)造BVH的方法。在流程圖中所概括的方法可由圖1和7的系統(tǒng)100和700的一個(gè)或多個(gè)部件實(shí)現(xiàn)。
[0087]在810,方法包括提供二叉樹。在一個(gè)實(shí)施例中,二叉樹是使用圖1-6的系統(tǒng)和方法構(gòu)造的基數(shù)樹。例如,至多要求關(guān)于基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)地構(gòu)建層次樹。也就是說,以僅要求關(guān)于輸入基元的數(shù)目成線性數(shù)量的存儲(chǔ)器的方式構(gòu)建層次樹。更具體地,二叉樹包括多個(gè)葉節(jié)點(diǎn)和多個(gè)內(nèi)部節(jié)點(diǎn)。內(nèi)部節(jié)點(diǎn)的每個(gè)唯一地與2個(gè)孩子相關(guān)聯(lián),其中每個(gè)子節(jié)點(diǎn)包括葉節(jié)點(diǎn)或另一個(gè)內(nèi)部節(jié)點(diǎn)。
[0088]在840,方法包括指派包圍盒用于每個(gè)內(nèi)部節(jié)點(diǎn)。生成用于每個(gè)節(jié)點(diǎn)的包圍體,以便其如在二叉樹中所建立的包含所有的底層基元。在一個(gè)實(shí)現(xiàn)方案中,通過從多個(gè)葉節(jié)點(diǎn)朝向根節(jié)點(diǎn)向上遍歷二叉樹,確定多個(gè)包圍體用于二叉樹中的節(jié)點(diǎn),其中并行地處理從多個(gè)葉節(jié)點(diǎn)到根節(jié)點(diǎn)的多個(gè)路徑。并且,每個(gè)父節(jié)點(diǎn)由源自相對(duì)應(yīng)的子節(jié)點(diǎn)的稍后到達(dá)的線程處理一次。
[0089]依靠知悉位于每級(jí)上的節(jié)點(diǎn)的集合是先驗(yàn)的的事實(shí),用于構(gòu)造線性BVH的先前的方法以自底向上的方式順序地計(jì)算包圍盒。也就是說,在確定用于下一層的包圍體之前,每層級(jí)計(jì)算完成。本發(fā)明的實(shí)施例采取不同的方法,其中并行地處理從葉節(jié)點(diǎn)到根的路徑。這是可能的,因?yàn)榧词刮粗っ總€(gè)節(jié)點(diǎn)在哪個(gè)層級(jí),但知悉節(jié)點(diǎn)之間的關(guān)系。這樣,每個(gè)線程從一個(gè)葉節(jié)點(diǎn)開始并使用在二叉樹構(gòu)造期間所確定、生成以及記錄的父指針走上樹。
[0090]在一個(gè)實(shí)施例中,確定父指針用于二叉樹中的每個(gè)節(jié)點(diǎn)。例如,當(dāng)構(gòu)建二叉樹時(shí),在內(nèi)部節(jié)點(diǎn)和其子節(jié)點(diǎn)的每個(gè)之間建立關(guān)系。也就是說,在二叉樹內(nèi),知悉子節(jié)點(diǎn)用于相對(duì)應(yīng)的父節(jié)點(diǎn)。這樣,倒轉(zhuǎn)關(guān)系是可確定的,使得對(duì)于每個(gè)節(jié)點(diǎn)(例如內(nèi)部或葉),相對(duì)應(yīng)的父節(jié)點(diǎn)是可確定的以及可指派的。在一個(gè)實(shí)現(xiàn)方案中,對(duì)于每個(gè)節(jié)點(diǎn),指派指向其父節(jié)點(diǎn)的相對(duì)應(yīng)的父指針。
[0091]在一個(gè)實(shí)施例中,確定用于葉節(jié)點(diǎn)的包圍體。在一個(gè)實(shí)施例中,在遍歷二叉樹之前,確定用于葉節(jié)點(diǎn)的包圍體。在另一個(gè)實(shí)施例中,當(dāng)線程出于確定葉節(jié)點(diǎn)的包圍體的目的拾起或被指派以處理該葉節(jié)點(diǎn)時(shí),確定用于該葉節(jié)點(diǎn)的包圍體。在一個(gè)實(shí)現(xiàn)方案中,基于與相對(duì)應(yīng)的葉節(jié)點(diǎn)或基元相關(guān)聯(lián)的三角形的頂點(diǎn),確定包圍體用于葉節(jié)點(diǎn)。
[0092]更具體地,圖9是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、示出了用于并行地構(gòu)造BVH的、其中由稍后到達(dá)的線程處理內(nèi)部的父節(jié)點(diǎn)的計(jì)算機(jī)實(shí)現(xiàn)的方法的流程圖900。在另一個(gè)實(shí)施例中,流程圖900在包括處理器和耦連到該處理器的存儲(chǔ)器的計(jì)算機(jī)系統(tǒng)內(nèi)實(shí)現(xiàn),該存儲(chǔ)器具有存儲(chǔ)在其中的指令,該指令如果由計(jì)算機(jī)系統(tǒng)所執(zhí)行那么使系統(tǒng)執(zhí)行用于并行地構(gòu)造BVH的方法,其中由稍后到達(dá)的子節(jié)點(diǎn)處理內(nèi)部的父節(jié)點(diǎn)。在又一個(gè)實(shí)施例中,用于實(shí)施用于并行地構(gòu)造BVH的方法的指令的指令存儲(chǔ)在具有計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上,其中由稍后到達(dá)的子節(jié)點(diǎn)處理內(nèi)部的父節(jié)點(diǎn),該計(jì)算機(jī)可執(zhí)行指令用于使計(jì)算機(jī)系統(tǒng)實(shí)施用于并行地構(gòu)造BVH的方法。在流程圖900中所概括的方法可由圖1和7的計(jì)算機(jī)系統(tǒng)100和700的一個(gè)或多個(gè)部件實(shí)現(xiàn)。
[0093]在一個(gè)實(shí)施例中,使用原子的計(jì)數(shù)器跟蹤訪問每個(gè)內(nèi)部節(jié)點(diǎn)的線程的數(shù)目。也就是說,當(dāng)由與每個(gè)內(nèi)部節(jié)點(diǎn)的子節(jié)點(diǎn)相關(guān)聯(lián)的線程所遍歷到時(shí),每個(gè)內(nèi)部節(jié)點(diǎn)被原子地處理。當(dāng)允許對(duì)內(nèi)部節(jié)點(diǎn)的第二線程處理節(jié)點(diǎn)以確定其包圍體時(shí),對(duì)內(nèi)部節(jié)點(diǎn)的第一線程立即終止。例如,所有計(jì)數(shù)器以假狀態(tài)開始,以及當(dāng)被第一次訪問時(shí),計(jì)數(shù)器增大以指示真狀態(tài)。訪問內(nèi)部節(jié)點(diǎn)的稍后到達(dá)的線程路徑現(xiàn)在在節(jié)點(diǎn)處讀取真狀態(tài),這指示其是稍后到達(dá)的線程。通過該方式,隨著沿從葉節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑遍歷二叉樹,每個(gè)節(jié)點(diǎn)精確地由一個(gè)線程所處理。在一個(gè)實(shí)施例中,這導(dǎo)致復(fù)雜性。
[0094]具體地,在910,方法包括拾取未處理的葉節(jié)點(diǎn)以及將其設(shè)置為由特定第一線程所處理的當(dāng)前節(jié)點(diǎn)。方法還包括從第一線程上的第一子節(jié)點(diǎn)(當(dāng)前節(jié)點(diǎn))沿源自葉節(jié)點(diǎn)的路徑原子地遍歷到第一父節(jié)點(diǎn)。第一父節(jié)點(diǎn)與第一子節(jié)點(diǎn)和第二子節(jié)點(diǎn)相關(guān)聯(lián)。通過處理從葉節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑,并行地遍歷了二叉樹,并且二叉樹中的每個(gè)節(jié)點(diǎn)被處理一次。
[0095]在決策步驟920,方法包括確定父節(jié)點(diǎn)當(dāng)由當(dāng)前線程所處理時(shí),是否在之前已由其子節(jié)點(diǎn)之一所遍歷到。具體地,在920,確定第一父節(jié)點(diǎn)是否在之前已由不同的第二線程上的第二子節(jié)點(diǎn)所遍歷到。在一個(gè)實(shí)現(xiàn)方案中,使用計(jì)數(shù)器確定正在嘗試處理父節(jié)點(diǎn)的線程是否是稍后到達(dá)父節(jié)點(diǎn)的線程。其他實(shí)施例適合于用于確定線程是否與包括稍后到達(dá)父節(jié)點(diǎn)的子節(jié)點(diǎn)的路徑相關(guān)聯(lián)的其他方法。
[0096]如果確定父節(jié)點(diǎn)第一次由線程所訪問,那么方法前進(jìn)到930,其中計(jì)數(shù)器增大。例如,計(jì)數(shù)器最初指示假狀態(tài),該假狀態(tài)指示父節(jié)點(diǎn)未被訪問。在讀取假狀態(tài)之后,計(jì)數(shù)器設(shè)置為真狀態(tài)。此后,遍歷到第一父節(jié)點(diǎn)的線程在950處終止。當(dāng)?shù)谝桓腹?jié)點(diǎn)未由其子節(jié)點(diǎn)二者中任何一個(gè)所遍歷到時(shí),更具體地,當(dāng)之前未由第二子節(jié)點(diǎn)所遍歷到時(shí),發(fā)生終止。
[0097]在該情況下,在910被終止的線程選擇另一個(gè)未處理的葉節(jié)點(diǎn)。處理新葉節(jié)點(diǎn)的線程從未處理的葉節(jié)點(diǎn)開始遍歷二叉樹。在一個(gè)實(shí)現(xiàn)方案中,用先前所描述的調(diào)度器選擇葉節(jié)點(diǎn)。在一個(gè)實(shí)施例中,在線程束(warp)基礎(chǔ)上收集線程的終止。也就是說,多處理單元(例如GPU)包括多個(gè)核心和/或線程,其中線程束包括使用相同指令并且并行地執(zhí)行的一個(gè)或多個(gè)線程(例如32個(gè)線程)。例如,同時(shí)(例如在相同時(shí)鐘周期上)對(duì)線程束中的所有線程應(yīng)用圖形管線中的指令。在另一個(gè)實(shí)施例中,線程束由塊所收集,使得類似地對(duì)待線程塊中的多個(gè)線程束。這樣,無論何時(shí)檢測(cè)到正由相同線程塊處理由給定的內(nèi)部節(jié)點(diǎn)所覆蓋的所有葉,通過使用更快的共享存儲(chǔ)器原子減少了全局原子的數(shù)目。
[0098]另一方面,如果確定由與稍后到達(dá)的子節(jié)點(diǎn)相關(guān)聯(lián)的線程訪問了父節(jié)點(diǎn),那么在940方法包括確定父包圍體用于使用第一線程的第一父節(jié)點(diǎn)。在一個(gè)實(shí)施例中,所指派的父包圍體完全包含第一子節(jié)點(diǎn)的第一包圍體,以及第二子節(jié)點(diǎn)的第二包圍體。此外,在一個(gè)實(shí)施例中,父包圍體包括第一子包圍體和第二子包圍體的并集。在一個(gè)數(shù)學(xué)定義中,并集包括在第一子包圍體和第二子包圍體二者中的所有點(diǎn)的集合。
[0099]在一個(gè)具體實(shí)施例中,第一子包圍體包括第一軸對(duì)齊子包圍盒,或第一子AABB。并且,第二子包圍體包括第二子AABB。通過指派第一和第二子AABB的最小和最大x、y和z值來確定父包圍體。
[0100]例如,通過指派第一和第二子AABB的最小X值和最大X值來確定父包圍體。也就是說,沿著X軸,來自第一和第二子AABB中任一個(gè)的最小的X值被選為用于父包圍體的最小X值。類似地,來自第一和第二子AABB任一個(gè)的最大的X值被選為用于父包圍體的最大X值。
[0101]并且,為父包圍體指派第一和第二子AABB的最小y值和最大y值。也就是說,沿著I軸,來自第一和第二子AABB任一個(gè)的最小的y值被選為用于父包圍體的最小y值。類似地,來自第一和第二子AABB任一個(gè)的最大的y值被選為用于父包圍體的最大y值。
[0102]并且,未父包圍體指派第一和第二子AABB的最小z值和最大z值。也就是說,沿著Z軸,來自第一和第二子AABB任一個(gè)的最小的Z值被選為用于父包圍體的最小Z值。類似地,來自第一和第二子AABB任一個(gè)的最大的z值被選為用于父包圍體的最大z值。
[0103]通過將父節(jié)點(diǎn)設(shè)置為新的當(dāng)前節(jié)點(diǎn),流程圖900的方法在960繼續(xù)。此后,線程行進(jìn)回到920以確定新當(dāng)前節(jié)點(diǎn)的新父節(jié)點(diǎn)是否在之前已經(jīng)由其子節(jié)點(diǎn)之一所遍歷到。通過該方式,線程向上遍歷通過二叉樹。
[0104]因此,根據(jù)本公開的實(shí)施例,描述了提供根據(jù)二叉樹的層次包圍盒的構(gòu)造中的最大并行度的系統(tǒng)和方法。
[0105]同時(shí),前述公開使用具體框圖、流程圖和示例闡述了各種實(shí)施例,每個(gè)框圖部件、流程圖步驟、操作和/或本文描述和/或示出的部件可單獨(dú)地和/或共同地,通過使用各種不同的硬件、軟件或固件(或其任意組合)配置來實(shí)現(xiàn)。另外,對(duì)包含在其他部件內(nèi)的部件的任何公開應(yīng)視為示例,因?yàn)榭蓪?shí)現(xiàn)許多其他架構(gòu)來達(dá)到相同的功能性。
[0106]本文描述和/或示出的工藝參數(shù)和步驟順序僅以示例方式給出并可按期望進(jìn)行變化。舉例來說,雖然本文示出和/或描述的步驟可能以特定的順序示出或論述,但這些步驟不必按所示出或論述的順序來實(shí)施。本文描述和/或示出的各種示范性方法也可以省略本文描述或示出的一個(gè)或多個(gè)步驟,或包括那些所公開步驟之外的附加步驟。
[0107]雖然本文已圍繞全功能計(jì)算系統(tǒng)描述和/或示出了各種實(shí)施例,但這些示范性實(shí)施例中的一個(gè)或多個(gè)可分布為各種各樣的形式的程序產(chǎn)品,而與用來實(shí)際執(zhí)行分布的計(jì)算機(jī)可讀介質(zhì)的特定類型無關(guān)。本文公開的實(shí)施例也可使用實(shí)施某些任務(wù)的軟件模塊來實(shí)現(xiàn)。這些軟件模塊可包括腳本、批處理或其他可被存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上或計(jì)算系統(tǒng)內(nèi)的可執(zhí)行文件。這些軟件模塊可以配置計(jì)算系統(tǒng)來實(shí)施一個(gè)或多個(gè)本文公開的示范性實(shí)施例。本文公開的軟件模塊中的一個(gè)或多個(gè)可在云計(jì)算環(huán)境中實(shí)現(xiàn)。云計(jì)算環(huán)境可經(jīng)由因特網(wǎng)提供各種服務(wù)和應(yīng)用。這些基于云的服務(wù)(例如,軟件即服務(wù)、平臺(tái)即服務(wù)、基礎(chǔ)設(shè)施即服務(wù)等等)可通過Web瀏覽器或其他遠(yuǎn)程接口訪問。本文描述的各種功能可通過遠(yuǎn)程桌面環(huán)境或任何其他基于云計(jì)算的環(huán)境提供。
[0108]前述的描述,出于解釋的目的,已參考特定實(shí)施例進(jìn)行了描述。然而,上述說明性的論述不旨在窮舉或?qū)⒈景l(fā)明限制在所公開的明確形式上。鑒于以上教導(dǎo),許多修改和變形是可能的。選擇和描述實(shí)施例以最好地解釋本發(fā)明的原理及其實(shí)際應(yīng)用,從而使本領(lǐng)域的其他技術(shù)人員最好地利用本發(fā)明和具有各種適用于特定預(yù)期用途的修改的各種實(shí)施例。
[0109]因此描述了根據(jù)本公開的實(shí)施例。雖然本公開已在特定實(shí)施例中加以描述,但應(yīng)理解本公開不應(yīng)被解釋為限于這種實(shí)施例,而應(yīng)根據(jù)以下的權(quán)利要求來進(jìn)行解釋。
【權(quán)利要求】
1.一種具有計(jì)算機(jī)可執(zhí)行指令的非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述計(jì)算機(jī)可執(zhí)行指令用于使計(jì)算機(jī)系統(tǒng)實(shí)施包括以下步驟的方法: 確定包括被索引化的基元節(jié)點(diǎn)的總數(shù)的多個(gè)基元,其中所述多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng); 將所述多個(gè)基元排序;以及 至多要求關(guān)于所述基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)地構(gòu)建所述層次樹;以及 與所述層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建所述內(nèi)部節(jié)點(diǎn)。
2.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述確定多個(gè)基元包括: 給每個(gè)基元分派莫頓碼。
3.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述構(gòu)建層次樹包括: 構(gòu)建包括所述基元節(jié)點(diǎn)和一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)的二叉基數(shù)樹,使得每個(gè)內(nèi)部節(jié)點(diǎn)與由各自的子樹中的相對(duì)應(yīng)的基元節(jié)點(diǎn)的基元所共享的最長(zhǎng)公共前綴相對(duì)應(yīng)。
4.根據(jù)權(quán)利要求3所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述構(gòu)建二叉基數(shù)樹包括: 并行地處理內(nèi)部節(jié)點(diǎn)的任意子集。
5.根據(jù)權(quán)利要求3所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述構(gòu)建二叉基數(shù)樹包括: 對(duì)于與內(nèi)部節(jié)點(diǎn)相對(duì)應(yīng)的給定的節(jié)點(diǎn)索引,基于所述節(jié)點(diǎn)索引確定所述多個(gè)基元的基元索弓I的對(duì)應(yīng)范圍的方向,其中所述給定的節(jié)點(diǎn)索弓丨包括所述對(duì)應(yīng)范圍中的開始的基元索引或結(jié)尾的基元索引; 確定所述對(duì)應(yīng)范圍的長(zhǎng)度; 確定所述對(duì)應(yīng)范圍中的基兀索引之間的最聞不同位;以及 指派子節(jié)點(diǎn)索引用于和與所述最高不同位相關(guān)聯(lián)的所述基元索引相對(duì)應(yīng)的所述給定的節(jié)點(diǎn)索引。
6.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述確定方向進(jìn)一步包括: 基于哪個(gè)鄰居基元具有最多的索引匹配確定所述方向。
7.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述確定長(zhǎng)度包括: 確定用于所述長(zhǎng)度的最大值;以及 實(shí)施二分搜索以確定用于所述長(zhǎng)度的實(shí)際值。
8.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法中的所述子節(jié)點(diǎn)索引之一包括葉節(jié)點(diǎn)。
9.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述方法進(jìn)一步包括: 編號(hào)用于所述多個(gè)基元的索引; 使用用于所述多個(gè)基元的相同的編號(hào)方案,編號(hào)用于所述至少一個(gè)內(nèi)部節(jié)點(diǎn)的索引,其中所述至少一個(gè)內(nèi)部節(jié)點(diǎn)的總數(shù)包括基元的所述總數(shù)減1,并且其中用于內(nèi)部節(jié)點(diǎn)的索引號(hào)的基元索引的范圍包括所述多個(gè)基元中的相同的索引號(hào)。
10.一種計(jì)算機(jī)系統(tǒng),包括: 處理器,以及 存儲(chǔ)器,其耦連到所述處理器并且具有存儲(chǔ)在其中的指令,如果所述指令由所述計(jì)算機(jī)系統(tǒng)所執(zhí)行,那么使所述計(jì)算機(jī)系統(tǒng)執(zhí)行包括下列步驟的方法: 確定包括被索引化的基元節(jié)點(diǎn)的總數(shù)的多個(gè)基元,其中所述多個(gè)基元與層次樹的葉節(jié)點(diǎn)相對(duì)應(yīng); 將所述多個(gè)基元排序;以及 至多要求關(guān)于所述基元節(jié)點(diǎn)的總數(shù)成線性數(shù)量的臨時(shí)存儲(chǔ)地構(gòu)建所述層次樹;以及 與所述層次樹的內(nèi)部節(jié)點(diǎn)的祖先節(jié)點(diǎn)的一個(gè)或多個(gè)并行地構(gòu)建所述內(nèi)部節(jié)點(diǎn)。
11.根據(jù)權(quán)利要求10所述的計(jì)算機(jī)系統(tǒng),其中所述方法中的所述確定多個(gè)基元包括: 給每個(gè)基元指派莫頓碼。
12.根據(jù)權(quán)利要求10所述的計(jì)算機(jī)系統(tǒng),其中所述方法中的所述構(gòu)建層次樹包括: 構(gòu)建包括所述基元節(jié)點(diǎn)和一個(gè)或多個(gè)內(nèi)部節(jié)點(diǎn)的二叉基數(shù)樹,使得每個(gè)內(nèi)部節(jié)點(diǎn)與由各自的子樹中的基元所共享的最長(zhǎng)公共前綴相對(duì)應(yīng)。
13.根據(jù)權(quán)利要求12所述的計(jì)算機(jī)系統(tǒng),其中所述方法進(jìn)一步包括: 基于所述基數(shù)樹構(gòu)建第二樹。
14.根據(jù)權(quán)利要求12所述的計(jì)算機(jī)系統(tǒng),其中所述方法中的所述構(gòu)建二叉基數(shù)樹包括: 并行地處理內(nèi)部節(jié)點(diǎn)的任意子集。
15.根據(jù)權(quán)利要求12所述的計(jì)算機(jī)系統(tǒng),其中所述方法中的所述構(gòu)建二叉基數(shù)樹包括: 對(duì)于與內(nèi)部節(jié)點(diǎn)相對(duì)應(yīng)的給定的節(jié)點(diǎn)索引,基于所述節(jié)點(diǎn)索引確定所述多個(gè)基元的基元索弓I的對(duì)應(yīng)范圍的方向,其中所述給定的節(jié)點(diǎn)索弓丨包括所述對(duì)應(yīng)范圍中的開始的基元索引或結(jié)尾的基元索引; 確定所述對(duì)應(yīng)范圍的長(zhǎng)度; 確定所述對(duì)應(yīng)范圍中的基兀索引之間的最聞不同位;以及 指派子節(jié)點(diǎn)索引用于和與所述最高不同位相關(guān)聯(lián)的所述基元索引相對(duì)應(yīng)的所述給定的節(jié)點(diǎn)索引。
【文檔編號(hào)】G06F17/30GK103440238SQ201310076982
【公開日】2013年12月11日 申請(qǐng)日期:2013年3月11日 優(yōu)先權(quán)日:2012年3月9日
【發(fā)明者】泰羅·卡拉斯 申請(qǐng)人:輝達(dá)公司