簡體   English   中英

Vulkan:統一緩沖區的奇怪性能

[英]Vulkan: weird performance of uniform buffer

我的片段着色器的輸入之一是包含 5 個結構的數組。 着色器根據 5 個結構中的每一個計算顏色。 最后,將這 5 種顏色相加以產生最終輸出。 數組的總大小為 1440 字節。 為了適應統一緩沖區的對齊,統一緩沖區的大小更改為 1920 字節。

1-如果我將 5 個結構的數組定義為統一緩沖區數組,則渲染需要 5ms(由 Nsight Graphics 測量)。 統一緩沖區的內存屬性是 'VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT'。 glsl中的uniform buffer定義如下

layout(set=0,binding=0) uniform UniformStruct { A a; } us[];

layout(location=0) out vec4 c;
    
void main() 
{
    vec4 col = vec4(0); 
    for (int i = 0; i < 5; i++)   
      col += func(us[nonuniformEXT(i)]);
    c = col;
}

此外,我正在使用“GL_EXT_nonuniform_qualifier”擴展來訪問統一緩沖區數組。 這對我來說似乎是最直接的方法,但還有其他實現方式。

2- 我可以將渲染從一個 vkCmdDraw 拆分為五個 vkCmdDraw,將幀緩沖區的混合模式從覆蓋更改為添加,並在片段着色器中定義一個統一緩沖區而不是統一緩沖區數組。 在 CPU 端,我將描述符類型從 UNIFORM_BUFFER 更改為 UNIFORM_BUFFER_DYNAMICS。 在每次 vkCmdDraw 之前,我都會綁定動態統一緩沖區和相應的偏移量。 在片段着色器中,for 循環被移除。 雖然看起來應該比第一種方法慢,但出乎意料地比第一種方法快得多。 5 次繪制的渲染總共只需要 2 毫秒。

3- 如果我將 5 個結構的數組定義為存儲緩沖區並執行一個 vkCmdDraw,則渲染只需 1.4 毫秒。 換句話說,如果我將數組從統一緩沖區數組更改為存儲緩沖區,但保持其他任何內容與 1 相同,它會變得更快。

4- 如果我在 glsl 中將 5 個結構的數組定義為全局常量並執行一個 vkCmdDraw,則渲染只需 0.5 毫秒。

在我看來,4應該是最快的方式,在測試中確實如此。 那么 1 應該是下一個。 2 和 3 都應該比 1 慢。但是,2 和 3 都不比 1 慢。相比之下,它們比 1 快得多。為什么使用統一緩沖區數組會減慢渲染速度? 是因為它是主機可見緩沖區嗎?

談到 UBO 時,有兩種硬件:UBO 是專用硬件的類型和非專用硬件的類型。 對於 UBO 不是專用硬件的 GPU,UBO 實際上只是一個readonly SSBO。 您通常可以分辨出差異,因為 UBO 專用的硬件對它們的大小限制與 SSBO 的大小限制不同。

對於基於硬件的專用 UBO(如果我沒記錯的話,NVIDIA 仍在使用),每個 UBO 表示從內存上傳到一大塊常量數據,特定着色器階段的所有調用都可以訪問這些數據。

對於這種硬件,一組 UBO 基本上是從這個常量數據塊的段中創建一個數組。 並且某些硬件具有多個常量數據塊,因此使用非常量表達式進行索引是很棘手的。 這就是為什么對此類索引的非持續訪問是 Vulkan 的可選功能。

相比之下,包含數組的 UBO 只是一個大 UBO。 它的特殊之處僅在於它有多大。 通過 UBO 中的數組進行索引與對任何數組進行索引沒有什么不同。 對於此類訪問的索引的一致性沒有特殊規則。

因此,停止使用 UBO 數組,而只使用包含數據數組的單個UBO:

layout(set=0,binding=0) uniform UniformStruct { A a[5]; } us;

它還可以避免由於對齊、額外的描述符、額外的緩沖區等而產生的額外填充。

但是,您也可以通過不對 Vulkan 撒謊來加快處理速度。 表達式nonuniformEXT(i)表明表達式i不是動態統一的 這是不正確的。 執行該循環將產生每着色器調用i具有從0到4的值的表達式表達的每個動態實例i任何調用將在代碼作為每隔那個地方相同的值。

因此i是動態統一的,所以告訴 Vulkan 它不是沒有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM