【问题标题】:Is there a way to halt a GPU thread until all threads being executed reach that point?有没有办法停止 GPU 线程,直到所有正在执行的线程都达到该点?
【发布时间】:2021-04-10 22:58:53
【问题描述】:

我目前正在开发一种基于 CA 的流体模拟的计算着色器。我当前的算法写入当前正在计算的单元格的直接邻居。我目前的想法是让一个线程计算我的 CA 网格的 3x3 区域,然后,每个 3x3 区域彼此相邻。从理论上讲,这将确保正在写入的像素不会被过早读取。

我需要一些方法来阻止一个线程继续运行,直到所有其他线程都达到同一点。

伪代码:

for (int i = 0; i < 9; i+) {
    // do all calculations necessary

    while(true) {
       if (allThreadsDone)
            break;
    }
}

如果每个线程的计算都是常数时间,这可能不是必需的,我不知道这是不是真的。

【问题讨论】:

  • 你能以某种方式重写它,让它只写入自己的单元格吗?同步重线程应用程序效率不高,而且通常只是噩梦。通常有一个浪费的算法但不需要任何同步会更容易和更快。

标签: multithreading unity3d gpu hlsl cellular-automata


【解决方案1】:

我对其进行了更多研究,似乎没有办法停止 GPU 线程。我还被告知,如果线程具有恒定数量的指令,它们会同时结束。

【讨论】:

  • 这既不是完全正确的,也不是完全错误的。一方面,有一种方法可以停止 GPU 线程:AllMemoryBarrierWithGroupSync ()。但它只会暂停,直到 该组中的所有线程 达到该点,而不是您调度的所有线程。此外,所有线程在一个波前 将同时执行,因为它们在同一个 SIMD 处理器上运行。但是,两个不同波前的线程不会同时执行 - 取决于您在着色器中所做的事情,甚至不能保证它们是否需要大约。同一时间,即使指令数量不变。
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多