因此提出了很多类似的问题,但是在我的情况下,我实际上需要共享数据。
这是我的情况。我有一个程序旨在用从顶部开始一直向下的值填充3D纹理。该程序填充了一种瀑布模型。
一个函数,该函数采用与3D纹理中的单元相关的值及其相对于当前单元的位置,即f(x, position)
,并产生一个添加到当前单元的新值。您可以将其想像成大量的洪水]
现在,如果我仅需要相邻的值,则可以使用幻影点,问题是单个值从其当前位置向外扩展,因此相邻值将在我正在操作的当前块之外进行更新。
现在,我不需要从相邻块传输整个数据块,我只需要在每一步中将当前网格周围的相邻块的值传送出去。我仍将使用幻影点,但需要转移“新”值才能使用它们。
我的问题是,似乎每个人都说“使用另一个计算着色器调用”来解决此问题。这是不可接受的,没有足够的工作来证明内核启动成本是合理的。
我看到的唯一选择是:
真的没有其他方法可以在计算着色器中复制边界吗?
真的没有其他方法可以在计算着色器中复制边界吗?
在一般情况下,不
无法保证何时执行相邻的边界组,那么如何复制尚不存在的边界组?
您可能可以阻止并等待,但是效率低下(GPU只会忙于等待),并且实际上可能是实时锁定的,因为所有正在运行的组都被阻止等待而新的组无法启动(因为被阻止的组正在使用所有着色器核心的线程容量)。
如果我理解正确的算法,更糟糕的是,您具有循环依赖关系(边界在相邻块之间双向传播),因此,除非您可以同时产生整个问题空间,否则可以保证动态锁定。