GLSL有条件的处罚

时间:2013-11-19 02:05:32

标签: glsl processing conditional

我最近为处理(一种类似于可以加载着色器的Java的可视语言)编写了我的第一批GLSL程序,这些程序最近会产生分形。在处理分形码的循环中,我有一个转义条件,如果一个点倾向于无穷大,它就会中断。

它工作正常,它类似于我通常编写非GLSL的代码。然而有人告诉我,每次执行条件时都会计算两条路径。我很难确切地发现GLSL中的条件引起了多少惩罚。

编辑:在遇到if时,我非常了解非GLSL,我们假设了一条路径。如果假设“正确”的路径一切都很好。如果假定“错误”路径,则丢弃“坏”工作并且指令沿着“正确”路径继续。罚款可能是3(或任何数量)的指示。我想知道是否有一些数字(3或其他)的指令是罚款,或者是否两条路径都是一直计算的。

如果解释不够清楚,以下是代码:

// Mandelbrot Set code
int i = 0;
float zr = x;
float zi = y;
for (; i < maxIterations; i++) {
    float sqZr = zr*zr;
    float sqZi = zi*zi;
    float twoZri = 2.0*zr*zi;
    zr = sqZr-sqZi+x;
    zi = twoZri+y;
    if (sqZr+sqZi > 16.0) break;
}

1 个答案:

答案 0 :(得分:4)

在旧GPU上,执行if()子句的两端并在结束时选择正确的结果。在较新的情况下,只有编译器认为它更有效时才会出现这种情况。 if()子句不是免费的:我用了一段时间的通用经验法则是:“if()花费14个时钟周期”,尽管最新的GPU可能更便宜。

为什么会这样?由于GPU是流处理器,因此他们希望为所有像素提供相同的数据加载配置文件(特别是对于渐变值,如纹理颜色或来自顶点寄存器的值)。 SIMD的原理 - 即使设备不是严格的SIMD - 通常也是从这些设备中获得最佳性能的方法。

如果有疑问,请查看您是否可以在代码中使用NVIDIA perf分析工具之一,或者尝试使用几种不同的方式编写代码(简短!)并比较特定GPU的性能。

(BTW Processing不像Java那样:它是Java)