c++ 两个连续的DirectX 12 Dispatch()调用在GPU上是顺序运行还是并发运行?

3htmauhk  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(182)

连续运行两个Dispatch()调用时,例如:

m_computeCommandList->Dispatch(111, 1, 1);
m_computeCommandList->Dispatch(555, 1, 1);

是否可以保证第二个Dispatch()将在第一个Dispatch()之后在GPU上运行?或者,它们是否可以在GPU上并发运行?
澄清一下,在这两个Dispatch()调用之间没有更多的C++代码。

cdmah0mi

cdmah0mi1#

与其他图形API一样,当您在CPU端执行命令调用时,会将这些命令放入命令队列中。这保证了命令将按照队列顺序(先进先出)进行处理。
然而,在GPU上,所有事情都变得大量并行和并发。我们无法知道实际执行将被调度在哪个处理单元上,或者来自哪个Dispatch的哪些线程将更早完成。通常,如果调用之间没有共享资源(缓冲区、纹理),这不是问题,我们只需要同步帧的结尾。
如果存在资源共享,则可能会出现内存冲突(“写-读”、“写-写”或“读-写”)。这里我们需要使用resource barriers,它允许我们组织对这些资源的访问。使用不同的屏障选项,您可以实现不同Dispatch调用的连续执行。
例如,从D3 D12资源状态未排序访问到D3 D12资源状态非像素着色器资源的转换|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE将等待所有先前的图形和计算着色器执行完成,并阻止所有后续的图形和计算着色器执行。
DirectX 12中Enhanced barriers允许您对资源和执行同步进行微调控制。

相关问题