微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并非所有调用都在运行

如何解决并非所有调用都在运行

我正在尝试实现一个简单的计算操作,将缓冲区中的所有值乘以推常数。

这个着色器:

#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) 是设置的工作组数。
  • 7 14 3 4 5 5 4 3 2 1 是执行后缓冲区的结果值。

奇怪的是,只有 1st 2 个值乘以 push 常量(这让我认为只有 1st 2 次调用运行)。 我怀疑这可能是内存分配的问题,虽然我不知道它可能来自哪里。

我将不胜感激任何帮助,如果我能做些什么让这篇文章变得更好,请告诉我。

Project linkcode file linkthe .spv files.comp 文件在 repo 中,但我认为值得包含这些,以防您不想编译 { {1}} 个文件

解决方法

问题源于将 VkBufferVkDescriptorBufferInfo 的大小设置为值的数量而不是字节数。

进行这些更改可以修复它:

  • bufferCreateInfo.size = size; -> bufferCreateInfo.size = sizeof(float)*size;
  • bindings[i].range = size; -> bindings[i].range = VK_WHOLE_SIZE;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。