生成和使用加速數據結構來有效地表示需要做相交測試的幾何體意味著GPU可能要完成一個全新的執行階段,然后我們需要用全新的接口函數處理這些新的數據結構,測試是否相交,之后在程序員的控制下根據相交測試的結果實現一些功能。GPU是并行的設計,所以同時處理一堆光線意味著什么?這樣做是否發現了新挑戰,而這些挑戰與傳統的幾何和像素并行處理所帶來的挑戰卻大不相同?
上一個問題的答案是非常肯定的,的確這些差異對如何將光線追蹤映射到現有的GPU執行的模型中有著深遠的影響。這些GPU存在計算資源和內存資源的不平衡,導致內存訪問成為一種寶貴的資源,而浪費這些資源是導致效率和性能低下的最主要原因之一。
哦不——我們做了些什么?
GPU被設計成可以任何形式充分利用與之連接的DRAM的訪問,利用內存訪問的空間或時間局部性來作為實現這一目的的方法。值得慶幸的是,最常見和最現代化的光柵化渲染有一個很好的特性,即在著色期間(尤其是像素著色通常是任何給定幀的主要工作負載)三角形和像素頂點有可能與它們的近鄰共享相關數據。因此,您訪問一組像素所需的任何緩存數據,很可能下一個相鄰的組將需要使用您已經從DRAM中提取并緩存的部分或全部內存數據。對于當今大多數柵格化渲染工作負載而言,這都是正確的,因此我們都可以松一口氣,并圍繞該屬性設計GPU架構。
當我們使用光線追蹤,這些就都失效了。光線追蹤使所有空間局部性消失。下面讓我們來分析其中的原因。
物體表面的問題
最簡單的思考方式就是觀察四周,在你坐下來閱讀這篇文章時注意光線在你所處環境中的作用。由于光線追蹤建模了光線從所有光源傳播時的屬性,因此它必須處理光線照射在場景中任何表面時發生的情況。也許我們只關心光線照射哪些物體,也許物體的表面以均勻的方向散射光線,但它也可能完全是隨機的。也許表面吸收了所有的光,因此不會有次級光線的傳播。也許表面有一種材質屬性,使它能夠部分吸收幾乎所有照射來的光線,然后隨機散射它不能捕獲的少量光線。
只有第一種場景可以映射到GPU的利用內存訪問局部性的工作模式,即使如此也只有當所有并行處理的光線都照射到同一類型的三角形時才可以。
正是這種明顯分歧的可能性導致了這些問題,如果并行處理的任何光線相互之間可能會有不同的作用,包括撞擊不同的加速數據結構或發出新的光線,那么GPU能高效工作的基本前提就會被破壞,而且這通常比在傳統的幾何圖形或像素處理中遇到的發散現象更具有破壞性。
相干性聚集
PowerVR對光線追蹤硬件加速的實現所做的是硬件光線追蹤和排序,它與當今行業內任何其他硬件光線追蹤加速相比都是獨一無二的,這對軟件方面來說是完全透明的,確保硬件上并行追蹤的發射光線具有潛在的相似性。我們稱之為相干性聚集。
硬件維護了一個數據結構,用于層次化的存儲軟件發出的正在被硬件處理的光線,并能夠根據它們的方向按它們在加速結構中前進的位置進行選擇和分組。這意味著當它們被處理時更可能共享存儲器中被訪問的加速數據結構中的數據,且額外的優勢是能夠最大化隨后要并行處理的光線-幾何體相交計算的數量。
通過分析由硬件調度的光線,我們可以確保以GPU友好的方式對它們進行分組,從而更高效地進行后續處理,這些是該系統成功的關鍵,有助于避免打破GPU行業為高效的光柵化渲染而精心設計的運行模式,這就避免了光線追蹤硬件對特殊類型存儲系統的需求,因此提供了與GPU的其他部分更容易集成的方案。