Vulkan:创建和利益管道衍生品

Mue*_*ito 9 c++ vulkan

在福尔康,你可以使用vkCreateGraphicsPipelinevkCreateComputePipeline创建管道衍生物,具有basePipelineHandlebasePipelineIndex成员VkGraphicsPipelineCreateInfo/ VkComputePipelineCreateInfo.文档声明此功能可用于性能原因:

衍生管道的目标是使用父项作为起点创建它们更便宜,并且在同一父项的子项之间切换/绑定更有效(在主机或设备上).

这为我提出了很多问题:

  1. 有没有办法表明父管道和子管道之间共享哪个状态,或者实现是否决定?
  2. 有没有办法知道实现是否实际上从使用派生管道(除了分析)获得任何好处?
  3. 需要使用创建父管道VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT.始终使用此标志是否存在缺点(例如,如果您将来可能从此创建派生管道)?

ber*_*nie 8

我提出这个问题是为了调查管道衍生品是否能带来好处。以下是我从供应商那里找到的一些资源:

\n

提示和技巧:Vulkan Dos 和 Don\xe2\x80\x99ts,Nvidia,2019 年 6 月 6 日

\n
\n

不要\xe2\x80\x99 期望 Pipeline Derivatives 能带来加速。

\n
\n

Vulkan 使用建议,三星

\n
\n

管道衍生工具让应用程序可以将“子”管道表示为类似“父”管道的增量状态变化;在某些架构上,这可以减少在相似状态之间切换的成本。许多移动 GPU 主要通过管道缓存获得性能,因此管道衍生产品通常不会为便携式移动应用程序带来任何好处。

\n

建议

\n
    \n
  • 在应用程序执行的早期创建管道。避免在绘制时创建管道。
  • \n
  • 对所有管道创建使用单个管道缓存。
  • \n
  • 在应用程序运行之间将管道缓存写入文件。
  • \n
  • 避免管道衍生品
  • \n
\n
\n

移动开发者的 Vulkan 最佳实践 - 管道管理,Arm Software,2019 年 7 月 11 日

\n
\n

\n
    \n
  • 在绘制时创建管道而不使用管道缓存(会导致性能卡顿)。
  • \n
  • 使用管道衍生产品,因为它们不受支持。
  • \n
\n
\n

Vulkan 示例、LunarG、API 示例/pipeline_derivative/pipeline_derivative.cpp

\n
/*\nVULKAN_SAMPLE_SHORT_DESCRIPTION\nThis sample creates pipeline derivative and draws with it.\nPipeline derivatives should allow for faster creation of pipelines.\nIn this sample, we\'ll create the default pipeline, but then modify\nit slightly and create a derivative.  The derivatve will be used to\nrender a simple cube.\nWe may later find that the pipeline is too simple to show any speedup,\nor that replacing the fragment shader is too expensive, so this sample\ncan be updated then.\n*/\n
Run Code Online (Sandbox Code Playgroud)\n

看起来并没有任何供应商实际上建议使用管道衍生产品,除非可能是为了加快管道创建速度。

\n

对我来说,这在理论上似乎是一个好主意,但在实践中并没有多大意义。

\n

此外,如果驱动程序应该受益于多个管道的共同父级,那么它应该完全能够自动执行祖先检测。可以根据提供最佳加速的特定公共管道状态来合成“共同祖先”。为什么要通过 API 显式指定呢?

\n


Nic*_*las 5

有没有办法表明父管道和子管道之间共享哪个状态

没有; 管道创建API无法告诉它将改变什么状态.这个想法是,因为实现可以看到父母的状态,并且它可以看到你对孩子的状态的要求,它可以分辨出什么是不同的.

此外,如果有这样的方式,它只会代表一种方式让你不小心误导实施改变了什么.最好让实施计算出变化.

有没有办法知道实现是否实际上从使用派生管道(除了分析)获得任何好处?

没有.

需要使用创建父管道VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT.始终使用此标志是否存在缺点(例如,如果您将来可能从此创建派生管道)?

大概.由于#1,实现需要至少存储某种形式的父管道状态,以便它可以将它与子管道的状​​态进行比较.并且它必须以易于阅读的形式存储此状态,这可能与GPU内存和要复制到命令流中的令牌的形式不同.因此,父流水线很可能会为此类数据分配额外的内存.虽然它们在绑定/命令执行时间较慢的可能性很低.

您可以通过将分配器传递给管道创建函数来轻松地测试它.如果它分配与没有标志相同的内存量,那么它可能没有存储任何内容.