Vulkan调用计算着色器工作组时是否会保证按ID顺序执行?
Vulkan 工作组执行顺序问题解答
核心结论
你无法确定gl_GlobalInvocationID.x == 0对应的代码会在调度最开始执行。
原因说明
Vulkan 规范从未对gl_WorkGroupID的调度顺序、执行优先级做任何强制约束。所有通过vkCmdDispatch提交的工作组在设计上是完全无依赖的并行执行单元,GPU 硬件、驱动可以自由选择任意顺序调度工作组,和gl_WorkGroupID数值的大小没有任何绑定关系。
在实际硬件上甚至可能出现高 ID 工作组全部执行完成后,低 ID 工作组才开始调度的情况,如果你后续的工作组逻辑依赖这个 ID 为 0 的调用做前置初始化,会出现概率性逻辑错误,没有任何跨厂商、跨驱动版本的兼容性保障。
正确实现方案
如果你需要做全局的前置初始化,推荐采用两种方案:
- 单独提交一次只调度1个工作组的
vkCmdDispatch执行初始化逻辑,在该调度和后续的业务计算调度之间添加符合可见性要求的管线屏障,确保初始化写入的所有资源对后续调度可见 - 如果你必须在同一个
vkCmdDispatch里完成初始化和业务逻辑,可以用全局原子变量+内存栅栏的方式做同步,但该方案实现复杂度高,性能损耗不可控,仅适合小规模调度场景使用
内容的提问来源于stack exchange,提问作者alagris
相关产品推荐
相关产品推荐

