我正在编写一个物理模拟程序,类似于细胞自动机。每个步骤都依赖于前一个步骤,但更确切地说,每个单元格需要其自身和其直接相邻的单元格的状态来计算其新状态。我使用两个缓冲区,在每个步骤中交替使用它们的角色(多次读取/单次写入)。
我正在使用WGSL(WebGPU),目前,对于每个步骤(整个网格更新,换句话说是
我尝试在着色器中直接使用循环执行步骤,但我无法在每个步骤之间同步所有工作组。因为我怀疑CPU和GPU之间的通信是限制因素。(剧透警告:不是这样的)
我尝试使用
我正在使用WGSL(WebGPU),目前,对于每个步骤(整个网格更新,换句话说是
t+1
),我调用一个分派(以确保步骤之间的同步),但性能非常慢。(编辑:因为我没有正确使用工作组)我尝试在着色器中直接使用循环执行步骤,但我无法在每个步骤之间同步所有工作组。因为我怀疑CPU和GPU之间的通信是限制因素。(剧透警告:不是这样的)
我尝试使用
storageBarrier
和workgroupBarrier
,但它们不起作用(同步未发生)。尽管如此,如果我只在它们之间使用两个连续步骤和一个障碍,我可以将性能提高2倍,这意味着我在分派期间浪费了大部分时间。结果几乎是完美的(意味着一些同步没有发生,但并没有对结果产生太大影响)。
编辑:前面的段落是一个误解,我的测试结果是误导性的。
我读到说,使用当前 WGSL 规范无法在单个调度中同步所有工作组。但是我不明白为什么会有 workgroupBarrier
和 storageBarrier
?
如何强制所有工作组在元胞自动机的每个步骤之间进行同步?
但更一般地说,我想我不是第一个使用这种直接邻居依赖关系在 GPU 上编写元胞自动机的人: