GLSL(对于 PowerVR 芯片)中的函数调用是否昂贵?

Ale*_*int 0 glsl

我的假设是 GLSL 编译器只是内联所有函数调用,从而使它们成本低廉。但是,如果 GLSL 中的函数调用实现了堆栈帧等,那么它们可能会非常昂贵。有谁知道 GLSL 函数调用是否很昂贵?

Dam*_*mon 5

通常,即使没有内联,函数调用也应该很便宜,因为不存在堆栈帧之类的东西(GLSL 中没有递归!)。因此,因此,函数调用不应该是任何架构上令人生畏的开销(可能是 1-2 个周期)。

然而,函数调用通常发生在条件分支的上下文中,例如if(foo) bar(); else baz();,当工作组中的分支是发散的(即,并非所有线程都采用完全相同的路径)时,这本身在 GPU 上非常昂贵。
如果只有一个线程需要,或者可以如果采用工作组中的不同路径,GPU 必须要么执行两条路径,然后执行条件移动(上一代硬件上的常见情况),要么在最新一代硬件上(隐式)插入同步点。在这种情况下,每个线程只评估所采用的路径(这可以说节省了一些功率),但实际上所有线程都运行锁步,并且短路径与长路径完全一样长。换句话说,工作组中的所有像素(或顶点或工作项)的处理速度与组中最慢的像素一样快。