这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:
1. 基本概念
- 一个常见问题:步骤(1)CPU向GPU提交一块Resource,步骤(2)CPU命令GPU利用Resouce进行渲染。从步骤(1)到(2)之间,CPU需要确认Resource完全提交到GPU内存中,如何确保?
- 一个可行方案:在步骤(1)(2)之间CPU插入一个同步指令,确认Resouce提交完成之后,再下发渲染指令。
- 当CPU/GPU两种处理器并行工作时,自然而然地就会产生各种同步问题,在DirectX12中用到的是Fence机制,如果CPU想确认前面的所有Command执行完毕,就在Command后插入一个Fence,待GPU返回这个Fence,就能确认之前的所有Command执行完毕。
- 实际上Fence在GPU Driver中就是一块存有数值的Memory,初始值为0,执行一次Fence同步就向上+1递增。CPU提交Fence之前知道Fence Value是n,GPU收到Fence后确认当前Command执行完毕,并改写Fence Value为n+1,CPU循环检测并确认Fence Value为n+1即完成Fence同步。
2. Fence机制
- 更详细的解释可以参考下图:
-
- CPU下发Comamnd1
-
- CPU插入Fence + GPU执行Command1
-
- CPU等待Fence… + GPU执行Command1
-
- GPU递增Fence(注意GPU Hardware在递增Fence前,会确认此前所有Command执行完毕)
-
- CPU确认Fence返回,继续其他Command