0

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

4

2 回答 2

5

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

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

于 2012-08-02T12:35:21.460 回答
1

函数调用可能很昂贵,具体取决于您的设备。我建议你看看 Aras 的 GLSL 优化器(来自 Unity):

https://github.com/aras-p/glsl-optimizer

于 2012-08-02T10:04:26.560 回答