Compute Shader 从多个线程组随机写入 RWStructuredBuffer

Compute Shader writing to RWStructuredBuffer randomly from multiple thread groups

我正在尝试从多个线程组实现对 RWStructuredBuffer 的随机访问读取和写入。当同时有两个线程(在不同的线程组上)运行(在不同的多处理器上)并且它们都试图 read/write 到 RWStructuredBuffer 中的同一元素时,可能会发生竞争条件。

当所有线程都在同一个线程组中时,我可以为并发使用原子writes/reads,所以我的解决方案是一次只用一个线程组多次分派我的 CS,如下所示:

for (UINT x = 0; x < mX; ++x)
{
    for (UINT y = 0; y < mY; ++y)
    {
        for (UINT z = 0; z < mZ; ++z)
        {
            //...
            cmdList->Dispatch(1, 1, 1);
        }
    }
}

这样如果来自不同线程组的两个线程想要访问内存的同一部分,它们必须按顺序访问。

我的问题是,这是否是解决我问题的好方法,因为多次调用图形可能会导致一些驱动程序开销 API。

API是Directx12,HLSL是使用shader model 5.1编译的。

感谢您的帮助。 干杯, 博扬!

首先,如果你使用 DX12 并且你没有在你的呼叫之间插入无人机屏障,那么它们将 运行 不受控制地在一起,就像你呼叫 Dispatch(mx,my,mz) 一样。

但是如果只使用原子操作,两个不同的group甚至dispatch都是可以读写的。就像您在 CPU 版本上所做的那样。