Using switch statements in GLSL 4.1



我最近读到一篇可怕的帖子,有人声称GLSL中的switch语句不使用条件分支,事实上,每次输入switch时都会运行所有可能的结果。这让我很担心,因为我目前正在开发一个延迟渲染引擎,该引擎使用一些嵌套的switch语句。

有人知道这件事是否属实吗?有证据支持吗?

谢谢!

我最近读到一篇可怕的帖子,有人声称GLSL中的switch语句不使用条件分支,事实上,每次输入switch时都会运行所有可能的结果。

这两者都不一定是真的。至少,不是在今天的硬件上。

发生的情况在很大程度上取决于编译器和底层硬件体系结构。所以没有一个答案。但它也非常依赖于另一件事:实际情况是什么

请看,编译器之所以会同时执行条件的两侧,与GPU的工作方式有关。GPU通过将线程分组在一起并以锁步执行来获得性能,每个线程组执行完全相同的步骤序列。对于条件分支,这是不可能的。因此,要做一个真正的分支,必须根据执行哪个分支的单个线程来分解一个组。

因此,如果这两个分支相当短,它将同时执行它们,并丢弃未执行分支中的特定值。由于特殊的操作码等原因,值的特殊丢弃不需要中断线程组。

好吧,如果条件是基于一个动态一致的表达式(即:在绘图调用/上下文中始终相同的表达式),那么编译器很有可能不会同时执行。这将是一个真实的条件。

原因是,因为条件是动态统一的,所以组中的所有线程都将执行相同的代码。因此,没有必要破坏一组线程来实现适当的条件。

因此,如果您有一个基于uniform变量的switch语句,或者只有涉及uniform和编译时间常数变量的表达式,那么就没有理由期望它同时执行多个分支。

还应该注意的是,即使表达式不是动态统一的,编译器也不会总是执行两个分支。如果分支太长或太不同或其他什么,它可以选择拆分线程组。这可能会降低性能,但可能不会像执行两个组那样多。这实际上取决于编译器来解决如何做到这一点。

最新更新