專利名稱::一種基于gpu的層次包圍盒的快速構(gòu)造方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及圖形實(shí)時(shí)渲染
技術(shù)領(lǐng)域:
,尤其涉及一種層次包圍盒的快速構(gòu)造方法。
背景技術(shù):
:在過去的二十年時(shí)間里,顯卡性能的巨大提高,尤其是其可編程性的出現(xiàn),大大促進(jìn)了圖形學(xué)研究領(lǐng)域的進(jìn)步。光線跟蹤技術(shù)是一種在圖形繪制領(lǐng)域廣泛應(yīng)用的技術(shù)。相比光柵化技術(shù),光線跟蹤技術(shù)有很多優(yōu)勢(shì),包括物體可見性的自動(dòng)計(jì)算,時(shí)間復(fù)雜度與場(chǎng)景中圖元數(shù)量呈次線性關(guān)系,更適合并行架構(gòu)處理等。但是,由于光線跟蹤技術(shù)模擬的是真實(shí)世界中光的物理路徑,因此它最大的優(yōu)勢(shì)是產(chǎn)生高質(zhì)量的圖像,繪制出高真實(shí)感的平滑的反射、折射、軟影(softshadow)等全局光照效果。Whitted最早使用光線跟蹤技術(shù)來模擬全局光照效果。由于光線跟蹤技術(shù)需要花費(fèi)很高的計(jì)算量,因此以往這種技術(shù)只能應(yīng)用在非實(shí)時(shí)繪制領(lǐng)域中。當(dāng)前,計(jì)算機(jī)硬件的計(jì)算能力呈指數(shù)形式的增長(zhǎng)速度已經(jīng)使交互式的實(shí)時(shí)光線跟蹤成為可能。越來越多的研究開始關(guān)注光線跟蹤的實(shí)時(shí)計(jì)算,已經(jīng)出現(xiàn)了一些優(yōu)秀的研究成果。然而,盡管這些研究很多都是基于GPU架構(gòu)設(shè)計(jì)的,但這些實(shí)現(xiàn)仍然未能充分利用當(dāng)前GPU強(qiáng)大的并行計(jì)算能力。近年來已經(jīng)出現(xiàn)了一些基于GPU實(shí)現(xiàn)的編程方法,例如NVIDIA公司的CUDA(ComputeUnifiedDeviceArchitecture)編程模型、蘋果公司的OpenCL,以及一些底層的框架結(jié)構(gòu)。這些模型允許程序員自己定義合適的數(shù)據(jù)結(jié)構(gòu),為編程提供很大的靈活性和可操作性,包括創(chuàng)建、調(diào)度、同步等線程管理操作可以完全由硬件來完成。例如在CUDA編程模型里,我們可以根據(jù)程序的并行特征將程序劃分成幾個(gè)順序執(zhí)行的被稱為kernel的代碼段,使其在GPU中執(zhí)行。為了有效地管理大量的線程,kernel使用標(biāo)量形式的SIMT(SingleInstruction,MultipleThread)操作,線程以一種被稱作warps的分組形式根據(jù)kernel中的指令來執(zhí)行。程序員將線程組織成線程塊(block),這些線程塊本質(zhì)上可以看成是虛擬的SM多處理器,擁有獨(dú)立的寄存器和共享內(nèi)存(sharedmemory),各線程塊間相對(duì)獨(dú)立的亂序執(zhí)行。為了獲得GPU的最大計(jì)算性能,有兩個(gè)問題需要考慮第一,每個(gè)線程應(yīng)該使用盡量少的硬件寄存器和存儲(chǔ)資源,以保證GPU內(nèi)部同一時(shí)刻運(yùn)行更多的活動(dòng)線程,Popov等的光線跟蹤實(shí)現(xiàn)消耗了過多的寄存器,導(dǎo)致GPU利用率還不到33%;第二,線程的SIMD(SingleInstruction,MultipleData)操作對(duì)程序員來說是透明的,而SIMD的操作方式對(duì)程序的分支執(zhí)行非常敏感,同一warp的線程只有執(zhí)行程序的同一分支才能獲得最大效益。最近,一些研究開始關(guān)注動(dòng)態(tài)場(chǎng)景下的光線跟蹤方法。在光線跟蹤算法中,構(gòu)造加速結(jié)構(gòu)是其中重要的一步,通過將面片重新進(jìn)行組織,可以大大減少無效的光線遍歷操作和相交操作。由于動(dòng)態(tài)場(chǎng)景下物體間的拓?fù)浣Y(jié)構(gòu)會(huì)發(fā)生改變,甚至物體本身都會(huì)發(fā)生形變,因此,每一幀都需要重新對(duì)加速結(jié)構(gòu)進(jìn)行重構(gòu)。然而,加速結(jié)構(gòu)的構(gòu)造是一個(gè)比較耗時(shí)的操作,通常無法在繪制一幀的時(shí)間內(nèi)完成,這也是導(dǎo)致當(dāng)前基于動(dòng)態(tài)場(chǎng)景的實(shí)時(shí)光線跟蹤研究進(jìn)展較慢的主要原因。kd樹可以提供較好的光線跟蹤性能,但是其昂貴的構(gòu)造時(shí)間已滿足不了實(shí)時(shí)光線跟蹤的要求;網(wǎng)格結(jié)構(gòu)易于構(gòu)建,但是其光線跟蹤的性能嚴(yán)重依賴于操作的相似性,而這往往在復(fù)雜場(chǎng)景或者二級(jí)光線中是不存在的。鑒于光線跟蹤性能以及處理復(fù)雜場(chǎng)景和二級(jí)光線各方面的綜合要求,在處理動(dòng)態(tài)場(chǎng)景問題上,BVH(BoundingVolumeHierarchy)看起來是一個(gè)折中的選擇,與kd樹、網(wǎng)格結(jié)構(gòu)按照空間的分割方法不同,BVH是一個(gè)按照物體分割的場(chǎng)景層次分割結(jié)構(gòu)。設(shè)計(jì)出一種高質(zhì)量的快速的加速結(jié)構(gòu)構(gòu)造方法,使其可以充分利用多核處理器強(qiáng)大的并行處理能力,從而使加速結(jié)構(gòu)建造速度進(jìn)一步加快,滿足實(shí)時(shí)性的要求,是一個(gè)光線跟蹤算法能否有效執(zhí)行的關(guān)鍵。目前公認(rèn)的性能較好的加速結(jié)構(gòu)一般都是一種層次結(jié)構(gòu),如BVH(BoundingVolumeHierarchies)>BSP(BinarySpacePartitioning)、BIH(BoundingIntervalHierarchies)、八叉樹(Octree)等結(jié)構(gòu)。然而層次結(jié)構(gòu)自上而下的構(gòu)造方式使其很難在構(gòu)造階段初期充分的利用多核架構(gòu)中每個(gè)核的計(jì)算能力,從而造成硬件的低效使用。已經(jīng)有一些工作關(guān)注于在多核體系下對(duì)加速結(jié)構(gòu)的使用。MacDonald等提出了SAH(surfaceareaheuristic)策略,Wald和Popov分別提出了針對(duì)這一策略設(shè)計(jì)的優(yōu)化的構(gòu)造方法。最近也出現(xiàn)了一些針對(duì)并行構(gòu)造方面的工作,Popov用帶有幾個(gè)核的CPU去構(gòu)造kd樹,但由于帶寬有限,取得的性能提升并不明顯,Shevtsov同樣用帶有幾個(gè)核的CPU去構(gòu)造kd樹,盡管取得了不錯(cuò)的性能,但他的這種算法不能擴(kuò)展到更多的核進(jìn)行處理。當(dāng)前,隨著硬件并行計(jì)算能力的增強(qiáng),CUDA這樣的編程平臺(tái)也開始成熟,因此,應(yīng)該重新考慮加速結(jié)構(gòu)的設(shè)計(jì)。
發(fā)明內(nèi)容本發(fā)明提供一種基于GPU的層次包圍盒(bvh)并行構(gòu)建方法,可有效利用硬件的并行計(jì)算能力,提高加速結(jié)構(gòu)的構(gòu)造速度和質(zhì)量。一種基于GPU的層次包圍盒的快速構(gòu)造方法,包括(1)將GPU的活動(dòng)線程劃分為若干線程塊,通過構(gòu)建層次包圍盒(BVH),對(duì)模型空間中的場(chǎng)景數(shù)據(jù)逐層進(jìn)行劃分,直至達(dá)到預(yù)定的層數(shù),其中GPU內(nèi)部所有的線程塊同時(shí)參與同一個(gè)場(chǎng)景節(jié)點(diǎn)的劃分;劃分時(shí)在需要進(jìn)行渲染的模型空間的三個(gè)坐標(biāo)軸上(相互垂直的X軸、Y軸和Z軸),分別計(jì)算采樣分割點(diǎn)的SAH(surfaceareaheuristic)花費(fèi)(MacDonald等在文獻(xiàn)"Heuristicsforraytracingusingspacesubdivision.VisualComputer,1990.,,中提出的評(píng)估加速結(jié)構(gòu)最優(yōu)分割點(diǎn)的方法,如公式(a)所示),然后選取三個(gè)坐標(biāo)軸中花費(fèi)最小的分割點(diǎn),將選取的這個(gè)分割點(diǎn)作為分割平面,對(duì)模型空間中的場(chǎng)景數(shù)據(jù)進(jìn)行劃分。將整個(gè)場(chǎng)景所形成的包圍盒作為根節(jié)點(diǎn),第一次劃分可以得到兩個(gè)子節(jié)點(diǎn),然后以同樣的方法,按照寬度優(yōu)先的方式遞歸這個(gè)構(gòu)造過程,逐層進(jìn)行劃分,直至構(gòu)造的層數(shù)達(dá)到設(shè)定值,即此構(gòu)造的層數(shù)是預(yù)先設(shè)定好的,一般為5層。這種構(gòu)造方式可以在層次包圍盒構(gòu)造初期,快速對(duì)場(chǎng)景節(jié)點(diǎn)進(jìn)行分割,從而迅速產(chǎn)生出大量數(shù)據(jù)供成千上萬的GPU線程使用,使它們一直保持滿負(fù)荷工作狀態(tài)。我們使用公式(a)來計(jì)算每個(gè)潛在的分割點(diǎn),另外我們還需要知道每個(gè)子結(jié)點(diǎn)所含面片數(shù)及其表面積。Wald等[15][19]通過使用排序來計(jì)算這些數(shù)量,為了避免昂貴的排序操作,我們使用bin方法[20]以減少帶寬的使用。隨著構(gòu)造層次的加深,處理核所要處理的數(shù)據(jù)明顯減少,使計(jì)算SAH花費(fèi)的時(shí)間更短,從而使建造速度更快。采樣分割點(diǎn)的SAH花費(fèi)<formula>formulaseeoriginaldocumentpage5</formula>(a)這里,ni和r^分別代表與當(dāng)前采樣分割點(diǎn)相鄰的左、右子節(jié)點(diǎn)所含的面片數(shù)量,SA(N1),SA(Nr)分別表示與當(dāng)前采樣分割點(diǎn)相鄰的左、右子節(jié)點(diǎn)的表面積,SA(N)表示當(dāng)前采樣分割點(diǎn)的父節(jié)點(diǎn)的表面積(沒有父節(jié)點(diǎn)時(shí)取0),Kt表示對(duì)當(dāng)前采樣分割點(diǎn)的父節(jié)點(diǎn)進(jìn)行遍歷所產(chǎn)生的花費(fèi)(沒有父節(jié)點(diǎn)時(shí)取0),&表示對(duì)當(dāng)前采樣分割點(diǎn)進(jìn)行相交操作所產(chǎn)生的花費(fèi)。Kt和&的含義是計(jì)算機(jī)硬件處理遍歷或相交操作耗費(fèi)的時(shí)間,Kt和&的絕對(duì)值可以人為設(shè)定,例如可以設(shè)定Kt=10,Kt=20;說明相交操作的花費(fèi)大于遍歷操作的花費(fèi),但10、20并不一定要求表示真實(shí)的處理時(shí)間,僅表示兩者的相對(duì)關(guān)系。所述的遍歷或相交操作均可以是現(xiàn)有技術(shù),本發(fā)明的重點(diǎn)在于層次包圍盒結(jié)構(gòu)的并行構(gòu)建。我們選取最優(yōu)的分割點(diǎn),使在這個(gè)點(diǎn)上所得到的SAH花費(fèi)CP最小,或者如果&n花銷更小,這時(shí)n=ni+nr,n為當(dāng)前節(jié)點(diǎn)所含面片數(shù)量。在進(jìn)行SAH計(jì)算時(shí),假設(shè)要在每個(gè)坐標(biāo)軸上取p個(gè)采樣分割點(diǎn),那么為了計(jì)算花費(fèi)最小的最優(yōu)分割點(diǎn),我們?cè)谌齻€(gè)維度上一共要進(jìn)行3p次計(jì)算,由于這些計(jì)算只是用同樣的操作對(duì)不同的數(shù)據(jù)進(jìn)行處理,因此我們完全可以通過處理核的SIMD處理能力將這些操作并行處理。最后,當(dāng)這些分割點(diǎn)計(jì)算都完成時(shí),我們可以使用歸約操作(reduction)找出具有最低花銷的分割點(diǎn)。(2)每個(gè)線程塊分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于每個(gè)線程塊內(nèi)線程的數(shù)量。而每個(gè)線程塊內(nèi)線程的數(shù)量也是在步驟(1)中線程塊的劃分時(shí)已經(jīng)設(shè)定的。(3)線程塊中的每個(gè)線程分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于5個(gè),最終產(chǎn)生葉子節(jié)點(diǎn)。由于涉及到多個(gè)線程塊或線程同時(shí)進(jìn)行分割工作并產(chǎn)生結(jié)果,在步驟(2)和步驟(3)中劃分場(chǎng)景數(shù)據(jù)的具體步驟如下a)在存儲(chǔ)區(qū)域中建立兩個(gè)隊(duì)列(第一隊(duì)列和第二隊(duì)列),分別存放用來存放等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn);b)當(dāng)GPU存在空閑線程塊或線程時(shí),從第一隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第二隊(duì)列;其中對(duì)第一隊(duì)列中編號(hào)為k的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第二隊(duì)列中的編號(hào)分別為2Xk+t(t=0,1);場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置。c)當(dāng)?shù)谝魂?duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)處理完畢后,清空第一隊(duì)列中的所有節(jié)點(diǎn)數(shù)據(jù);當(dāng)GPU存在空閑線程塊或線程時(shí),從第二隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第一隊(duì)列,直至第二隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)都處理完畢。其中對(duì)第二隊(duì)列中編號(hào)為j的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第一隊(duì)列中的編號(hào)分別為2Xj+t(t=0,1);場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置。d)循環(huán)步驟b)、步驟c),直至完成相應(yīng)的場(chǎng)景節(jié)點(diǎn)的劃分。當(dāng)每個(gè)隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)劃分完畢后,通過硬件支持的緊湊操作(compaction)清除對(duì)該隊(duì)列中的空?qǐng)鼍肮?jié)點(diǎn)。本發(fā)明快速構(gòu)造方法分為三個(gè)階段,構(gòu)造初期、構(gòu)造中期和構(gòu)造后期,在構(gòu)造初期由于需要進(jìn)行大量的采樣點(diǎn)計(jì)算,而GPU架構(gòu)可以允許上萬個(gè)線程同時(shí)進(jìn)行計(jì)算,所有的線程塊均同時(shí)參與一個(gè)場(chǎng)景節(jié)點(diǎn)的劃分,保證了這些采樣點(diǎn)的快速并行計(jì)算。在構(gòu)造中期,新結(jié)點(diǎn)所含面片數(shù)逐漸減少,在處理每一個(gè)結(jié)點(diǎn)時(shí),可能無法找到足夠多的采樣點(diǎn)提供給GPU線程,從而造成GPU計(jì)算資源的浪費(fèi)。因此,僅使用一個(gè)線程塊block去處理一個(gè)場(chǎng)景節(jié)點(diǎn)的劃分。在構(gòu)造后期,隨著BVH結(jié)構(gòu)構(gòu)造層次的繼續(xù)加深,BVH結(jié)構(gòu)每個(gè)結(jié)點(diǎn)所含的面片數(shù)越來越少,甚至少于一個(gè)線程塊的線程數(shù),這樣將會(huì)再一次出現(xiàn)計(jì)算資源閑置的情況。因此,為了能夠充分利用GPU計(jì)算資源,,當(dāng)結(jié)點(diǎn)所含面片數(shù)低于每個(gè)線程決內(nèi)線程的數(shù)量時(shí),采用每個(gè)線程分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分的方法。圖1為本發(fā)明方法在BVH結(jié)構(gòu)構(gòu)造過程中對(duì)GPU處理器的利用率分析。圖2為本發(fā)明方法基于不同的GPU處理核數(shù)所得到的BVH構(gòu)造時(shí)間。具體實(shí)施例方式為了在加速結(jié)構(gòu)構(gòu)造初期產(chǎn)生足夠多的數(shù)據(jù)供多個(gè)處理核進(jìn)行高效的并行處理,我們提出了以下構(gòu)造方法。為了能在遍歷操作與相交操作計(jì)算之間取得最優(yōu)花費(fèi),我們?nèi)匀皇褂肧AH策略作為確定分割面的方法。傳統(tǒng)的BVH構(gòu)造分別根據(jù)三個(gè)垂直坐標(biāo)軸x、y、z方向上,計(jì)算具有最低SAH花費(fèi)的位置,形成包圍盒。不同于傳統(tǒng)的BVH構(gòu)造方法,我們采用寬度優(yōu)先的方式,在三個(gè)坐標(biāo)軸上分別計(jì)算采樣分割點(diǎn)的SAH花費(fèi),然后選取每個(gè)坐標(biāo)軸上花費(fèi)最小的分割點(diǎn)。需要指出的是,對(duì)于大量采樣點(diǎn)的SAH計(jì)算,本發(fā)明方法是使GPU當(dāng)前所有線程都去做這個(gè)計(jì)算,相比傳統(tǒng)的加速結(jié)構(gòu),這種構(gòu)造方式可以迅速產(chǎn)生出大量數(shù)據(jù)供成千上萬的GPU線程使用,使它們一直保持滿負(fù)荷工作狀態(tài),大大減少了加速結(jié)構(gòu)在構(gòu)造初期的構(gòu)造時(shí)間。我們使用公式(1)來計(jì)算每個(gè)潛在的分割點(diǎn),另外我們還需要知道每個(gè)子結(jié)點(diǎn)所含面片數(shù)及其表面積。Wald等]通過使用排序來計(jì)算這些數(shù)量,為了避免昂貴的排序操作,我們使用bin方法以減少帶寬的使用。隨著構(gòu)造層次的加深,處理核所要處理的數(shù)據(jù)明顯減少,使計(jì)算SAH花費(fèi)的時(shí)間更短,從而使建造速度更快。Cp=Kt+為[niSA(N丨)+nrSA(Nr)],(1)6這里,ni和n,分別代表相應(yīng)左右子節(jié)點(diǎn)所含的面片數(shù)量;SA(N1)、SA(Nr)分別表示與當(dāng)前采樣分割點(diǎn)相鄰的左、右子節(jié)點(diǎn)的表面積,SA(N)表示當(dāng)前采樣分割點(diǎn)的父節(jié)點(diǎn)的表面積,KT表示對(duì)當(dāng)前采樣分割點(diǎn)的父節(jié)點(diǎn)進(jìn)行遍歷所產(chǎn)生的花費(fèi),KI表示對(duì)當(dāng)前采樣分割點(diǎn)進(jìn)行相交操作所產(chǎn)生的花費(fèi)。我們選取最優(yōu)的分割點(diǎn),使在這個(gè)點(diǎn)上所得到的SAH花費(fèi)CP最小,或者如果!^!!花銷更小,這時(shí)n=ni+rvn為當(dāng)前節(jié)點(diǎn)所含面片數(shù)量。在使用SAH策略對(duì)結(jié)點(diǎn)進(jìn)行分割計(jì)算時(shí),我們使用SIMD多線程方式將這一操作并行化。在進(jìn)行SAH計(jì)算時(shí),假設(shè)要在每個(gè)坐標(biāo)軸上取P個(gè)采樣分割點(diǎn),那么為了計(jì)算花費(fèi)最小的最優(yōu)分割點(diǎn),我們?cè)谌齻€(gè)維度上一共要進(jìn)行3p次計(jì)算,由于這些計(jì)算只是用同樣的操作對(duì)不同的數(shù)據(jù)進(jìn)行處理,因此我們完全可以通過處理核的SIMD處理能力將這些操作并行處理。最后,當(dāng)這些分割點(diǎn)計(jì)算都完成時(shí),可以使用歸約操作(reduction)找出具有最低花銷的分割點(diǎn)。一般中等場(chǎng)景的面片數(shù)為幾十萬甚至上百萬,這意味著在BVH結(jié)構(gòu)構(gòu)造初期,我們需要進(jìn)行大量的采樣點(diǎn)計(jì)算,當(dāng)前的GPU架構(gòu)可以允許上萬個(gè)線程同時(shí)進(jìn)行計(jì)算,保證了這些采樣點(diǎn)的快速并行計(jì)算。然而,隨著BVH構(gòu)造層次的加深,新結(jié)點(diǎn)所含面片數(shù)逐漸減少,在處理每一個(gè)結(jié)點(diǎn)時(shí),可能無法找到足夠多的采樣點(diǎn)提供給GPU線程,從而造成GPU計(jì)算資源的浪費(fèi)。因此,在BVH結(jié)構(gòu)構(gòu)造中期,選擇另外一種計(jì)算方式。在當(dāng)前的GPU架構(gòu)中,程序員將線程組織成線程塊(block),本質(zhì)上可以看作是虛擬的SM多處理器,擁有獨(dú)立的寄存器和共享內(nèi)存(sharedmemory),各線程塊間相對(duì)獨(dú)立的亂序執(zhí)行。在我們新的計(jì)算方法里,我們使用一個(gè)線程塊block去處理一個(gè)結(jié)點(diǎn),同時(shí)將處理后的結(jié)果放入全局存儲(chǔ)區(qū)(globalmemory)。盡管訪問全局存儲(chǔ)區(qū)會(huì)產(chǎn)生較大的延遲,但是多線程切換機(jī)制可以使得這種延遲所帶來的損失降到最低。若顯卡中有N個(gè)SM多處理器,我們規(guī)定,當(dāng)BVH結(jié)構(gòu)構(gòu)造到log2N時(shí),算法執(zhí)行將會(huì)切換到這種新的計(jì)算模式下。在NVIDIA公司性能相對(duì)較好的GTX285顯卡中,一共有30個(gè)SM多處理器,因此在實(shí)現(xiàn)中我們選擇在BVH結(jié)構(gòu)的第五層切換到這種新的計(jì)算方式下。在自上而下的構(gòu)造過程中,每個(gè)結(jié)點(diǎn)按規(guī)則分割成兩個(gè)新的結(jié)點(diǎn),由于這些分割工作可以獨(dú)立進(jìn)行而不依賴其它結(jié)點(diǎn),因此我們完全可以將這些結(jié)點(diǎn)的分割工作分給多個(gè)核同時(shí)進(jìn)行處理,以加快構(gòu)造速度,同時(shí)可以通過分割任務(wù)的切換來隱藏訪存的延遲。我們可以設(shè)置一個(gè)隊(duì)列用來存放等待進(jìn)行分割計(jì)算的結(jié)點(diǎn),這樣當(dāng)一個(gè)處理核完成了一個(gè)結(jié)點(diǎn)的分割計(jì)算以后可以立刻從這個(gè)隊(duì)列里獲得新的工作,同時(shí)也將剛產(chǎn)生的欲分割結(jié)點(diǎn)放入隊(duì)列。由于涉及到多個(gè)線程塊同時(shí)進(jìn)行分割工作并產(chǎn)生結(jié)果,而當(dāng)前的GPU架構(gòu)還不支持存儲(chǔ)一致性,為了避免使用鎖機(jī)制帶來的同步開銷,我們?cè)O(shè)置兩個(gè)隊(duì)列來記錄這些位置,具體步驟如下a)在存儲(chǔ)區(qū)域中建立兩個(gè)隊(duì)列(第一隊(duì)列和第二隊(duì)列),分別存放用來存放等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn);b)當(dāng)GPU存在空閑線程塊時(shí),從第一隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第二隊(duì)列;其中對(duì)第一隊(duì)列中編號(hào)為k的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第二隊(duì)列中的編號(hào)分別為2Xk+t(t=0,1);場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置。c)當(dāng)?shù)谝魂?duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)處理完畢后,清空第一隊(duì)列中的所有節(jié)點(diǎn)數(shù)據(jù);當(dāng)GPU存在空閑線程塊時(shí),從第二隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第一隊(duì)列,直至第二隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)都處理完畢。其中對(duì)第二隊(duì)列中編號(hào)為j的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第一隊(duì)列中的編號(hào)分別為2Xj+t(t=0,1);場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置。d)循環(huán)步驟b)、步驟c),直至完成相應(yīng)的場(chǎng)景節(jié)點(diǎn)的劃分。當(dāng)每個(gè)隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)劃分完畢后,通過硬件支持的緊湊操作(compaction)清除對(duì)該隊(duì)列中的空?qǐng)鼍肮?jié)點(diǎn)。至于t的具體取值我們可以在block內(nèi)速度更快的共享存儲(chǔ)區(qū)(sharedmemory)里計(jì)算。在當(dāng)前層次的子結(jié)點(diǎn)全部計(jì)算完畢后,我們使用壓縮操作(compaction)將空結(jié)點(diǎn)去掉,形成新的父結(jié)點(diǎn)隊(duì)列。在BVH結(jié)構(gòu)構(gòu)造中期,我們使用一個(gè)線程塊block去處理一個(gè)BVH結(jié)點(diǎn),考慮到有限的寄存器資源和存儲(chǔ)資源,為了使活動(dòng)線程塊數(shù)達(dá)到最優(yōu),我們?cè)趯?shí)現(xiàn)時(shí)將每個(gè)線程塊的線程數(shù)設(shè)置為256個(gè),這256個(gè)線程并行計(jì)算采樣點(diǎn)的SAH花費(fèi),直至所有的采樣點(diǎn)計(jì)算完畢,同時(shí)將結(jié)果存入共享存儲(chǔ)區(qū),最后判斷出花費(fèi)最低的分割位置。然而,隨著BVH結(jié)構(gòu)構(gòu)造層次的繼續(xù)加深,BVH結(jié)構(gòu)每個(gè)結(jié)點(diǎn)所含的面片數(shù)越來越少,甚至少于一個(gè)線程塊的線程數(shù),這樣將會(huì)再一次出現(xiàn)計(jì)算資源閑置的情況。因此,為了能夠充分利用GPU計(jì)算資源,在BVH結(jié)構(gòu)構(gòu)造后期,當(dāng)結(jié)點(diǎn)所含面片數(shù)低于某一閾值時(shí),我們?cè)俅吻袚Q新的計(jì)算方式。在實(shí)現(xiàn)時(shí),我們將閾值設(shè)置為線程塊所含的線程數(shù)目,在本實(shí)驗(yàn)條件下,即為256。在BVH結(jié)構(gòu)構(gòu)造后期,GPU中的每一個(gè)線程不再只是計(jì)算某個(gè)結(jié)點(diǎn)其中的一個(gè)采樣點(diǎn)的SAH花費(fèi),而是要處理整個(gè)結(jié)點(diǎn)的分割,也就是說這個(gè)線程要逐個(gè)計(jì)算結(jié)點(diǎn)中各采樣點(diǎn)的SAH花費(fèi),然后選取最優(yōu)的采樣點(diǎn)作為該結(jié)點(diǎn)的分割位置。需要說明的是,由于目前的CUDA編程模型還不支持同一時(shí)間內(nèi)運(yùn)行多個(gè)kernel計(jì)算任務(wù),因此我們上述的BVH結(jié)構(gòu)在構(gòu)造初期、中期、后期所對(duì)應(yīng)的算法不會(huì)同時(shí)執(zhí)行,它們的執(zhí)行關(guān)系是互斥而又相互依賴的。為了保證每個(gè)線程的計(jì)算量大致相同,而不至于出現(xiàn)由于任務(wù)量負(fù)載不均而出現(xiàn)線程等待的情況,我們?nèi)匀徊捎脤挾葍?yōu)先的處理方式,按層次依次處理各個(gè)結(jié)點(diǎn),線程塊中的每個(gè)線程分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于5個(gè),最終產(chǎn)生葉子節(jié)點(diǎn)。另外,我們也同樣采用在構(gòu)造中期時(shí)使用的雙隊(duì)列形式來分別記錄父子結(jié)點(diǎn)信息,以避免使用鎖機(jī)制帶來的同步開銷。選擇一臺(tái)配有一顆IntelXeon3.7GHz的4核CPU,一顆NvidiaGTX285(1G顯存)的PC來實(shí)現(xiàn)我們的這個(gè)算法。我們使用Nvidia公司的CUDA編程框架,其為GPU計(jì)算提供了一個(gè)通用的C編程接口,方便編程者使用一些新的硬件特性。選擇具有不同幾何復(fù)雜度的動(dòng)態(tài)場(chǎng)景,Toys,Ben,Fairy,每個(gè)測(cè)試場(chǎng)景的分辨率為1024*1024,所以測(cè)試都包括了紋理、著色以及陰影部分。為了驗(yàn)證本BVH結(jié)構(gòu)的構(gòu)造速度和質(zhì)量,首先,我們從構(gòu)造時(shí)間、繪制幀率兩個(gè)方面,與在CPU上使用SIMD指令構(gòu)造BVH結(jié)構(gòu)并使用基于SIMD的光線包(光線包大小為2*2)進(jìn)行光線跟蹤計(jì)算的算法進(jìn)行對(duì)比,8如表1所示,所有場(chǎng)景都是在一個(gè)點(diǎn)光源下繪制的。表1<table>tableseeoriginaldocumentpage9</column></row><table>Fairy場(chǎng)景在加速結(jié)構(gòu)構(gòu)造時(shí)間⑶、幀率(FPS)以及SAH上的性能比較。可以看出,基于GPU實(shí)現(xiàn)的BVH結(jié)構(gòu)并行構(gòu)建算法,相比基于CPU實(shí)現(xiàn)的BVH結(jié)構(gòu)構(gòu)造算法,在構(gòu)造時(shí)間上獲得了近10倍的性能提升,在此基礎(chǔ)上實(shí)現(xiàn)的繪制性能也獲得近一倍的提升,尤其是對(duì)復(fù)雜場(chǎng)景表現(xiàn)了更為突出的性能,如Fairy場(chǎng)景,在繪制幀率上取得了近10倍的提升。需要指出的是,所有的測(cè)試場(chǎng)景均為動(dòng)態(tài)場(chǎng)景,由實(shí)驗(yàn)結(jié)果可見,本發(fā)明方法大大縮短了加速結(jié)構(gòu)的構(gòu)造時(shí)間,滿足了動(dòng)態(tài)場(chǎng)景對(duì)加速結(jié)構(gòu)的實(shí)時(shí)構(gòu)建要求,進(jìn)而達(dá)到了對(duì)動(dòng)態(tài)場(chǎng)景進(jìn)行實(shí)時(shí)光線跟蹤的要求。同時(shí),本發(fā)明還列出了所構(gòu)造的BVH結(jié)構(gòu)的SAH花費(fèi),可見本發(fā)明方法所生成的BVH結(jié)構(gòu)的質(zhì)量與CPU下由SIMD指令生成的BVH結(jié)構(gòu)的質(zhì)量相近,也就是說本發(fā)明方法在獲得更短構(gòu)造時(shí)間的同時(shí)并沒有降低所構(gòu)造的BVH結(jié)構(gòu)的質(zhì)量。為了進(jìn)一步驗(yàn)證本發(fā)明方法對(duì)硬件的并行使用能力,我們記錄了在構(gòu)造BVH結(jié)構(gòu)時(shí)標(biāo)量處理器的利用率,其直接反映了本BVH結(jié)構(gòu)的構(gòu)造方法能否有效使用硬件上的并行計(jì)算單元。注意,我們沒有使用ALU的使用情況作為這個(gè)實(shí)驗(yàn)的測(cè)試標(biāo)準(zhǔn),因?yàn)橛行r(shí)候即便線程槽已被占用,但ALU也可能因?yàn)樵L存延遲或者SIMD的低利用率而未被完全使用。我們將本方法與Gimther等的BVH構(gòu)造方法作比較,在BVH結(jié)構(gòu)構(gòu)造初期,本發(fā)明方法的優(yōu)勢(shì)并不明顯,如圖1所示(圖中的文獻(xiàn)[1]為(GtfNTHER,J.,POPOV,S.,SEIDEL,H.-P.,ANDSLUSALLEK,P.2007.RealtimeRayTracingonGPUwithBVH-basedPacketTraversal.InProceedingsoftheIEEE/EurographicsSymposiumonInteractiveRayTracing,113"U-118,2007.)o隨著構(gòu)造層次的加深,Gimther等的方法對(duì)GPU的有效利用率成超線性降低;而本發(fā)明方法則根據(jù)不同的構(gòu)造時(shí)期呈現(xiàn)波段性變化,由圖可見,當(dāng)構(gòu)造BVH結(jié)構(gòu)的第5層時(shí),GPU利用率陡然提高,這是因?yàn)闃?gòu)造算法切換到了構(gòu)造中期的構(gòu)造方式,此后GPU利用率穩(wěn)中略降;當(dāng)構(gòu)造BVH結(jié)構(gòu)的第22層時(shí),GPU利用率再一次陡然提高,這是因?yàn)闃?gòu)造算法切換到了構(gòu)造后期的構(gòu)造方式??傊?,本發(fā)明方法能夠保證在BVH結(jié)構(gòu)在構(gòu)造期間對(duì)GPU計(jì)算單元保持著較高的有效利用率。為了說明處理器處理核數(shù)對(duì)本算法在性能上的影響,做了如圖2的實(shí)驗(yàn),通過控制在GPU上使用的處理器核數(shù),我們分別列舉了Toys,Ben,F(xiàn)airy場(chǎng)景在不同處理器核數(shù)的條件下其加速結(jié)構(gòu)的構(gòu)造時(shí)間。由圖可見,本發(fā)明方法對(duì)不同的處理核數(shù)表現(xiàn)了良好的可擴(kuò)展性,隨著處理核數(shù)的不斷增加,所有測(cè)試場(chǎng)景的加速結(jié)構(gòu)的構(gòu)造時(shí)間均明顯減少;尤其是對(duì)于復(fù)雜場(chǎng)景的加速結(jié)構(gòu),處理核數(shù)的數(shù)量對(duì)構(gòu)造時(shí)間的影響差別較大,說明本發(fā)明方法更適合復(fù)雜場(chǎng)景下加速結(jié)構(gòu)的構(gòu)造。權(quán)利要求一種基于GPU的層次包圍盒快速構(gòu)造方法,其特征在于,包括(1)將GPU的活動(dòng)線程劃分為若干線程塊,通過構(gòu)建層次包圍盒對(duì)模型空間中的場(chǎng)景數(shù)據(jù)逐級(jí)進(jìn)行劃分,直至達(dá)到預(yù)定的級(jí)數(shù),其中所有的線程塊同時(shí)參與同一個(gè)場(chǎng)景節(jié)點(diǎn)的劃分;(2)每個(gè)線程塊分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于每個(gè)線程塊內(nèi)的線程數(shù);(3)每個(gè)線程分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于5個(gè);在步驟(2)和步驟(3)中劃分場(chǎng)景數(shù)據(jù)的具體步驟如下a)在存儲(chǔ)區(qū)域中建立兩個(gè)隊(duì)列,為第一隊(duì)列和第二隊(duì)列,分別存放用來存放等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn);b)當(dāng)GPU存在空閑線程塊或線程時(shí),從第一隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第二隊(duì)列;其中對(duì)第一隊(duì)列中編號(hào)為k的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第二隊(duì)列中的編號(hào)分別為2×k+t,其中t=0,1;場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置;c)當(dāng)?shù)谝魂?duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)處理完畢后,清空第一隊(duì)列中的所有節(jié)點(diǎn)數(shù)據(jù);當(dāng)GPU存在空閑線程塊或線程時(shí),從第二隊(duì)列中依次取等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分,并將產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)放入第一隊(duì)列,直至第二隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)都處理完畢;其中對(duì)第二隊(duì)列中編號(hào)為j的場(chǎng)景節(jié)點(diǎn)進(jìn)行劃分所產(chǎn)生的新的場(chǎng)景節(jié)點(diǎn)在第一隊(duì)列中的編號(hào)分別為2×j+t其中t=0,1;場(chǎng)景節(jié)點(diǎn)在隊(duì)列中的編號(hào)也對(duì)應(yīng)了該場(chǎng)景節(jié)點(diǎn)在存儲(chǔ)區(qū)域中的位置。d)循環(huán)步驟b)、步驟c),直至完成相應(yīng)的場(chǎng)景節(jié)點(diǎn)的劃分;當(dāng)每個(gè)隊(duì)列中等待進(jìn)行劃分的場(chǎng)景節(jié)點(diǎn)劃分完畢后,通過硬件支持的緊湊操作清除對(duì)該隊(duì)列中的空?qǐng)鼍肮?jié)點(diǎn)。2.如權(quán)利要求1所述的快速構(gòu)造方法,其特征在于,對(duì)模型空間中的場(chǎng)景數(shù)據(jù)進(jìn)行劃分時(shí)在需要進(jìn)行渲染的模型空間的三個(gè)坐標(biāo)軸上,分別計(jì)算采樣分割點(diǎn)的SAH花費(fèi),然后選取三個(gè)坐標(biāo)軸中花費(fèi)最小的分割點(diǎn),將選取的這個(gè)分割點(diǎn)作為分割平面。全文摘要本發(fā)明公開了一種基于GPU的層次包圍盒快速構(gòu)造方法,包括(1)將GPU的活動(dòng)線程劃分為若干線程塊,通過構(gòu)建層次包圍盒對(duì)模型空間中的場(chǎng)景數(shù)據(jù)逐級(jí)進(jìn)行劃分,直至達(dá)到預(yù)定的級(jí)數(shù),其中所有的線程塊同時(shí)參與同一個(gè)場(chǎng)景節(jié)點(diǎn)的劃分;(2)每個(gè)線程塊分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于每個(gè)線程塊內(nèi)的線程數(shù);(3)每個(gè)線程分別參與不同的場(chǎng)景節(jié)點(diǎn)的劃分,直至劃分到每個(gè)節(jié)點(diǎn)所含面片數(shù)不多于5個(gè)。本發(fā)明方法可有效利用硬件的并行計(jì)算能力,提高加速結(jié)構(gòu)的構(gòu)造速度和質(zhì)量。文檔編號(hào)G06T11/00GK101819675SQ201010150510公開日2010年9月1日申請(qǐng)日期2010年4月19日優(yōu)先權(quán)日2010年4月19日發(fā)明者楊鑫,許端清,趙磊申請(qǐng)人:浙江大學(xué)