【发布时间】:2020-02-13 10:41:10
【问题描述】:
已经提出了很多这样的问题,但在我的情况下,我实际上需要共享数据。
这是我的情况。我有一个程序,旨在用从顶部开始向下的值填充 3D 纹理。该程序填充了一种瀑布模型。
一个函数,它获取与 3D 纹理中的单元格相关联的值,以及它相对于当前单元格的位置,即f(x, position),并生成一个添加到当前单元格的新值。你可以把它想象成某种洪水填充
现在,如果我只需要相邻的值,我可以只使用幽灵点,问题是单个值从其当前位置向外扩散,因此相邻值将在我正在操作的当前块之外更新.
现在我不需要从相邻块传输整个数据块,我只需要在每一步中,当前网格周围相邻块的值。我仍然会使用幽灵点,但我需要将“新”值转移进去才能使用它们。
我的问题是,似乎每个人都说“使用另一个计算着色器调用”来解决这个问题。这是不可接受的,没有足够的工作来证明内核启动成本是合理的。
我看到的唯一选项是:
- 使用原子整数跨组进行通信,让组知道他们可以使用与这些边界数据项对应的某些全局内存中的值
- 通过将相邻单元格的值复制到单独的缓冲区中来使运行时间增加六倍,然后再次运行整个过程以考虑每一侧的新相邻值(立方体中有 6 个)。
- 只对整个事物使用一个组调用。 GPU 正在做的其他事情可能足以证明这一点
- 为 3D 纹理的每个“层”使用多个计算着色器调用,这需要将值转储到全局内存,然后为每一层读回它们,有效地使全局内存读取的成本加倍,并调用内核开销每个内核都需要按顺序启动。如果我可以在内核调用之间的共享内存中保留相同的内存,而不必重新读回它,这将缓解双延迟问题。
真的没有其他方法可以在计算着色器中复制边界吗?
【问题讨论】:
标签: glsl gpu gpgpu vulkan compute-shader