繁体   English   中英

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

[英]Compute Shader writing to RWStructuredBuffer randomly from multiple thread groups

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

当所有线程都在同一个线程组中时,我可以使用原子进行并发写入/读取,因此我的解决方案是一次仅分配一个线程组就多次调度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,并且使用着色器模型5.1编译HLSL。

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

首先,如果您使用DX12,并且没有在通话之间插入UAV障碍,那么它们将在不受控制的情况下一起运行,就像您调用Dispatch(mx,my,mz)

但是,如果仅使用原子操作,则可以使用两个不同的组甚至调度来进行读写。 就像您在CPU版本上一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM