我尝试优化工作计算着色器。它的目的是创建一个图像:找到合适的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4).
这里是代码:
struct Entry
{
*some other data*
uint rgb;
};
layout(binding = 0) uniform SConfiguration
{
Entry materials[MATERIAL_COUNT];
} configuration;
void main()
{
Entry material = configuration.materials[currentMaterialId];
float r = (material.rgb >> 16) / 255.;
float g = ((material.rgb & G_MASK) >> 8) / 255.;
float b = (material.rgb & B_MASK) / 255.;
imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(r, g, b, 0.0));
}
Run Code Online (Sandbox Code Playgroud)
我想清理/优化一下,因为这种颜色转换在着色器中看起来很糟糕/无用(并且应该预先计算)。我的问题是: …
作为一个测试项目,我使用计算着色器(Vulkan)编写了Consway基本的生活游戏。基本上:
#define WIDTH 800
#define HEIGHT 600
#define WORKGROUP_SIZE 32
layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1) in;
layout(binding = 0) readonly buffer buf1 {
int data[WIDTH][HEIGHT];
} previousBoard;
layout(binding = 1) buffer buf2 {
int data[WIDTH][HEIGHT];
} nextBoard;
Run Code Online (Sandbox Code Playgroud)
我随机进行了一些更改,并且我注意到,如果使用data[y][x](from gl_GlobalInvocationID.xy)访问阵列,我的程序比使用(至少在我的计算机(intel UHD 620)上)进行的普通访问要快3倍。data[x][y] [x] [y]为500 fps,而[y] [x]为1700 fps)。
我花了几个小时来隔离这种行为,以确保这不是副作用。我什至反汇编了Spir-v代码,但发现没有什么有趣的东西可以帮助我理解。这里是着色器的差异(带有[x] [y]和[y] [x]):https : //www.diffchecker.com/vFlkEsQp。
我远远不了解这里会发生什么。是否有任何原因可以解释这种性能差异?
我对使用[y] [x]不太满意(或者应该?),那么我还有另一种方法可以使[x] [y]达到类似的效果吗?