0

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

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

仅针对特定示例,在生成 SPIR-V 时我应该做哪些事情?

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

我非常天真的期望是编译器将希望调整其优化传递以适应硬件的细节,因此我应该尝试保持我的 SPIR-V 代码干净和高级,其中诸如循环展开之类的事情会破坏信息和阻止驱动程序自行决定展开,但我真的只是在猜测,没有任何真实信息。

4

1 回答 1

3

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

您可能会看一下shaderc,它是一个易于集成的库,它使用 glslang 进行 GLSL 到 SPIR-V 的翻译,还可以运行 spirv-opt 来执行您指定的一些优化。随着 spirv-opt 获得额外的优化(在积极开发中),sharc 会选择这些。

于 2017-05-01T01:40:32.310 回答