生成的SPIR-V代码应该优化吗?

时间:2017-04-30 23:56:45

标签: optimization vulkan spir-v

我正在考虑将一些代码从OpenGL / GLSL移植到Vulkan / SPIR-V,并且部分代码在运行时生成GLSL,因此我将不得不生成SPIR-V。我想知道的是我应该如何处理生成的SPIR-V中的优化。

特别是,我无法找到关于驱动程序编译器应该有什么样的期望的任何信息。我是否应该期望它自己进行积极的优化,从而尽量保持SPIR-V代码的清洁并尽可能多地保留“原始意图”以供编译器查看?或者我应该期望它做相当简单的代码生成,并尝试在生成SPIR-V时尽可能积极地进行优化?

或许对于特定的例子,在生成SPIR-V时我应该做哪些事情?

  • 消除冗余存储 - 然后加载局部变量?
  • 循环展开或剥离/功能内联?
  • 常数传播/公共子表达式消除?
  • 尽可能以SSA形式保留,而不是加载和存储到本地变量?

我非常天心的期望是编译器需要调整其优化传递以适应硬件的细节,因此我应该尝试保持我的SPIR-V代码清洁和高级别,例如循环展开等销毁信息并防止司机决定自己展开,但我真的只是在没有任何真实信息的情况下猜测。

1 个答案:

答案 0 :(得分:2)

您通常可以期望运行时编译器(在驱动程序中使用SPIR-V)进行大量标准优化。在许多实现中,它与GL驱动程序中的后端相同,并且执行大多数相同的优化。但是解析SPIR-V并将其转换为驱动程序的内部表示的过程将会更快,如果那里没有大量不必要的垃圾。因此,如果您正在编写自己的发生器,那么为生成“干净”的SPIR-V值得付出一些努力。

您可以查看shaderc,这是一个易于集成的库,它使用glslang进行GLSL到SPIR-V的转换,也可以运行spirv-opt来做一些你命名的优化随着spirv-opt获得额外的优化(在积极的开发中),shaderc会选择那些。