几年前看起来不是AMD("the switch-statement into jump table optimization is not done by our driver")。
从我所看到的Nvidia的中间语言(通过glGetProgramBinary
或export __GL_WriteProgramObjectAssembly=1
)开始,没有动态跳转命令,或者至少我无法触发它。函数是不可能的(它们都被内联,我认为这是由于缺少返回的动态跳转)并且switch语句似乎最终成为嵌套的if语句。 是否可以触发switch语句动态跳转?(与以下内容不同)
#version 430
uniform int index;
void main()
{
switch(index)
{
case 0: gl_Position.x = 0; break;
case 1: gl_Position.x = 1; break;
case 2: gl_Position.x = 2; break;
case 3: gl_Position.x = 3; break;
}
}
...
!!NVvp5.0
OPTION NV_bindless_texture;
OPTION NV_shader_atomic_float;
PARAM c[1] = { program.local[0] };
TEMP R0;
TEMP RC, HC;
SEQ.S R0.x, c[0], {0, 0, 0, 0};
MOV.U.CC RC.x, -R0;
IF NE.x;
MOV.F result.position.x, {0, 0, 0, 0};
ELSE;
SEQ.S R0.x, c[0], {1, 0, 0, 0};
MOV.U.CC RC.x, -R0;
IF NE.x;
MOV.F result.position.x, {1, 0, 0, 0};
ELSE;
SEQ.S R0.x, c[0], {2, 0, 0, 0};
MOV.U.CC RC.x, -R0;
IF NE.x;
MOV.F result.position.x, {2, 0, 0, 0};
ELSE;
SEQ.S R0.x, c[0], {3, 0, 0, 0};
MOV.U.CC RC.x, -R0;
IF NE.x;
MOV.F result.position.x, {3, 0, 0, 0};
ENDIF;
ENDIF;
ENDIF;
ENDIF;
END
我可以理解这一点 - 如果每个线程都执行任意代码,SIMT架构就不会太好。然后,还有动态循环和分支。也许跟踪分歧更容易,因此线程可以在某个时刻同步?
另一个问题是,CUDA如何在同一硬件上运行指针? GLSL规范中是否存在禁止此问题的内容,或者目前还没有人在着色器编译器上工作?