關于GPU Family 4

這篇文章是對蘋果官網?https://developer.apple.com/documentation/metal/about_gpu_family_4?language=objc?文章的翻譯

了解A11功能,包括光柵順序組,tile著色器和圖像塊。

概述

GPUFamily 4描述了A11芯片及其蘋果設計的圖形處理單元(GPU)架構支持的新功能和性能增強功能。

iOS和tvOS設備中的GPU實現了一種稱為基于tile延遲呈現渲染(TBDR)的渲染技術,以優化性能和功耗效率。在傳統的即時模式(IM)渲染器中,當三角形提交到GPU進行處理時,它立即呈現給設備內存。三角形即使它們被稍后提交給GPU的其他圖元遮擋,他也會被光柵化和片段函數處理。

基于tile的延遲呈現渲染

TBDR對IM架構進行了一些重大改變,在提交了所有圖元之后才對其進行處理。屏幕被分割成單獨處理的圖塊。與tile相交的所有幾何圖形都被同時處理,遮蔽的片段在光柵化和片段著色階段之前被丟棄。一個tile被渲染進GPU上的快速本地存儲器,并且只有在渲染完成之后才被寫入設備存儲器。

TBDR允許頂點和片段級別異步運行-提供超過IM的顯著性能改進。 當運行著一個片段階段的渲染過程時,硬件并行運行著一個未來的頂點階段的渲染過程。頂點階段通常會大量使用固定功能硬件,而片段級使用計算器和帶寬。同時使用它們可以使得GPU所有的硬件塊得到充分的運用。

TBDR使用的tile內存有三個重要特征。首先,著色器核心和tile存儲器之間的帶寬比GPU和器件存儲器之間的帶寬高出許多倍,并且與著色器核心數量成正比。第二,tile內存的內存訪問延遲比訪問設備內存的延遲要低很多倍。 最后,tile內存的功耗明顯低于設備內存。

在基于A7至A10的設備上,Metal并沒有明確描述這種基于tile的架構;代替的,您可以使用它為底層實現提供提示。 例如,加載和存儲動作控制哪些數據被加載到本地存儲器中以及哪些數據被寫出到設備存儲器中。類似地,無記憶緩存器指定僅在渲染過程期間使用的每像素中間數據;在實踐中,該數據存儲在一個在快讀本地存儲內存中的tile中。

Metal2在A11的GPU

A11中的Apple設計的GPU提供了顯著增強TBDR的幾項功能。 這些功能通過附加的Metal 2 API提供,并允許您的應用和游戲實現新的性能和功能水平。

這些功能包括圖像塊,tile著色,光柵順序組,圖像塊樣本覆蓋控制和線程組共享。A11 GPU上的metal2也提高了片段廢棄性能。一般來說,這些功能可以更好地控制內存布局和訪問存儲在tile中的數據,并提供更細粒度的同步,以便在GPU上保持更多的工作。最終的結果是,您可以在單個渲染過程中執行比以前更多種類的計算,將計算保留在快速本地內存中。A11上的Metal2還簡化了一些技術諸如隱藏層的散射,無秩序的透明度和基于tile的燈光算法。

下面詳細介紹GPU

Family 4的一些特征:

1.關于圖像塊

了解圖像塊如何您定義和操作高帶寬tile內存中的像素數據結構。

概述

圖像塊是存儲在本地存儲器中的結構化圖像數據的tile,允許您描述A11圖形處理單元(GPU)可以有效操作的tile內存中的圖像數據。

它們與片段處理和A11的tile著色階段深度集成,并且還可用于計算內核。Metal通常在IOS設備上渲染圖像塊,但A11上的Metal 2通過將圖像塊視為已完全控制的數據結構來擴展此功能。

圖像塊用于用于在片段和tile之間傳遞數據的階段

圖1顯示了A11 GPU架構以及圖像塊如何在片段和tile傳遞數據階段的渲染過程。 雖然線程組存儲器適用于非結構化數據,但建議使用圖像塊作為圖像數據。

圖像塊結構

圖像塊是具有寬度,高度和像素深度的2D數據結構。 圖像塊中的每個像素可以由多個分量組成,并且每個分量可以被尋址為其自己的圖像切片。圖2顯示由代表反照率,鏡面反射率和正常分量的三個圖像切片組成的圖像塊。

圖像塊可用于內核和片段功能,并且在繪圖和調度的整個生命周期中持續存在。圖像塊持久化意味著您可以在單個渲染遍中混合渲染和計算操作,同時訪問相同的本地內存。 通過在tile中保持多個操作,您可以創建保留在本地GPU內存中的復雜算法。

