我最近为处理(一种类似于可以加载着色器的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;
}
答案 0 :(得分:4)
在旧GPU上,执行if()子句的两端并在结束时选择正确的结果。在较新的情况下,只有编译器认为它更有效时才会出现这种情况。 if()子句不是免费的:我用了一段时间的通用经验法则是:“if()花费14个时钟周期”,尽管最新的GPU可能更便宜。
为什么会这样?由于GPU是流处理器,因此他们希望为所有像素提供相同的数据加载配置文件(特别是对于渐变值,如纹理颜色或来自顶点寄存器的值)。 SIMD的原理 - 即使设备不是严格的SIMD - 通常也是从这些设备中获得最佳性能的方法。
如果有疑问,请查看您是否可以在代码中使用NVIDIA perf分析工具之一,或者尝试使用几种不同的方式编写代码(简短!)并比较特定GPU的性能。
(BTW Processing不像Java那样:它是Java)