我目前正在考虑将我的一些代码从 OpenGL/GLSL 移植到 Vulkan/SPIR-V,其中部分代码在运行时生成 GLSL,因此我将不得不生成 SPIR-V。我想知道的是我应该如何与生成的 SPIR-V 中的优化相关联。
特别是,我真的找不到任何关于我应该对驱动程序的编译器有什么样的期望的信息。我是否应该期望它自己进行积极的优化,从而尝试保持 SPIR-V 代码的清洁并在其中尽可能多地保留“原始意图”以供编译器查看?或者我应该期望它进行相当简单的代码生成,并在生成 SPIR-V 时尝试进行尽可能积极的优化?
仅针对特定示例,在生成 SPIR-V 时我应该做哪些事情?
- 消除冗余存储然后加载局部变量?
- 循环展开或剥离/函数内联?
- 恒定传播/公共子表达式消除?
- 尽可能保持 SSA 形式,而不是加载和存储到局部变量?
我非常天真的期望是编译器将希望调整其优化传递以适应硬件的细节,因此我应该尝试保持我的 SPIR-V 代码干净和高级,其中诸如循环展开之类的事情会破坏信息和阻止驱动程序自行决定展开,但我真的只是在猜测,没有任何真实信息。