您現有的代碼會自動創建與您的渲染attachments格式相匹配的圖像塊。 但是,您也可以在著色器中完全定義自己的圖像塊。 您定義的圖像塊可能比渲染attachments創建的圖像更復雜;例如,它們可以包括附加通道,數組和嵌套結構。此外,您定義的圖像塊可以在計算的不同階段用于不同的目的。

在片段著色器中,當前片段只能訪問與該片段中的位置相關聯的tile中的圖像塊數據。在計算功能中,線程可以訪問所有的圖像塊數據。 當使用具有attachments的渲染時,加載和存儲操作將繼續作為數據片段從tile內存中讀取和寫入的手段。

但是,如果您使用顯式的圖像塊,則可以使用計算函數來顯式讀取和寫入設備內存。通常可以通過使用內存硬件的塊傳輸來執行寫入。

2.關于Tile著色

了解如何在共享本地內存的同時將渲染和計算操作合并到單個渲染過程中。

概述

許多渲染技術需要繪制和計算命令的混合。傳統上,渲染和計算命令被分成不同的通行。這些過程無法直接相互通信;一次通過的結果被復制到設備內存中,只能通過下一遍復制回本地內存。在多相渲染算法中,中間數據可能被復制到設備存儲器多次,該過程被顯示在圖1。

tile著色器是作為渲染過程的一部分執行的計算或片段功能,允許在渲染階段之間使用持久內存進行計算。

圖2表明tile著色器工作的tile存儲器保留在圖形處理單元(GPU)的片上存儲器中。因此,您不必將中間結果存儲到設備內存中。 任何后續片段階段都可以從一個階段的tile內存獲得。

3.關于光柵順序組

了解如何精確控制訪問相同像素坐標的并行片段著色器線程的順序。

概述

Metal2引入了光柵順序組,它們從片段著色器提供有序的存儲器訪問,并簡化渲染技術,例如獨立于命令的透明度,雙層G緩沖區和體素化(體素化(Voxelization)是將物體的幾何形式表示轉換成最接近該物體的體素表示形式,產生體數據集,其不僅包含模型的表面信息,而且能描述模型的內部屬性)。

給定一個包含兩個重疊三角形的場景,Metal保證混合發生在繪制調用順序中,給出三角形被連續渲染的錯覺。圖一顯示顯示一個由三角形綠色部分遮擋的藍色三角形。

然而,在幕后,這個過程是高度平行的;多個線程同時運行,并且不能保證后三角形的片段著色器在前三角形的片段著色器之前執行。圖1顯示,雖然兩個線程同時執行,但是在繪圖調用順序中發生混合。

您的片段著色器中的自定義混合函數可能需要讀取后三角形片段著色器的結果在前三角形片段應用該函數之前。由于并發性,此讀-修改-寫序列可以產生競爭條件。 圖2顯示了線程2嘗試同時讀取線程1正在寫入的相同內存。

克服訪問沖突的光柵順序組

柵格順序組通過同步訪問相同像素坐標和樣本的線程來克服這種訪問沖突(如果每個樣本陰影被激活)。

您可以通過使用屬性限定符注釋到內存的指針來實現光柵順序組。然后,按照像素提交順序完成對這些指針的訪問。 在當前線程進行之前,硬件等待與當前線程重疊的任何舊片段著色器線程完成。

圖3顯示了光柵順序組如何同步兩個線程,以便線程2在嘗試讀取該內存之前等待寫入完成。

A11metal2的擴展光柵順序組

A11上的Metal

2擴展了具有附加功能的光柵順序組。 首先,它允許圖像塊和線程組存儲器的各個通道的同步。 其次,它允許創建多個順序組,讓您進行更精細的同步,并最大限度減少線程等待訪問的頻率。

A11圖形處理單元(GPU)上的光柵訂單組的附加功能提高性能的示例是延遲著色。 傳統上,延遲著色需要兩個階段。第一階段填充G緩沖區并產生多個紋理。 第二階段消耗這些紋理,并計算著色結果以渲染發光物體,如圖4所示。

由于中間紋理被寫入設備內存并從設備內存中讀取,因此延遲著色是帶寬密集型的。A11 GPU能夠利用多個順序組將兩個渲染階段合并成一個,從而無需中間紋理。 此外,它可以將G緩沖區保留在保留在本地圖像塊存儲器中的塊大小的塊中。

為了演示A11 GPU多個順序組如何提高延遲著色的性能,圖5顯示了傳統GPU如何調度線程用于照明階段。負責第二個Light的線程必須等待從先前的線程訪問完成之后才能開始。這種等待強制這兩個線程的執行順序運行,即使訪問不相互沖突。

