2017-04-30 32 views
0

我目前正在考慮將一些代碼從OpenGL/GLSL移植到Vulkan/SPIR-V,並且部分代碼會在運行時生成GLSL,所以我將不得不生成SPIR-V。我想知道的是,我應該如何關聯生成的SPIR-V中的優化。是否應該生成SPIR-V代碼進行優化?

特別是,我無法真正找到任何有關驅動程序編譯器的期望的信息。我是否應該期望它自己進行積極的優化,從而儘量保持SPIR-V代碼的清潔並儘可能保留「原始意圖」以供編譯器查看?或者我應該指望它做相當簡單的代碼生成,並嘗試在生成SPIR-V時儘可能進行積極的優化?

也許對於特定的例子,生成SPIR-V時應該做哪些類型的事情?

  • 消除冗餘存儲 - 然後加載局部變量?
  • 循環展開或剝離/函數內聯?
  • 常量傳播/通用子表達式消除?
  • 儘可能保持SSA形式,而不是加載和存儲到局部變量?

我很天真的期望是,編譯器將要調整其優化傳遞給硬件的細節,並且因此我要儘量保持我的SPIR-V代碼清潔和高層次的,其中這樣的事情循環展開會破壞信息並阻止駕駛員自行決定展開,但我真的只是猜測沒有任何真實的信息。

+0

「*所以我必須生成SPIR-V,而不是*」使用現有的GLSL-to-SPIR-V編譯器有問題嗎? –

+0

@NicolBolas:是的,我在運行時生成代碼,所以我不想依賴外部工具。 – Dolda2000

+0

您是否無法在運行時在代碼中包含編譯器?因爲它也以圖書館形式出現。 –

回答

2

您通常可以期望運行時編譯器(在驅動程序中使用SPIR-V)執行大量標準優化。在許多實現中,它與GL驅動程序中的後端是相同的後端,並且執行大部分相同的優化。但是,如果在那裏沒有太多不必要的垃圾,解析SPIR-V並將其翻譯成司機內部表示的過程將會更快。所以如果你正在編寫你自己的發生器,那麼值得投入一些精力來生成「乾淨的」SPIR-V。

您可以看看shaderc,它是一個易於集成的庫,它使用glslang進行GLSL到SPIR-V的轉換,並且還可以運行spirv-opt來執行一些優化你的名字。由於spirv-opt獲得額外的優化(正在積極開發中),shaderc會挑選這些優化。