我知道GPU程序中的分支(着色器,CUDA,CL,...)与CPU程序中的分支表现不同(性能方面)。通常,着色器的实例被分组,来自同一组的实例计算相同的路径。如果在一个组中有一个实例想要获取一个路径而另一个实例想要获取另一个路径,则会评估这两个路径,如果经常发生这种情况,这可能会降低性能。
但是如果着色器程序的 所有实例 采用 相同路径 ,该怎么办?即如果分支仅受单个布尔均匀值的影响怎么办?特别是与无分支相比(即在着色器程序的编译期间消除分支;在宿主程序中保留两个着色器程序对象并在需要时交换它们)。
uniform bool dosomething = false;
...
if (dosomething) {
expensiveStuff();
}
...
上面我谈到了一个分支;但是如果分支甚至处于循环中呢?可以“检测”它是否始终采用相同的路径(a)着色器的所有实例+(b)所有循环迭代?
考虑像光线行进这样的东西,其中一些计算上昂贵的细节被制服触发/影响。
...
for (float t = 0; t < 1; t += step) {
foo();
if (dosomething) {
expensiveStuff();
}
}
...
是否值得将代码转换为这样的代码(如果可能的话)?
...
if (dosomething) {
for (float t = 0; t < 1; t += step) {
foo();
expensiveStuff();
}
} else {
for (float t = 0; t < 1; t += step) {
foo();
}
}
...
我的目标主要是NVIDIA和AMD GPU(GL版本> = 4.0),但我对更“一般”的答案感兴趣,即基于专业着色器编程的经验,因为我没有。< / p>
答案 0 :(得分:2)
是否值得将代码转换为这样的代码(如果可能的话)?
是
虽然GLSL编译器可以进行优化,但没有规范保证它 。