我目前正在考虑将一些代码从OpenGL/GLSL移植到Vulkan/ SPIR-V,其中一部分代码在运行时生成GLSL,因此我不得不生成SPIR-V。我想知道的是,我应该如何与生成的SPIR-V中的优化相关联。
特别是,我真的找不到任何关于我应该对驱动程序的编译器有什么样的期望的信息。我是否应该期望它自己进行积极的优化,从而尽量保持SPIR代码的整洁,并尽可能多地保持“原始意图”,供编译器查看?或者,我应该期望它进行相当简单的代码生成,并在生成SPIR-V时尽可能地进行积极的优化?
也许对于特定的例子,在生成SPIR-V时,我应该做哪些事情呢?
我非常天真的期望是,编译器将希望使其优化传递适应硬件的具体情况,因此我应该尝试保持SPIR-V代码的干净和高级别,在这种情况下,循环展开会破坏信息并阻止驱动程序自行决定展开,但我真的只是猜测,没有任何真正的信息。
发布于 2017-05-01 01:40:32
您通常可以期望运行时编译器(在驱动程序中,使用SPIR-V)执行许多标准优化。在许多实现中,它与GL驱动程序中的后端相同,并且执行大多数相同的优化。但是,如果没有太多不必要的垃圾,解析SPIR并将其转换为驱动程序内部表示的过程将会更快。因此,如果您正在编写自己的生成器,就值得在生成“干净的”SPIR-V上付出一点努力。
您可能会看到遮阳,它是一个易于集成的库,它使用glslang作为GLSL到SPIR-V转换的俚语,还可以运行spirv-选择执行您命名的一些优化。当spirv-opt获得额外的优化(正在积极开发中),shaderc将获得这些优化。
https://stackoverflow.com/questions/43712587
复制相似问题