给定以下glsl声明(这只是一个示例):
struct S{
f16vec3 a;
float16_t b;
f16vec3_t c;
float16_t d;
};
shared float16_t my_float_array[100];
shared S my_S_array[100];
我有以下问题:
- 例如,在上面的例子中,给定的声明将使用多少共享内存?
- 共享内存中的变量使用哪种内存布局?std 140、std 430还是其他?
- 这对银行冲突有何影响?
我能够使用 glGetProgramBinary 获得程序所需的总共享内存,并跳过直到文本部分的开头(由以“!!NV”开头的行指示):
...
!!NVcp5.0
OPTION NV_shader_buffer_load;
OPTION NV_internal;
OPTION NV_gpu_program_fp64;
OPTION NV_shader_storage_buffer;
OPTION NV_bindless_texture;
OPTION NV_gpu_program5_mem_extended;
GROUP_SIZE 4 4 4;
SHARED_MEMORY 4480;
SHARED shared_mem[] = { program.sharedmem };
...
这是相当间接的,虽然并没有告诉很多关于对齐/ Package 规则。
1条答案
按热度按时间yrefmtwq1#
共享内存中的变量使用哪种内存布局?std140、std430还是其他?
它是由实现定义的。
应用于缓冲区支持存储的布局很重要,因为着色器外部的代码需要能够访问它。
shared
变量不能在着色器外部,因此此类变量的布局在功能上是由实现定义的。简而言之,你无法确切地知道任何一个
shared
变量声明会占用多少存储空间,你可以假设它会占用 * 至少 * 与存储你要求存储的数据所需的最小字节数一样多的字节,但仅此而已。这对银行冲突有何影响?
“库”不是OpenGL或GLSL所能识别的概念,因此它是由实现定义的。