GLSL指令最大数量

19

装入片段程序单元的汇编语言指令数量是否有最大值?我要将一种算法从CPU移植到GPU,但显然GPU无法容纳。


1
我对着色器一无所知,但我猜想它们没有无限的存储空间。 - Mark Byers
2个回答

43

硬件和软件都有一些硬性和软性限制,其中一些并不是立刻显而易见的:

  • 指令槽:硬件可以容纳在本地内存中的指令总数。
  • 执行指令:将执行的最大指令数量(包括在循环中多次运行的指令)
  • 单个GLSL指令可能映射到十几个甚至更多的指令
  • 取决于优化器质量的多个GLSL指令可以映射到单个指令上(例如乘加、点积、lerp)
  • 有限的临时寄存器(只有32个)可能需要比预-SM4硬件上的必要指令还多(4096没有这样的问题)。
  • 现在通常不会额外花费Swizzling的指令,但在一些旧的硬件上会,而且在一些情况下,在某些硬件上可能会(特别是gl_FragColor是这样一个候选)
  • 无论实际指令如何,OpenGL 2.0兼容硬件仅限于8个相关纹理获取(可做OpenGL 2.1或更好的硬件则无限制)

您拥有以下保证的最低限额(大多数卡片都有更多):

  • 在OpenGL 2.x(SM3)兼容硬件上,顶点着色器和像素着色器各有512个指令槽
    • 65536个执行的指令
  • 在3.x(SM4)硬件上,顶点着色器和像素着色器各有4096个和65536个指令槽
    • 65536个执行的顶点着色器指令,无限制的像素着色器指令
  • 在2.x(SM3)硬件上,至少可以进行24次动态分支
  • 在SM4硬件上完全动态分支(没有限制)
  • 只有条件移动可用于SM2.x,其他所有内容必须通过代码重复和循环展开来适应,否则必须失败

14
这是一个很好的回答,但如果有一些参考资料会更好。 - Kaganar

2

着色器所能包含的指令数量有限制。据我所知,这个限制因GPU而异。如果你的着色器过大,编译将会产生错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接