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