为 Vulkan 提供显式管道缓存控制

为 Vulkan 提供显式管道缓存控制

💡 原文中文,约4600字,阅读约需11分钟。
📝

内容提要

Vulkan®工作组发布了VK_KHR_pipeline_binary扩展,允许应用程序直接管理管道缓存,绕过VkPipelineCache机制。该扩展提供了对二进制数据和缓存所需信息的访问,并与应用程序自己的缓存机制集成。VK_KHR_pipeline_binary扩展为高级需求提供了解决方案,但不需要这些功能的应用程序可以继续使用VkPipelineCache对象。该扩展还提供了一些属性,如pipelineBinaryInternalCache和pipelineBinaryPrefersInternalCache,以优化内部缓存的使用。

🔎

延伸解读

VkPipelineCache 的局限与扩展的定位

VkPipelineCache 设计初衷是让驱动管理可重用状态,但过于不透明。文章指出,它在缓存大小和修剪受限时难以使用,例如实现 LRU 缓存的程序无法控制二进制对象的生命周期;同时,它也无法有效关联应用自身的缓存条目。VK_KHR_pipeline_binary 并非取代 VkPipelineCache,而是为有高级需求的开发者提供显式控制,不需要这些功能的程序仍可继续使用原有对象。

二进制 blob 的生成、密钥与去重

驱动创建管道时会生成多个二进制 blob,它们可能依赖着色器代码、静态状态或相邻阶段接口。要让缓存有效,必须在生成前查找 blob,因此每个 blob 需要密钥。使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志创建管道后,可通过 vkCreatePipelineBinariesKHR() 和 vkGetPipelineBinaryDataKHR() 获取密钥与数据。若不同管道生成相同 blob,它们可能共享密钥,应用应进行去重。

内部缓存属性与平台策略

扩展公开了多个属性来指导应用与驱动内部缓存的协作。pipelineBinaryInternalCache 表示存在内部缓存,应用可直接从中检索 blob;pipelineBinaryInternalCacheControl 允许禁用内部缓存,避免重复维护;pipelineBinaryPrefersInternalCache 指示实现是否倾向应用使用内部缓存;pipelineBinaryPrecompiledInternalCache 表示缓存可能包含应用从未生成的二进制。在 Steam 等专用平台上,内部缓存可跨客

异步创建与微卡顿缓解

借助 VK_KHR_pipeline_binary,应用可以提前异步创建二进制对象,从磁盘提取缓存内容,从而避免在管道创建过程中因磁盘 I/O 导致的微卡顿。同时,应用能提前知道哪些管道二进制缺失、需要后续编译。这为需要精细控制加载时机的应用提供了实用手段,但文章也提醒,blob 有效性受驱动更新和全局 Vulkan 功能影响,需通过全局管道二进制密钥校验。

❓

Q&A

VK_KHR_pipeline_binary扩展的主要功能是什么?

VK_KHR_pipeline_binary扩展允许应用程序直接管理管道缓存,绕过VkPipelineCache机制,并提供对二进制数据和缓存信息的访问。

为什么VK_KHR_pipeline_binary扩展被引入?

该扩展是为了提供更高级的控制权,解决VkPipelineCache对象在缓存大小和修剪受限情况下的使用难题。

应用程序如何与VK_KHR_pipeline_binary扩展集成自己的缓存机制?

应用程序可以使用vkCreatePipelineBinariesKHR()和vkGetPipelineBinaryDataKHR()管理生成的二进制blob,并通过vkGetPipelineKeyKHR()生成与缓存关联的密钥。

VK_KHR_pipeline_binary扩展提供了哪些优化属性?

扩展提供了pipelineBinaryInternalCache和pipelineBinaryPrefersInternalCache等属性,以优化内部缓存的使用。

VK_KHR_pipeline_binary扩展如何提高应用程序性能?

该扩展允许应用程序异步创建二进制对象,避免管道创建过程中的微卡顿,并允许在不同管道之间共享blob,从而提高性能。

使用VK_KHR_pipeline_binary扩展的应用程序是否仍然可以使用VkPipelineCache?

是的,不需要新扩展高级功能的应用程序可以继续使用VkPipelineCache对象,以实现简单性和优化的实现。

🏷️

标签

➡️

继续阅读