我已经为 编写了我的前几个 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/