GLSL可以支持作为跳转表实现的switch语句吗?

时间:2014-02-12 12:54:34

标签: glsl gpu gpgpu

几年前看起来不是AMD("the switch-statement into jump table optimization is not done by our driver")。

从我所看到的Nvidia的中间语言(通过glGetProgramBinaryexport __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规范中是否存在禁止此问题的内容,或者目前还没有人在着色器编译器上工作?

0 个答案:

没有答案