Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GLSL能否支持作为跳转表实现的switch语句?_Glsl_Gpu_Gpgpu - Fatal编程技术网

GLSL能否支持作为跳转表实现的switch语句?

GLSL能否支持作为跳转表实现的switch语句?,glsl,gpu,gpgpu,Glsl,Gpu,Gpgpu,看起来几年前AMD上没有() 从我看到的Nvidia中间语言(通过glGetProgramBinary或export\ugl\uWriteProgramObjectAssembly=1)没有动态跳转命令,或者至少我无法触发它。函数是不可能的(它们都是内联的,我想这是因为没有返回的动态跳转),switch语句似乎最后变成了嵌套的if语句是否可以触发switch语句进行动态跳转?(与以下不同) 我可以理解这一点——如果每个线程都在执行任意代码,SIMT体系结构就不会有多好。此外,还有动态循环和分支

看起来几年前AMD上没有()

从我看到的Nvidia中间语言(通过
glGetProgramBinary
export\ugl\uWriteProgramObjectAssembly=1
)没有动态跳转命令,或者至少我无法触发它。函数是不可能的(它们都是内联的,我想这是因为没有返回的动态跳转),switch语句似乎最后变成了嵌套的if语句是否可以触发switch语句进行动态跳转?(与以下不同)

我可以理解这一点——如果每个线程都在执行任意代码,SIMT体系结构就不会有多好。此外,还有动态循环和分支。也许跟踪分歧比较容易,这样线程就可以在某个点同步


还有一个问题,CUDA如何在同一硬件上执行函数指针?GLSL规范中是否有禁止这一点的规定,或者这些天没有人在着色器编译器上工作?

请注意,由于vertex程序只编译到了中间语言,因此在最终编译和优化过程中,switch语句可能仍会进一步优化。@RogerDahl说得好,你知道有没有一种方法可以更深入地挖掘并进一步查看管道中的代码?我不知道如何获得OpenGL堆栈中的SASS机器代码。使用CUDA,特定目标的SASS可以嵌入到二进制文件中,并为创建二进制文件时未知的目标动态编译。您可以在编译期间保留SASS的副本,也可以稍后从二进制文件中反汇编它。我认为还有一种方法可以从由驱动程序动态编译的PTX访问SASS。
#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