圖6顯示了多個順序組如何允許您同時運行非沖突讀取,兩個線程在執行結束時同步以合成Light。通過將三個G緩沖區(反照率,正常和深度)聲明為第一組,累積的照明結果位于第二組來實現。

A11 GPU能夠分別對兩組進行排序,第二個組的寫入不需要等待第一個組的讀取。

對于多個順序組,更多的線程可以同時運行,從而允許更多的并行性和改進的性能。

4.關于增強型MSAA和圖像塊樣本覆蓋率控制

了解如何在tile著色器中訪問多采樣跟蹤數據,從而實現自定義MSAA解析算法的開發等。

概述

多采樣抗鋸齒(MSAA)是一種用于通過為每個像素使用多個深度和顏色樣本來改善原始邊緣外觀的技術。 圖1顯示了沒有MSAA渲染的三角形。 因為每個像素具有單個樣本位置,它被覆蓋或不被三角形覆蓋,導致鋸齒狀邊緣。

圖2顯示了使用4x MSAA渲染的相同三角形;也就是說,每個像素具有四個采樣位置。 圖形處理單元(GPU)對像素內的每個樣本的顏色進行平均以確定最終顏色。該過程導致更平滑的外觀并減少鋸齒狀邊緣。

蘋果的A系列GPU具有高效的MSAA實現。硬件跟蹤每個像素是否包含原始邊緣,以便只有在必要時,您的混合才能執行。 如果一個像素中的所有樣本均被單個圖元覆蓋,則GPU將整個像素混合一次。

圖像塊的樣本覆蓋率控制

A11上的metal2跟蹤每個像素的唯一樣本(或顏色)的數量,在渲染新圖元時更新此信息。例如,圖3中的像素包含兩個重疊三角形的邊緣,并且樣本位置被三個獨特的顏色覆蓋。在當前的A系列GPU中,該像素混合了三個覆蓋的樣本。 在A11 GPU上,這個像素只混合兩次,因為兩個覆蓋的樣本共享相同的顏色。 在這種情況下,索引1處的顏色是綠色和粉色的混合,索引2處的顏色是粉紅色。

A11上的metal2可以減少像素中獨特顏色的數量。在圖4中,一個額外的不透明三角形呈現在較早的圖元的頂部。 因為所有的樣品都被新的三角形覆蓋并且可以用單一的顏色表示,所以A11 GPU將三種顏色合并成一個。

此外,您可以訪問和修改tile著色器中的樣本覆蓋數據,以實現自定義分辨率算法。 例如,給出一個包含不透明和半透明幾何的獨立渲染階段的復雜場景,您可以在混合半透明幾何之前添加一個tile著色器來解析不透明幾何的樣本數據。使用A11上的Metal 2,此tile著色器用于本地內存中的數據,可以是不透明幾何相的一部分,如圖5所示。

5.關于線程組的共享

了解增強內存模型,允許在線程之間靈活高效地共享數據。

概述

A11上的Metal2引入了一種新的內存模型,它采用和擴展了C ++ 11一致性模型。 該模型具有新功能,允許線程組中的線程組和線程使用原子操作或內存柵欄彼此進行通信,而不是昂貴的阻塞。

線程組需要通信的一個例子是一個內核,它將浮點數組合,如圖1所示。傳統上,您可以使用內核來實現這個求和,該內核計算每個線程組的值之和,并將這些值寫入中間緩沖區。 因為這些線程組不能通信,所以您需要調度一個計算中間緩沖區值的最后一個總和的第二個內核。

因為啟動每個內核是有代價的,所以這種方法可能不是有效的。另外,因為第二個內核使用單個線程組,所以它不能完全利用圖形處理單元(GPU)。

使用線程組共享,一個內核和一個調度可以對輸入數組中的每個元素求和。您可以使用原子操作來計算已完成線程組的數量。 當所有的線程組已經完成時,最后一個執行的線程組可以計算最后的和總和,如圖2所示。

A11上的Metal2引入了原子函數,允許對內存位置進行互斥訪問,并允許您指定線程組內或跨線程組中的線程之間如何同步內存。 您為每個原子操作指定內存順序和內存范圍。

內存順序用于指定如何在同步操作周圍排列內存操作。內存順序可以relaxed -這是最快的模式,只提供獨占訪問原子操作的保證。 如果需要在線程之間同步數據,請使用acquire-release。 在這種模式下,寫入內存的線程執行釋放以允許線程獲取相同的內存并讀取最新的數據。

內存范圍是基于GPU內存層次結構和線程是否需要同步原子操作在一個SIMD組或者線程組或者設備。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容