并非所有调用 运行
Not all invocations running
我正在尝试实现一个简单的计算操作,将缓冲区中的所有值乘以一个推送常量。
这个着色器:
#version 450
layout(local_size_x = 1024, local_size_y = 1, local_size_z = 1) in;
layout(binding = 0) buffer Buffer { float x[]; };
layout(push_constant) uniform PushConsts { float a; };
void main() {
x[gl_GlobalInvocationID.x] *= a;
}
在我当前的打印实现中,我得到:
in:
1 2 3 4 5 5 4 3 2 1
[7]
workgroups: (1,1,1)
out:
7 14 3 4 5 5 4 3 2 1
1 2 3 4 5 5 4 3 2 1
是缓冲区的初始值。
7
是推送常量的值。
(1,1,1)
为设置的工作组数。
7 14 3 4 5 5 4 3 2 1
是执行后缓冲区的结果值。
St运行gely 只有第 1 个 2 个值乘以 push 常量(这让我认为只有第 1 个 2 个调用 运行)。
我怀疑这可能是内存分配的问题,尽管我不知道它可能来自哪里。
我将不胜感激任何帮助,如果我能做些什么来使这个 post 变得更好,请告诉我。
Project link, code file link and the .spv files(.comp
文件在回购协议中,但我认为值得包括这些,以防您不想编译 .comp
文件)
问题源于将 VkBuffer
和 VkDescriptorBufferInfo
的大小设置为值的数量而不是字节数。
进行这些更改可以解决问题:
bufferCreateInfo.size = size;
-> bufferCreateInfo.size = sizeof(float)*size;
bindings[i].range = size;
-> bindings[i].range = VK_WHOLE_SIZE;
我正在尝试实现一个简单的计算操作,将缓冲区中的所有值乘以一个推送常量。
这个着色器:
#version 450
layout(local_size_x = 1024, local_size_y = 1, local_size_z = 1) in;
layout(binding = 0) buffer Buffer { float x[]; };
layout(push_constant) uniform PushConsts { float a; };
void main() {
x[gl_GlobalInvocationID.x] *= a;
}
在我当前的打印实现中,我得到:
in:
1 2 3 4 5 5 4 3 2 1
[7]
workgroups: (1,1,1)
out:
7 14 3 4 5 5 4 3 2 1
1 2 3 4 5 5 4 3 2 1
是缓冲区的初始值。7
是推送常量的值。(1,1,1)
为设置的工作组数。7 14 3 4 5 5 4 3 2 1
是执行后缓冲区的结果值。
St运行gely 只有第 1 个 2 个值乘以 push 常量(这让我认为只有第 1 个 2 个调用 运行)。 我怀疑这可能是内存分配的问题,尽管我不知道它可能来自哪里。
我将不胜感激任何帮助,如果我能做些什么来使这个 post 变得更好,请告诉我。
Project link, code file link and the .spv files(.comp
文件在回购协议中,但我认为值得包括这些,以防您不想编译 .comp
文件)
问题源于将 VkBuffer
和 VkDescriptorBufferInfo
的大小设置为值的数量而不是字节数。
进行这些更改可以解决问题:
bufferCreateInfo.size = size;
->bufferCreateInfo.size = sizeof(float)*size;
bindings[i].range = size;
->bindings[i].range = VK_WHOLE_SIZE;