我目前正在考慮將一些代碼從OpenGL/GLSL移植到Vulkan/SPIR-V,並且部分代碼會在運行時生成GLSL,所以我將不得不生成SPIR-V。我想知道的是,我應該如何關聯生成的SPIR-V中的優化。是否應該生成SPIR-V代碼進行優化?
特別是,我無法真正找到任何有關驅動程序編譯器的期望的信息。我是否應該期望它自己進行積極的優化,從而儘量保持SPIR-V代碼的清潔並儘可能保留「原始意圖」以供編譯器查看?或者我應該指望它做相當簡單的代碼生成,並嘗試在生成SPIR-V時儘可能進行積極的優化?
也許對於特定的例子,生成SPIR-V時應該做哪些類型的事情?
- 消除冗餘存儲 - 然後加載局部變量?
- 循環展開或剝離/函數內聯?
- 常量傳播/通用子表達式消除?
- 儘可能保持SSA形式,而不是加載和存儲到局部變量?
我很天真的期望是,編譯器將要調整其優化傳遞給硬件的細節,並且因此我要儘量保持我的SPIR-V代碼清潔和高層次的,其中這樣的事情循環展開會破壞信息並阻止駕駛員自行決定展開,但我真的只是猜測沒有任何真實的信息。
「*所以我必須生成SPIR-V,而不是*」使用現有的GLSL-to-SPIR-V編譯器有問題嗎? –
@NicolBolas:是的,我在運行時生成代碼,所以我不想依賴外部工具。 – Dolda2000
您是否無法在運行時在代碼中包含編譯器?因爲它也以圖書館形式出現。 –