Vulkan 同步

前言

在前面的文章中,我们讲解了Vulkan的多线程设计理念,分析了其底层的机制。我们知道在Vulkan的设计中,尽量避免资源的同步竞争,但是在某些复杂场景和多线程优化过程中难免会遇到资源竞争的问题,这时候就需要同步机制来保证线程访问数据的安全性和一致性。

然而Vulkan认为资源读写所需要做的同步是应用程序的职责,其内部只提供了很少的隐式同步机制,其余的都需要在程序中显式地使用Vulkan中的同步机制来实现。

Vulkan同步基础

在Vulkan代码实现中,使用的同步命令会涉及如下代码:

VkPipelineStageFlags

Vulkan所有的命令都会在Pipeline上执行,只是不同类型的命令,它们的执行阶段是不同的。当我们在Vulkan中使用同步机制时,都是以流水线阶段为单位,即某个流水线阶段上执行的所有命令,会在当前阶段暂停,等待另一个流水线阶段上的所有命令在相应的阶段执行完全后,再开始执行。VkPipelineStageFlags就代表流水线阶段。

VkAccessFlags

Vulkan中的同步不仅控制操作执行的顺序,还要控制缓存的写回,即内存数据的同步,VkAccessFlags是为了控制流水线阶段对于内存的读写操作。

因为在CPU等存储器件为了读写性能都会分为多层缓存。多级缓存就会导致多线程读写数据的一致性问题,就需要有机制保证某一层缓存数据更新了需要同步到其他缓存上,比如MemoryBarrier,而所有的MemoryBarrier中也都会包含VkAccessFlags参数。

Vulkan所有的同步在全局上都应该认为是对一个Queue中的所有命令有效果。

Vulkan同步原语

Vulkan中主要有四种同步原语(synchronization primitives):

  •  Fences
    • 最粗粒度的同步原语,用于同步跨队列或跨粗粒度提交到单个队列的工作,目的是给CPU端提供一种方法,可以知道GPU或者其他Vulkan Device什么时候把提交的工作全部做完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值