在glsl计算着色器中复制组之间的边界值

问题描述 投票:0回答:1

因此提出了很多类似的问题,但是在我的情况下,我实际上需要共享数据

这是我的情况。我有一个程序旨在用从顶部开始一直向下的值填充3D纹理。该程序填充了一种瀑布模型。

一个函数,该函数采用与3D纹理中的单元相关的值及其相对于当前单元的位置,即f(x, position),并产生一个添加到当前单元的新值。您可以将其想像成大量的洪水]

enter image description here

现在,如果我仅需要相邻的值,则可以使用幻影点,问题是单个值从其当前位置向外扩展,因此相邻值将在我正在操作的当前块之外进行更新。

现在,我不需要从相邻块传输整个数据块,我只需要在每一步中将当前网格周围的相邻块的值传送出去。我仍将使用幻影点,但需要转移“新”值才能使用它们。

enter image description here

我的问题是,似乎每个人都说“使用另一个计算着色器调用”来解决此问题。这是不可接受的,没有足够的工作来证明内核启动成本是合理的。

我看到的唯一选择是:

  • 使用原子整数在组之间进行通信以使组知道它们可以使用某些全局存储器中与这些边界数据项相对应的值
  • 通过将相邻单元格的值复制到单独的缓冲区中,然后将整个过程重新运行以考虑每一边的新相邻值(多维数据集中有6个),将运行时增加了。
  • 整个事件仅使用一个组调用。 GPU可能正在做的其他事情足以证明这一点
  • 对3D纹理的每个“层”使用多个计算着色器调用,这将需要将值转储到全局内存,然后将它们读回每一层,从而有效地使全局内存读取的成本增加了一倍,并在每次调用时都消耗内核开销内核需要按顺序启动。如果我可以在两次内核调用之间将相同的内存保留在共享内存中,而不必重新读回,则可以缓解双重延迟问题。

真的没有其他方法可以在计算着色器中复制边界吗?

glsl gpu gpgpu vulkan compute-shader
1个回答
0
投票

真的没有其他方法可以在计算着色器中复制边界吗?

在一般情况下,不

无法保证何时执行相邻的边界组,那么如何复制尚不存在的边界组?

您可能可以阻止并等待,但是效率低下(GPU只会忙于等待),并且实际上可能是实时锁定的,因为所有正在运行的组都被阻止等待而新的组无法启动(因为被阻止的组正在使用所有着色器核心的线程容量)。

如果我理解正确的算法,更糟糕的是,您具有循环依赖关系(边界在相邻块之间双向传播),因此,除非您可以同时产生整个问题空间,否则可以保证动态锁定。

© www.soinside.com 2019 - 2024. All rights reserved.