Vulkan Programming Guide第11章——同步

本文介绍了Vulkan中的同步机制,包括使用栅栏进行大量作业的同步,事件实现细粒度同步以及信号量控制资源所有权。这些同步原语在多队列异步执行环境中确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你将在本章所学到的内容

  • 如何在主机与设备之间进行同步
  • 如何在 同一 设备上 不同 队列中同步作业
  • 如何在流水线中的不同点上同步所执行的作业

Vulkan被设计为在一个设备上含有多个队列中进行异步、并行地运行作业,并且与主机一起协同,以保持物理资源始终在使用状态且繁忙。在你应用程序中各种不同的点处(时间与代码位置),你需要保持主机与设备各种不同部分的同步状态。在本章,我们将为此目的会讨论对Vulkan应用程序可用的几种同步原语。


Vulkan中的同步通过对各种不同的同步原语的使用加以实现。Vulkan中有几种类型的同步原语并且它们意为在一个应用程序中的不同用途。三种主要类型的同步原语是:

  • 栅栏(Fences):当主机需要等待设备完成由一次提交所表示的大量作业的执行之时,使用该同步原语,通常需要操作系统的辅助。
  • 事件(Events):表示一个细粒度的同步原语,它可以接受来自主机或设备端的信号。当由设备端发起信号时,它可以在命令缓存之间接受信号,并且它可以在流水线中的一些特定点处被设备等待。
    事件是一种同步原语,它可以用于在提交到同一个队列的其中两个命令之间插入一个细粒度的依赖,或是在一个队列与主机之间插入。事件不能在提交到不同队列中的命令之间插入依赖。事件具有两个状态——发出信号的(signaled)和未发出信号的(unsignaled)。一个应用程序可以在主机端亦或在设备上对一个事件发出信号(signal,即状态变为 signaled)或不发信号(unsignal,即状态变为 unsignaled)。可以让一个设备在执行后续操作之前等待一个事件变为 signaled。不存在某种命令使得主机端可等待一个事件变为 signaled,不过一个事件可以被查询。
  • 信号量(Semaphores):用于在一单个设备上跨不同队列控制资源所有权的同步原语。它们可以被用于同步执行在不同队列上的作业,而这些作业可以异步执行。

栅栏(Fences)

栅栏是一种中等量级的同步原语,它一般需要操作系统的帮助进行实现。栅栏被放置到与操作系统进行交互的命令,诸如 vkQueueSubmit(),并且当这些命令所发起的作业完成时,该栅栏将会接受到信号。

因为栅栏通常对应于由操作系统提供的本地的同步原语,一般当主机端的线程等待栅栏时,将该线程置为睡眠状态是有可能的,而这可以用于省电。然而此同步原语的意图是为那些可能会花费一些时间进行等待的操作,比如,等待一些命令缓存执行完成;或是等待将一个已完成的帧呈现给用户。

要创建一个新的栅栏对象,调用 vkCreateFence(),其原型为:

// Provided by VK_VERSION_1_0
VkResult vkCreateFence(
    VkDevice                                    device,
    const VkFenceCreateInfo*                    pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkFence*                                    pFence);
Vulkan是用于图形和计算设备的编程接口。 Vulkan设备通常由处理器和多个固定功能硬件块组成,以加速在图形和计算中使用的操作。设备中的处理器通常是一个非常宽的多线程处理器,因此Vulkan中的计算模型主要基于并行计算。 Vulkan设备还可以访问可能与您的应用程序运行所在的主处理器共享或可能不共享的内存。 Vulkan也暴露了这个内存给你。 Vulkan是一个显式的API。也就是说,几乎一切都是你的责任。驱动程序是一个软件,它接收形成API的命令和数据,并将它们转换为硬件可以理解的东西。在较旧的API(如OpenGL)中,驱动程序将跟踪许多对象的状态,为您管理内存和同步,并在运行时检查应用程序中的错误。这对开发人员非常有用,但是一旦应用程序调试和运行正常,就会浪费宝贵的CPU时间。 Vulkan通过将几乎所有状态跟踪,同步和内存管理置于应用程序开发人员手中,并通过对必须启用的层委派正确性的检查来解决这个问题。他们在正常情况下不参与您的申请的执行。 由于这些原因,Vulkan既非常冗长又有点脆弱。你需要做大量的工作,以获得Vulkan运行良好,不正确的使用API​​通常会导致图形损坏,甚至程序崩溃,在旧的API,你会收到一个有用的错误消息。作为交换,Vulkan提供对设备的更多控制,一个干净的线程模型,以及比它取代的API更高的性能。 此外,Vulkan被设计为不仅仅是一个图形API。它可以用于异构设备,如图形处理单元(GPU),数字信号处理器(DSP)和固定功能硬件。功能分为粗粒度,宽泛重叠的类别。当前版本的Vulkan定义了传输类别,用于复制数据;计算类别,用于在计算工作负载上运行着色器;和图形类别,其中包括光栅化,图元装配,混合,深度和模板测试,以及图形编程人员熟悉的其他功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值