GLSL 有条件处罚

标签 glsl processing conditional

我已经为 编写了我的前几个 GLSL 程序。加工 (一种类似于 Java 的可视化语言,可以加载着色器)最近制作分形。在处理分形代码的循环中,我有一个转义条件,如果一个点趋于无穷大,它就会中断。

它工作正常,类似于我通常为非 GLSL 编写代码的方式。但是有人告诉我,每次执行条件时都会计算两条路径。我很难确切地找出 GLSL 中的条件造成了多少惩罚。

编辑 :据我所知,在非 GLSL 中出现 if 时遇到路径假定。如果假设“正确”的路径一切都很好。如果假定“错误”路径,则丢弃“坏”工作并且指令沿着“正确”路径继续。惩罚可能是 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;
}

最佳答案

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

为什么会这样?因为 GPU 是流处理器,所以他们希望所有像素都有相同的数据加载配置文件(尤其是对于纹理颜色或顶点寄存器值等梯度值)。 SIMD 的原理——即使设备不是严格的 SIMD——通常是从这些设备中获得最大性能的方法。

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

(顺便说一句,处理不像 Java:它是 Java)

关于GLSL 有条件处罚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061773/

相关文章:

c++ - segmentation 评估着色器链接错误

c++ - OpenGL/GLSL - 使用缓冲区对象来获取统一的数组值

java - 处理:未使用的代码错误

php - 基于多个变量状态的条件语句的良好设计模式

excel - (Excel) 基于相邻单元格值的条件格式

c++ - OpenGL 顶点着色器在 Linux 上速度很快,但在 Windows 上非常慢

java - 在两个不同的 vbo 之间进行插值时,网格面会迷失方向

java - 处理:如何检查 JSON 对象是否已绑定(bind)

java - 噪音()没有给我一个广泛的值

swift - xcode 8 测试版 3 : Expected ',' joining parts of a multi-clause condition