我正在尝试从多个线程组实现对 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,HLSL 是使用着色器模型 5.1 编译的。
谢谢您的帮助。干杯,博扬!