【发布时间】:2013-12-05 04:13:45
【问题描述】:
我知道 GPU 程序中的分支(着色器、CUDA、CL、...)的行为与 CPU 程序中的分支不同(性能方面)。通常,着色器的实例被分组,并且来自同一组的实例计算相同的路径。如果在一个组中,有一个实例想要采用一条路径,而另一个实例想要采用另一条路径,则会评估两条路径,如果这种情况经常发生,这可能会降低性能。
但是如果着色器程序的所有实例采用相同的路径怎么办? IE。如果分支仅受单个布尔统一值影响怎么办?特别是与无分支相比(即在着色器程序的编译期间消除分支;在宿主程序中保留两个着色器程序对象并在需要时交换它们)。
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),但我对更“通用”的答案感兴趣,即基于专业着色器编程经验,因为我没有。
【问题讨论】:
标签: opengl glsl gpu nvidia amd-processor