Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 有没有办法停止一个GPU线程,直到所有正在执行的线程都达到该点?_Multithreading_Unity3d_Gpu_Hlsl_Cellular Automata - Fatal编程技术网

Multithreading 有没有办法停止一个GPU线程,直到所有正在执行的线程都达到该点?

Multithreading 有没有办法停止一个GPU线程,直到所有正在执行的线程都达到该点?,multithreading,unity3d,gpu,hlsl,cellular-automata,Multithreading,Unity3d,Gpu,Hlsl,Cellular Automata,我目前正在开发一个基于CA的流体模拟的计算着色器。我当前的算法写入当前正在计算的单元格的直接邻居。我目前的想法是让一个线程计算CA网格的3x3区域,然后,每个3x3区域彼此相邻。理论上,这将确保写入的像素不会被过早读取 我需要一些方法来防止一个线程继续运行,直到所有其他线程都达到相同的点 伪代码: for (int i = 0; i < 9; i+) { // do all calculations necessary while(true) { if (a

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

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

伪代码:

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

    while(true) {
       if (allThreadsDone)
            break;
    }
}
for(int i=0;i<9;i+){
//做所有必要的计算
while(true){
如果(所有线程通)
打破
}
}

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

我已经详细研究了它,似乎没有办法停止GPU线程。还有人告诉我,如果线程的指令数不变,那么线程会同时结束。

您能否以某种方式重写它,使它只写入自己的单元格?同步高线程应用程序效率不高,通常只是噩梦。通常,有一个浪费的算法,但不需要任何同步,更容易、更快。这既不完全正确,也不完全错误。首先,有一种停止GPU线程的方法:
AllMemoryBarrierWithGroupSync()
。但它只会停止,直到该组中的所有线程都达到该点,而不是您分派的所有线程。此外,波前中的所有线程都将同时执行,因为它们运行在同一个SIMD处理器上。但是,两个不同波前上的线程不会同时执行-取决于您在着色器中执行的操作,甚至无法保证它们是否需要大约相同的时间,即使指令数不变。