Apple Silicon TBDR:應用程式開發者實際獲得的能力
Apple silicon GPU的渲染方式與其他GPU不同。Apple的Metal文件以其名稱描述此架構:「Apple silicon中的GPU實作了一種稱為基於圖塊的延遲渲染(TBDR)的渲染技術,能夠最佳化效能與電力效率。」1 TBDR的形態正是Metal 4 API、裝置端ML堆疊,以及imageblock-and-tile-shader程式設計模型之所以以目前形態存在的原因。
以下章節將逐一介紹Apple文件記載的四項TBDR所啟用的功能,以及每一項為應用程式帶來的價值:imageblocks、tile shaders、raster order groups,以及增強型多重取樣抗鋸齒實作。先前關於Metal 4核心要點的文章已涵蓋核心API表面;本文聚焦於該表面所針對的GPU基礎層。
TL;DR
- TBDR將渲染目標切分為多個圖塊,在獨立的GPU核心上平行運行多個圖塊,並延遲著色作業,直到每個圖塊的所有幾何體皆完成評估後才執行。1
- 圖塊記憶體的頻寬比裝置記憶體快上許多倍、延遲低上許多倍,且能耗顯著更低。1
- A11及之後的Apple GPU新增了imageblocks、tile shading、raster order groups,以及imageblock取樣覆蓋控制。應用程式可透過Metal存取上述全部功能。1
- Imageblocks讓應用程式得以在圖塊記憶體中定義自訂的逐像素資料結構、跨繪製與分派持續保留資料,並在單一通道中混合渲染與運算工作。1
- Raster order groups能同步針對同一像素執行的片段執行緒,消除了讀取-修改-寫入的競爭情況——這種情況會破壞依賴順序的混合運算。1
TBDR的實際定義
Apple的原文敘述:「GPU將渲染目標切分為由較小區域組成的網格,這些區域稱為圖塊。GPU使用其中一個GPU核心處理每個圖塊,且通常同時運行多個。GPU會延遲(或推遲)每個圖塊的渲染階段,直到它評估完該圖塊的所有幾何體之後才執行。」1
與即時模式(IM)GPU的對比同樣出自Apple:「IM GPU會完整處理基本圖元,例如線條與三角形,無論它們在渲染中是否可見。」1 TBDR則先收集圖塊的所有幾何體,再僅對通過遮擋測試的部分進行著色,藉此避免不必要的工作。Apple直接點出此優勢:「TBDR GPU同時處理一個渲染通道的所有幾何體,並僅對可見的基本圖元進行著色,從而避免進行不必要的工作。」1
圖塊記憶體正是回報所在。Apple描述其相對於裝置記憶體的優勢:1
- 「頻寬比裝置記憶體快上許多倍」
- 「存取延遲比裝置記憶體低上許多倍」
- 「能耗顯著低於存取裝置記憶體的能耗」
兩個渲染通道在硬體上也可以重疊執行。Apple指出:「當GPU針對圖塊記憶體執行渲染通道的最後階段時,它可以開始下一個渲染通道的頂點階段。GPU可透過平行運行兩個階段同時使用更多的硬體區塊,因為這兩個階段往往使用不同的運算與記憶體元件。」1
這就是基礎層。以下所有內容皆奠基於此。
Imageblocks:圖塊記憶體中的自訂逐像素資料
Apple對imageblock的定義:「Imageblocks是儲存於本機記憶體中的結構化影像資料圖塊,讓您能夠描述圖塊記憶體中的影像資料,使Apple GPU能夠對其進行高效操作。」1 它們是具有寬度、高度與像素深度的二維資料結構,且「imageblock中的每個像素都可由多個分量組成,您可將每個分量視為其專屬的影像切片來定址。」1 Apple的範例:一個imageblock可容納三個影像切片,分別用於albedo、specular與normal分量。
Apple文件記載的形態:1
- 可供kernel函式與fragment函式使用。
- 在圖塊的生命週期中持續存在,跨繪製與分派均保留。
- 既有的渲染程式碼會自動建立與渲染附件格式相符的imageblocks。
- 應用程式可在著色器中定義自訂的imageblocks,包含額外的通道、陣列以及巢狀結構。
- Fragment著色器只能看到該片段位置的imageblock資料;compute函式的執行緒則可存取整個imageblock。
跨繪製與分派的持續性,是在實際運作上最值得關注的部分。Apple的說法:「Imageblock持續性意味著您可在單一渲染通道中混合渲染與運算操作,搭配tile shaders,兩者皆可存取相同的本機記憶體。您可透過將多個操作保留在一個圖塊內,建立留駐於本機GPU記憶體中的精密演算法。」1
對於採用多階段渲染管線(延遲著色、螢幕空間特效、自訂混合)的應用程式而言,將中介結果保留在圖塊記憶體中、而非經由裝置記憶體往返傳輸,正是TBDR所歸還的每幀預算。
Tile Shaders:渲染與運算,同一通道
Apple對tile shaders的描述:「Tile shaders是在渲染通道中執行的compute或fragment函式。它們讓您的應用程式能夠運算資料並儲存至圖塊記憶體,這些資料會在GPU上跨渲染通道持續存在。」1
傳統的GPU模型正是tile shaders所要繞開的對象。Apple的原文:「傳統GPU將渲染與運算指令分離至不同的通道。這些通道通常無法直接彼此通訊。應用程式為了繞過此限制,會將某一通道的結果儲存至裝置記憶體,再為下一個通道將該資料載回。在某些情境中,例如多階段渲染演算法,應用程式可能需要將中介資料多次複製到裝置記憶體。」1
Tile shaders將這些中介資料移入圖塊記憶體中。Apple文件記載的回報:「使用tile shaders的應用程式可避免將中介結果儲存至裝置記憶體,並透過將資料儲存於更快的圖塊記憶體節省時間。」1
對於Metal 4應用程式,tile shaders會與Metal 4核心要點文章中介紹的統一MTL4ComputeCommandEncoder設計搭配使用。編碼器的統一化與tile-shader程式設計模型,是同一個架構決策在兩個層面上的體現:消除傳統GPU上存在的渲染對運算邊界,因為Apple GPU硬體並不需要這些邊界。
Raster Order Groups:為並行片段執行緒排序
Raster order groups所解決的問題,以Apple的原文表述:「Metal保證GPU會依照繪製呼叫的順序進行混合,營造出GPU依序渲染場景的錯覺。……每個三角形的fragment shaders會在各自的執行緒上並行運行。後方三角形的fragment shader不一定會在前方三角形的fragment shader之前執行,這對於需要從另一個三角形的著色器取得結果以進行自訂混合運算的著色器而言,可能會構成問題。由於並行執行,此讀取-修改-寫入序列可能產生競爭情況。」1
機制:「Raster order groups透過同步針對相同像素座標與取樣(若您啟用每取樣著色)的執行緒,克服此存取衝突。」1
實作介面:「若要實作raster order groups,請以屬性限定符標註指向記憶體的指標。透過該指標存取像素的著色器會依逐像素提交順序執行。硬體會等待任何與目前執行緒重疊的較早fragment shader執行緒完成後,目前執行緒才會繼續。」1
近期的Apple GPU擴充了此機制。Apple的原文:「近期Apple GPU上的Metal以額外功能擴充raster order groups。它們讓您能夠同步imageblock的個別通道與threadgroup記憶體。您也可建立多個order groups,讓您獲得更細緻的同步控制,並將執行緒等待存取的頻率降至最低。」1
Apple的實際範例是延遲著色。傳統的兩階段做法會將由多個紋理組成的g-buffer寫入裝置記憶體,再為照明階段將它們讀回。Apple的說法:「您可透過使用多個order groups將兩個渲染階段合併為一個,藉此排除中介紋理的需求。要做到這一點,請將幾何緩衝區保留在圖塊大小的區塊中,使其得以留在本機imageblock記憶體中。」1
Apple建議的劃分方式:1
- 第一個order group:g-buffer的三個欄位(albedo、normal、depth)。
- 第二個order group:累積的照明結果。
- 「Apple GPU可分別為兩個群組排序,使得對第二個群組的待處理寫入不會妨礙從第一個群組進行的讀取。」1
兩個執行緒仍會在執行尾聲進行同步以累積光源。所獲得的優勢在於:互不衝突的讀取得以並行執行,而非循序執行。
追蹤每像素獨特取樣的MSAA
Apple文件記載的MSAA實作在A11+ GPU上與教科書描述有所差異。Apple的說法:「硬體會追蹤每個像素是否包含基本圖元的邊緣,因此僅在必要時才會執行每取樣混合。若另一個基本圖元覆蓋了像素內的取樣,GPU只會為整個像素混合一次。」1
Apple的範例展示此最佳化的運作方式。被兩個重疊三角形邊緣覆蓋的像素,會在四個取樣位置上產生三種獨特顏色。Apple的原文:「A11之前的Apple GPU會混合該像素三個被覆蓋的取樣中的每一個。從A11開始,Apple GPU只進行兩次混合,因為兩個取樣共享相同的顏色。」1
顏色縮減更進一步。Apple:「Apple GPU可減少像素中獨特顏色的數量。例如,若GPU在先前的三角形之上渲染一個不透明的三角形,它會以單一顏色代表該像素。」1
應用程式可透過tile shaders擴充此實作。Apple文件記載的使用案例:「您可透過在tile shaders中修改取樣覆蓋資料來實作自訂的解析演算法。例如,考慮一個包含不透明與半透明幾何體分離渲染階段的複雜場景。您可加入一個tile shader,在混合半透明幾何體之前先解析不透明幾何體的取樣資料。」1
該tile shader會對本機記憶體中的資料運行,並可作為不透明幾何體階段的一部分,將解析作業保留在圖塊記憶體中,而非經由獨立的通道往返傳輸。
這對應用程式架構的意義
從Apple文件介面所衍生出的三項要點:
-
圖塊記憶體就是預算。 上述四項功能(imageblocks、tile shaders、raster order groups、取樣覆蓋)的存在,都是為了將工作保留在圖塊記憶體中、避免進入裝置記憶體。Apple文件記載的數據:頻寬比裝置記憶體快上許多倍、延遲低上許多倍、能耗顯著更低。1 尊重此預算的應用程式架構,會比不尊重者運行得更快、更涼。
-
渲染與運算並非分屬不同世界。 Apple的GPU不會像傳統GPU那樣將渲染與運算劃分為獨立通道。Imageblock持續性與tile shaders讓應用程式得以在單一渲染通道內運行多階段演算法。Metal 4的統一compute encoder正是同一架構事實在API層級上的展現。
-
並行是預設值;排序是選擇性加入。 Raster order groups是應用程式宣告「這個讀取-修改-寫入序列依賴於順序」的方式。預設是無序並行,這是GPU的天然形態。需要為混合、透明度或g-buffer寫入採用有序存取的應用程式,會標註特定指標,並讓硬體為這些執行緒排序。
完整的Apple Ecosystem系列:Metal 4核心API介紹針對此硬體的平行API表面;Foundation Models裝置端LLM介紹在同一矽晶片上運行ML的框架;Core ML裝置端推論介紹更廣泛的ML堆疊。系列總覽位於Apple Ecosystem系列。
FAQ
TBDR是Metal 4專屬的嗎?
不是。Apple silicon GPU已跨多個GPU世代實作TBDR;Metal 4則是針對它們的全新核心API表面。本文記載的TBDR功能(imageblocks、tile shaders、raster order groups、A11+取樣覆蓋控制)可透過Metal,在原本的MTL前綴API與MTL4前綴的Metal 4類型上運作。1
Imageblock與threadgroup記憶體的差別是什麼?
Apple文件記載的區別:「Threadgroup記憶體適用於非結構化資料,而imageblock更適合影像資料。」1 Imageblocks具有二維結構、寬度、高度、像素深度,以及具名的逐像素分量;threadgroup記憶體則是平坦的配置。需要具備可定址切片的結構化影像資料的應用程式會使用imageblocks;需要為compute kernel提供暫存緩衝區的應用程式則使用threadgroup記憶體。
既然Metal已保證以繪製呼叫順序進行混合,為何還需要raster order groups?
Metal保證循序混合的外觀,但GPU實際上是並行運行fragment shaders。Apple的說法:對另一個三角形的結果執行自訂混合的著色器會碰上競爭情況,因為兩個執行緒實際上並非循序執行。Raster order groups是僅同步針對同一像素的執行緒、保留其餘執行緒並行執行的機制。1
我何時應該撰寫自己的MSAA解析演算法?
Apple記載了一個具體案例:包含不透明與半透明幾何體分離階段的場景,其解析作業在不透明階段之後、半透明混合之前運行。1 對大多數應用程式而言,硬體內建的MSAA實作已足以處理此項工作;自訂解析是針對Apple文件所描述特定邊角案例的工具。
Apple的MSAA最佳化是如何節省工作的?
Apple的硬體會在渲染新的基本圖元時追蹤每個像素的獨特取樣數。Apple的範例:被兩個三角形邊緣覆蓋的像素在四個取樣位置上有三種獨特顏色;A11+ GPU會混合兩次而非三次,因為兩個取樣共享一個顏色,而稍後出現的不透明三角形會將該像素縮減回單一顏色。1 此最佳化於硬體層級運行;應用程式無需API變更即可獲得此效益。
除了TBDR頁面之外,Apple GPU架構還有其他文件記載嗎?
Apple在Metal文件中的「Apple silicon」主題連結至本文所依據的TBDR頁面。Apple的WWDC場次也涵蓋GPU架構細節,而Metal Shading Language Specification則涵蓋著色器層級的介面。Apple尚未在開發者文件中針對特定Apple GPU世代發布底層的矽晶片層級細節(叢集數量、ALU寬度、光柵化引擎細節);對於在developer.apple.com之外找到的任何此類數據,請視為未經驗證。