基于Intel眾核架構(gòu)的光線追蹤并行優(yōu)化方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及圖形學(xué)真實(shí)感渲染領(lǐng)域,具體涉及一種基于Intel眾核架構(gòu)的光線追蹤并行優(yōu)化方法。
【背景技術(shù)】
[0002]光線追蹤是真實(shí)感渲染的重要算法,通過跟蹤與真實(shí)世界傳播方向相反的光線(即從眼睛出發(fā)到光源),將三維空間場景呈現(xiàn)為二維的平面圖像。光線追蹤能夠很好的實(shí)現(xiàn)反射、折射、散射、陰影等一系列真實(shí)感渲染結(jié)果,并且可以模擬全局光照效果,被廣泛應(yīng)用于虛擬現(xiàn)實(shí)、廣告影視、動畫游戲等領(lǐng)域。
[0003]雖然光線追蹤算法生成的圖像逼真度高,但是該算法需要發(fā)射大量的光線進(jìn)行計算,除了需要計算光源對場景中物體的影響,還需要計算被場景中物體反射、折射或者散射的光線對物體的影響。無偏全局光照算法通過大量采樣光線計算可以得到精確解,但是需要消耗大量時間,這使得光線追蹤方法在電影制作中的廣泛應(yīng)用受到了很大限制。在保證渲染質(zhì)量的前提下,提高渲染速度始終是該算法的研宄熱點(diǎn)之一。
[0004]在CPU的急速發(fā)展遇到了單個核心性能提升的瓶頸,單顆CPU的計算能力難以獲得大幅度提升的情況下,多核成為了最理想的計算速度提升方案。隨著并行計算的發(fā)展,出現(xiàn)了多種多核、眾核的處理器以及協(xié)處理器。例如NVIDIA推出的CUDA架構(gòu),擁有幾百個GPU核心的協(xié)處理器設(shè)備,但由于CUDA的編程方式復(fù)雜,且支持的程序并行方式較為單一,不利于已有的軟件向新平臺移植。近年Intel推出了 Xeon Phi平臺,具有多個x86架構(gòu)核心的協(xié)處理器Xeon Phi眾核架構(gòu),該架構(gòu)為高計算量、高存儲器帶寬的應(yīng)用需求設(shè)計,適用于更為復(fù)雜而靈活的編程方式,故Intel眾核架構(gòu)適用于光線追蹤方法復(fù)雜的遞歸流程。
[0005]在現(xiàn)代CPU和GPU這些可編程架構(gòu)下,實(shí)現(xiàn)光線追蹤算法的加速的關(guān)鍵是高效的利用其SIMD (Single Instruct1n Multiple Data,單指令多數(shù)據(jù)流)單元,許多現(xiàn)有的硬件架構(gòu)都有很寬的SMD處理單元:Intel CPU有8的單位寬的AVX處理單元,而GPU有16單位寬甚至更寬的SMD處理單元。想要高效利用這種硬件優(yōu)勢,最大的挑戰(zhàn)就是重新組織光線追蹤算法,使得硬件所有的SIMD通道盡可能的實(shí)施相同的算術(shù)操作。
[0006]—個常見的技術(shù)是Wald等人提出的基于光線包(rays packet)利用SIMD單元的方法,該方法使一包光線沿著一條相同的遍歷路徑進(jìn)行光線包和場景樹的求交計算,如果其中部分光線不沿著這條路徑繼續(xù)向下追蹤,則阻塞這些光線。對于一致性光線(coherentrays),該方法一方面能獲得很高的SIMD利用率,另一方面能充分利用幾何數(shù)據(jù)的空間局部性,降低存儲器訪問的帶寬瓶頸,這兩方面的特性使光線包追蹤(packet tracing)獲得很好的加速效果,尤其是對一致性很好的初級光線(primary rays)。
[0007]這種方法存在的缺陷是:當(dāng)光線包中的光線缺乏一致性時,性能則明顯下降,活躍光線數(shù)目會迅速減少。而在真實(shí)應(yīng)用中,非一致性光線非常普遍,例如采用擬蒙特卡洛方法(Quas1-Monte Carlo method)模擬光線的物體傳播過程,對于場景中大量的漫反射表面,會使光線發(fā)散嚴(yán)重,因此大部分光線追蹤模擬無法獲得很好的加速效果,所以商用的渲染引擎往往不采用這種方式。
[0008]另外一種硬件加速方式是使用SMD單元獨(dú)立地追蹤多條光線,這樣每一個SMD通道都有自己的光線和遍歷棧,GPU的架構(gòu)適合用這種方式。這種方法存在的問題是:當(dāng)不同的SMD通道執(zhí)行不同的代碼路徑的時候,SMD的效率也不是很高。而且這種方法需要多個獨(dú)立的遍歷棧和臨時變量,從而需要很多寄存器和局部存儲空間,導(dǎo)致線程調(diào)度延遲、效率降低。此外,如果光線是一致性的,那么所有SMD通道產(chǎn)生的尋址操作相鄰,但是一旦光線分散的嚴(yán)重,就會產(chǎn)生多個完全不一致的內(nèi)存訪問請求,不利于存儲系統(tǒng)的優(yōu)化。
【發(fā)明內(nèi)容】
[0009]為了解決現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明提供一種適用范圍廣,穩(wěn)定性高且運(yùn)行速度快的基于Intel眾核架構(gòu)的光線追蹤并行優(yōu)化方法。
[0010]為實(shí)現(xiàn)上述目的,本發(fā)明采用以下技術(shù)方案:
[0011]一種基于Intel眾核架構(gòu)的光線追蹤并行優(yōu)化方法,包括以下步驟:
[0012]步驟⑴:建立空間加速結(jié)構(gòu)階段;
[0013]建立場景數(shù)據(jù)的空間索引BVH空間加速結(jié)構(gòu),所述BVH空間加速結(jié)構(gòu)為適用于Intel眾核硬件的數(shù)據(jù)結(jié)構(gòu);
[0014]步驟(2):生成初級光線階段;
[0015]按像素把屏幕空間劃分成若干屏幕子空間并采樣,產(chǎn)生初級光線;對產(chǎn)生的光線根據(jù)其空間位置關(guān)系分組,同一組的光線組成一個光線束;
[0016]步驟(3):追蹤光線階段;
[0017]上傳BVH空間加速結(jié)構(gòu)和場景幾何數(shù)據(jù),Intel眾核架構(gòu)與CPU之間采用異步傳輸方式進(jìn)行通信,主線程開啟若干子線程,每個子線程對每一塊屏幕子空間產(chǎn)生的初級光線按光線束來追蹤光線,得到每條光線與場景最近的交點(diǎn);
[0018]步驟(4):交點(diǎn)著色階段;
[0019]對步驟(3)中追蹤光線得到的交點(diǎn)進(jìn)行著色;若著色的過程成產(chǎn)生次級光線,則遞歸進(jìn)入步驟(3);著色最終得到初級光線的顏色,最后疊加到屏幕合成最終圖像。
[0020]所述BVH空間加速結(jié)構(gòu)采用四分支BVH結(jié)構(gòu),四分支BVH結(jié)構(gòu)中每個結(jié)點(diǎn)有四個子結(jié)點(diǎn),四分支BVH結(jié)構(gòu)中每個結(jié)點(diǎn)的數(shù)據(jù)域存儲四個子結(jié)點(diǎn)的包圍盒。
[0021]所述每個結(jié)點(diǎn)的四個子結(jié)點(diǎn)連續(xù)存放,每四個子結(jié)點(diǎn)的左下點(diǎn)連續(xù)存放,四個右上點(diǎn)連續(xù)存放。
[0022]所述建立BVH空間加速結(jié)構(gòu)的具體過程為:
[0023]根據(jù)當(dāng)前結(jié)點(diǎn)的包圍盒所包含的場景幾何面片的空間位置關(guān)系,對當(dāng)前包圍盒中的場景幾何面片進(jìn)行聚類,聚成四個分組,每個分組形成一個新的包圍盒,生成的四個包圍盒作為當(dāng)前結(jié)點(diǎn)的四個子結(jié)點(diǎn),并且把四個子結(jié)點(diǎn)的幾何信息存到當(dāng)前結(jié)點(diǎn)的數(shù)據(jù)域;然后對這個四個子結(jié)點(diǎn)再做聚類操作,這樣逐層建立空間加速結(jié)構(gòu)。
[0024]所述步驟(2)中生成初級光線階段,包括如下步驟:
[0025]步驟(2.1):將屏幕空間看成是一個二維空間,按照像素數(shù)目把整個空間劃分成一定長度和寬度的網(wǎng)格,每一塊稱為一個桶bucket,之后主線程開啟若干子線程,每個子線程將以網(wǎng)格中的一個格子為單位進(jìn)行任務(wù)申請;
[0026]步驟(2.2):對每個bucket中的每個像素進(jìn)行一定數(shù)目的采樣,采樣生成的點(diǎn)作為初級光線的起點(diǎn),再根據(jù)采樣的起點(diǎn)和投影方式,得到光線的方向,這樣一條光線就可以通過參數(shù)形式表達(dá)的公式為:
[0027]r (t) = from+dir X t (I)
[0028]公式⑴中的r(t)表示光線的參數(shù)形式,from表示光線的起點(diǎn),dir是光線的方向向量,t表示光線的長度參數(shù)。
[0029]所述步驟(3)中追蹤光線階段,包括如下步驟:
[0030]步驟(3.1):上傳BVH空間加速結(jié)構(gòu)和空間幾何數(shù)據(jù),CPU開啟若干子線程進(jìn)行光線追蹤,子線程進(jìn)行光線追蹤時共享BVH空間加速結(jié)構(gòu)和空間幾何這些數(shù)據(jù);
[0031]步驟(3.2):采用offload異步傳輸?shù)姆椒▉韰f(xié)調(diào)CPU多線程與Intel眾核架構(gòu)的通信;
[0032]步驟(3.3):每個子線程對劃分好網(wǎng)格的屏幕空間申請任務(wù),每次追蹤一個格子的光線。
[0033]所述步驟(3.1)中的追蹤光線的過程為:
[0034]首先求得一條光線和BVH空間加速結(jié)構(gòu)的交點(diǎn);然后根據(jù)這一交點(diǎn)的著色器屬性,判斷是否產(chǎn)生下一級光線,繼續(xù)追蹤,最后收集各級光線追蹤的結(jié)果逐級返回。
[0035]提前上傳當(dāng)前計算需要的數(shù)據(jù),在計算同時傳輸下一次計算所要求的數(shù)據(jù),待到下一次計算開始前,傳輸完畢其所需要的數(shù)據(jù)。
[0036]所述步驟(4)中交點(diǎn)著色階段,包括如下步驟:
[0037]步驟(4.1):光線追蹤返回每條光線相交的物體,根據(jù)光線關(guān)聯(lián)的相交物體將光線追蹤得到的交點(diǎn)分類;
[0038]步驟(4.2):計算同類交點(diǎn)的顏色
[0039]當(dāng)不需要產(chǎn)生次級光線時,直接得到交點(diǎn)的顏色值返回給屏幕像素;當(dāng)需要產(chǎn)生次級光線時,則生成次級光線,追蹤次級光線進(jìn)入步驟(3),直到返回顏色值后繼續(xù)計算當(dāng)前交點(diǎn)的顏色,返回給屏幕像素,直到所有的初級光線都追蹤完畢,最終合成最終圖像。
[0040]所述步驟(4.1)中光線追蹤得到的交點(diǎn)分類的具體過程為:
[0041]位于同一個物體的光線追蹤得到的交點(diǎn)作為一組,分組之后按照物體調(diào)用相應(yīng)的著色器程序,位于同一個物體的交點(diǎn)一起計算交點(diǎn)的顏色。
[0042]本發(fā)明的有益效果為:
[0043]I)提出適用于Intel眾核架構(gòu)的空間加速結(jié)構(gòu)的組織形式,使之從內(nèi)存布局和數(shù)據(jù)對齊兩方面分別適應(yīng)于Intel眾核架構(gòu)向量化計算和加速存儲器訪問。
[0044]2)對主處理器和協(xié)處理器之間的數(shù)據(jù)傳輸方式進(jìn)行了