C++ Vulkan:管道衍生产品的创造和收益

C++ Vulkan:管道衍生产品的创造和收益,c++,vulkan,C++,Vulkan,在Vulkan中,您可以使用vkCreateGraphicsPipeline或vkCreateComputePipeline创建,使用basePipelineHandle或basePipelineIndex成员VkGraphicsPipelineCreateInfo/VkComputePipelineCreateInfo。文档说明,出于性能原因,此功能可用: 派生管道的目标是,使用父管道作为起点创建派生管道更便宜,并且在同一父管道的子管道之间切换/绑定更高效(在主机或设备上) 这给我提出了很多问

在Vulkan中,您可以使用
vkCreateGraphicsPipeline
vkCreateComputePipeline
创建,使用
basePipelineHandle
basePipelineIndex
成员
VkGraphicsPipelineCreateInfo
/
VkComputePipelineCreateInfo
。文档说明,出于性能原因,此功能可用:

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

这给我提出了很多问题:

  • 是否有方法指示父管道和子管道之间共享的状态,或者由实现决定
  • 有没有办法知道实现是否真的从使用派生管道(而不是评测)中获益
  • 需要使用
    VK\u pipeline\u CREATE\u ALLOW\u DERIVATIVES\u BIT
    创建父管道。始终使用此标志是否有缺点(例如,将来可能会从此标志创建派生管道)
  • 是否有方法指示父管道和子管道之间共享的状态

    没有;管道创建API无法告诉它将更改什么状态。其思想是,由于实现可以看到父对象的状态,并且可以看到您对子对象状态的要求,因此它可以告诉您有什么不同

    此外,如果有这样一种方式,它只会代表一种方式,让您意外地错误地告知实现发生了什么变化。更好的做法是让实现了解更改

    有没有办法知道实现是否真的从使用派生管道(而不是评测)中获益

    没有

    需要使用
    VK\u pipeline\u CREATE\u ALLOW\u DERIVATIVES\u BIT
    创建父管道。始终使用此标志是否有缺点(例如,将来可能会从此标志创建派生管道)

    可能吧。由于#1,实现需要存储至少某种形式的父管道状态,以便能够将其与子管道的状态进行比较。并且它必须以易于读取的形式存储此状态,这可能与要复制到命令流中的GPU内存和令牌的形式不同。因此,父管道很有可能会为这些数据分配额外的内存。尽管它们在绑定/命令执行时变慢的可能性很低


    通过向管道创建函数传递一个分配器,可以很容易地测试这一点。如果它分配的内存量与没有标记的内存量相同,那么它可能不会存储任何内容。

    我不是计算机图形学专家,但我的理解(部分包括直觉)如下:

    是否有方法指示父管道和子管道之间共享的状态,或者由实现决定

    管道的某些方面在渲染时没有指定(因此是固定的),例如要使用哪些着色器。我的推测是,派生管道和派生管道可能共享这些“只读”信息(或者用C术语来说,它们指向同一个对象)。这就是为什么派生管道的创建速度更快

    在这些管道之间切换也会更快,因为在更改管道时不需要更改资源,因为一些资源是共享的,并且是相同的

    父管道需要使用VK\u管道\u创建\u允许\u派生\u位创建。始终使用此标志是否有缺点(例如,将来可能会从此标志创建派生管道)


    这很可能取决于实现。我的推测是,当您允许派生时,您将启用资源(例如着色器)共享,这意味着实现可能会对这些资源进行引用计数。如果资源不共享,这将是不必要的成本。此外,在更改管道时,驱动程序不需要检查每个资源是否共享并可以保留在GPU上,或者是否共享并需要更改。如果没有共享,所有资源都将被更改,并且没有检查开销。所有这些都不是很大的开销,所以要么Vulkan是出于安全考虑,要么还有另一个原因我不知道。

    我来研究管道衍生品是否能带来好处。以下是我从供应商那里找到的一些资源:

    ,Nvidia,2019年6月6日

    不要指望管道衍生品会加速

    ,三星

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

    推荐

    • 在应用程序执行的早期创建管道。避免在绘制时创建管道
    • 对所有管道创建使用单个管道缓存
    • 在应用程序运行之间将管道缓存写入文件
    • 避免管道衍生品
    ,Arm软件,2019年7月11日

    不要

    • 在绘制时创建管道而不使用管道缓存(会导致性能中断)
    • 使用管道衍生工具,因为它们不受支持。
    瓦肯样本,卢纳格

    看起来并没有任何供应商真正推荐使用管道衍生产品,除了可能是为了加快管道的创建

    对我来说,这在理论上似乎是一个好主意,但在实践中并不多
    /*
    VULKAN_SAMPLE_SHORT_DESCRIPTION
    This sample creates pipeline derivative and draws with it.
    Pipeline derivatives should allow for faster creation of pipelines.
    In this sample, we'll create the default pipeline, but then modify
    it slightly and create a derivative.  The derivatve will be used to
    render a simple cube.
    We may later find that the pipeline is too simple to show any speedup,
    or that replacing the fragment shader is too expensive, so this sample
    can be updated then.
    */