【问题标题】:OpenGL GLSL atomic counter in VulkanVulkan 中的 OpenGL GLSL 原子计数器
【发布时间】:2019-11-03 01:34:02
【问题描述】:

当我尝试将我的 OpenGL 实现迁移到 Vulkan 时,我发现 Vulkan 不支持“uniform atomic_uint”。我的用例很简单:在所有片段中递增一个整数。我试图搜索解决方案,但没有找到任何最新的解决方案。

以下是旧解决方案的列表:

  1. https://software.intel.com/en-us/articles/opengl-performance-tips-atomic-counter-buffers-versus-shader-storage-buffer-objects。它说OpenGL原子计数器类似于SSBO原子操作,它可能在某些平台上实现为SSBO原子操作。 (不确定今天是否仍然如此)。

  2. https://community.khronos.org/t/vulkan-atomic-counters/7146。它还说在 SSBO 上使用图像加载/存储或原子操作作为替代。 (但内容是 2 年前的。)

由于 Vulkan 仍在增长,任何人都可以提出一种最新的标准方法来使用 Vulkan 中的 GLSL 对整数进行原子增量吗?

编辑:

我已经得到了答案,但我会添加更多细节。在我的 OpenGL 代码中,我有一个带有顶点着色器和片段着色器的渲染通道(No 涉及计算着色器)。在片段着色器中,我有以下 glsl(简化):

#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;

void main()
{
  atomicCounterIncrement(fragmentCount);
}

此着色器在 OpenGL 中运行良好,因为 OpenGL 在 glBindBuffer 中有枚举“GL_ATOMIC_COUNTER_BUFFER”,在 glsl 中有关键字“atomic_uint”。但是,Vulkan 没有相应的内置关键字。因此,我试图寻找替代品。我没有问如何查询正在渲染的片段数量,尽管这里的着色器看起来我正在这样做。我想知道通用图形着色器中的这个“原子计数器”是否存在于 Vulkan 中。正如 Nicol Bolas 指出的那样,Vulkan 中没有这样的东西,而硬件方面也没有 NVIDIA GPU 上的实现,所以我决定使用 SSBO 和 AtomicAdd 来做同样的事情。

希望这能让我的问题更清楚。

【问题讨论】:

  • 你到底想做什么?如果您只想计算片段数量,使用 VK_QUERY_CONTROL_PRECISE_BIT 的遮挡查询可能更有意义。原子是昂贵的
  • 请具体说明您要做什么,您说您的用例是“在所有片段中增加一个整数”,这并没有真正告诉我们您要做什么。您可以在 vulkan 中执行诸如 warp 投票之类的操作,以从没有原子的 warp 中的线程获取信息,并且您可以使用该信息而不是递增。无论您在做什么,很可能有比一开始就使用原子更好的解决方案。

标签: opengl glsl atomic vulkan


【解决方案1】:

Vulkan 中不存在原子计数器,因此您必须采用其中一种解决方案。

顺便说一句,原子计数器作为一个独特的硬件概念,只是 AMD 硬件上存在的东西。这就是 Vulkan 不支持它们的原因。非 AMD 硬件基本上将它们模拟为 SSBO 工作。

【讨论】:

  • 我对此评论的第二部分持怀疑态度,但英特尔提供了一些佐证:“ACB 在内部实现为 SSBO 原子操作,因此使用 ACB 并没有真正的性能优势。” software.intel.com/en-us/articles/…
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多