在 GLSL 4.1 中使用 switch 语句
Using switch statements in GLSL 4.1
我最近读到一篇可怕的文章 post,其中有人声称 GLSL 中的 switch 语句不使用条件分支,实际上导致每次输入 switch 时每个可能的结果都是 运行。这让我很担心,因为我目前正在研究使用一些嵌套 switch 语句的延迟渲染引擎。
有谁知道这是否属实,是否有证据支持?
谢谢!
I read a terrifying post recently where someone claimed that a switch statement in GLSL uses no conditional branching, and in fact causes every possible outcome to be run every time the switch is entered.
这些都不一定是真的。至少,不是在今天的硬件上。
发生什么情况在很大程度上取决于编译器和底层硬件架构。所以没有一个答案。但它也非常依赖于另一件事:实际条件是什么。
看,编译器执行条件两边的原因与 GPU 的工作方式有关。 GPU 通过将线程组合在一起并以锁步方式执行它们来获得性能,每个线程组执行完全相同的步骤序列。使用条件分支,这是不可能的。所以要做一个真正的分支,你必须根据哪个线程执行哪个分支来分解一个组。
因此,如果这两个分支相当短,它将同时执行它们并丢弃未采用分支中的特定值。由于专门的操作码等,特定值的丢弃不需要破坏线程组。
好吧,如果条件是基于 expression which is dynamically uniform(即:在绘制中始终相同的表达式 call/context),那么编译器很有可能 不会执行双方。它会做一个真实的条件。
原因是,因为条件是动态统一的,组内的所有线程都会执行相同的代码。因此,无需将一组线程分解来执行适当的条件。
因此,如果您有一个基于 uniform
变量的 switch 语句,或仅涉及 uniform
和编译时常量变量的表达式,则没有理由期望它执行同时多个分支。
还需要注意的是,即使表达式不是动态统一的,编译器也不会总是执行两个分支。如果分支太长或太不同等等,它可以选择打散线程组。这会降低性能,但可能不如执行两个组那么多。真正由编译器决定如何去做。
我最近读到一篇可怕的文章 post,其中有人声称 GLSL 中的 switch 语句不使用条件分支,实际上导致每次输入 switch 时每个可能的结果都是 运行。这让我很担心,因为我目前正在研究使用一些嵌套 switch 语句的延迟渲染引擎。
有谁知道这是否属实,是否有证据支持?
谢谢!
I read a terrifying post recently where someone claimed that a switch statement in GLSL uses no conditional branching, and in fact causes every possible outcome to be run every time the switch is entered.
这些都不一定是真的。至少,不是在今天的硬件上。
发生什么情况在很大程度上取决于编译器和底层硬件架构。所以没有一个答案。但它也非常依赖于另一件事:实际条件是什么。
看,编译器执行条件两边的原因与 GPU 的工作方式有关。 GPU 通过将线程组合在一起并以锁步方式执行它们来获得性能,每个线程组执行完全相同的步骤序列。使用条件分支,这是不可能的。所以要做一个真正的分支,你必须根据哪个线程执行哪个分支来分解一个组。
因此,如果这两个分支相当短,它将同时执行它们并丢弃未采用分支中的特定值。由于专门的操作码等,特定值的丢弃不需要破坏线程组。
好吧,如果条件是基于 expression which is dynamically uniform(即:在绘制中始终相同的表达式 call/context),那么编译器很有可能 不会执行双方。它会做一个真实的条件。
原因是,因为条件是动态统一的,组内的所有线程都会执行相同的代码。因此,无需将一组线程分解来执行适当的条件。
因此,如果您有一个基于 uniform
变量的 switch 语句,或仅涉及 uniform
和编译时常量变量的表达式,则没有理由期望它执行同时多个分支。
还需要注意的是,即使表达式不是动态统一的,编译器也不会总是执行两个分支。如果分支太长或太不同等等,它可以选择打散线程组。这会降低性能,但可能不如执行两个组那么多。真正由编译器决定如何去做。