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

Should generated SPIR-V code be optimized?

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

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

也许只是为了特定的例子,在生成 SPIR-V 时我应该做哪些事情?

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

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

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