vulkan 管道内存屏障是否减轻了与没有内存屏障的管道屏障相关的同步约束?
Does vulkan pipeline memory barrier eases the sync constraint in relation to pipeline barrier with no memory barrier?
来自与 vkCmdPipelineBarrier 相关的规范:
If no memory barriers are specified, then the first access scope includes no accesses.
第一个和第二个访问范围都注明了这一点,所以如果我理解正确的话:
(1) 没有内存屏障的管道屏障导致 all 后续命令在目标阶段等待,直到 all 命令完成之前源阶段。这是适用于所有命令的硬约束。
(2) 带有内存屏障的管道屏障减轻了同步约束,因此 只有处理该内存的后续命令 才会在目标阶段(在相关访问操作中)等待,直到仅处理该内存的前面命令 完成源阶段(在相关访问操作中)。
是否正确?
(1)
是的,除了自由应用假设原则。如果您不能仅通过输出找到差异,那么将允许驱动程序违反它(例如,如果唯一的差异是性能)。
它适用于所有命令,如果它们是动作命令,是同一个队列,在这样的阶段确实处理了一些东西,等等……
规范称这个执行依赖。
(2)
这称为 内存依赖性 。它是 执行依赖性 的超集。它不会削弱它。它使它更加严格。这意味着除了 (1) 之外,由内存依赖参数定义的所有副作用(缓存)都必须是 flushed\invalidated(或者特定设备架构需要做的任何事情,以及它的具体命名法) .
PS:不过我不是 110% 确定 VK_KHR_synchronization2
。有一些尝试“简化”同步,但这样做失去了一些直觉。我认为虽然这与你遍历所有内存屏障结构并将所有阶段收集在一起是一样的,但它仍然像(1)一样工作。
来自与 vkCmdPipelineBarrier 相关的规范:
If no memory barriers are specified, then the first access scope includes no accesses.
第一个和第二个访问范围都注明了这一点,所以如果我理解正确的话:
(1) 没有内存屏障的管道屏障导致 all 后续命令在目标阶段等待,直到 all 命令完成之前源阶段。这是适用于所有命令的硬约束。
(2) 带有内存屏障的管道屏障减轻了同步约束,因此 只有处理该内存的后续命令 才会在目标阶段(在相关访问操作中)等待,直到仅处理该内存的前面命令 完成源阶段(在相关访问操作中)。
是否正确?
(1)
是的,除了自由应用假设原则。如果您不能仅通过输出找到差异,那么将允许驱动程序违反它(例如,如果唯一的差异是性能)。
它适用于所有命令,如果它们是动作命令,是同一个队列,在这样的阶段确实处理了一些东西,等等……
规范称这个执行依赖。
(2)
这称为 内存依赖性 。它是 执行依赖性 的超集。它不会削弱它。它使它更加严格。这意味着除了 (1) 之外,由内存依赖参数定义的所有副作用(缓存)都必须是 flushed\invalidated(或者特定设备架构需要做的任何事情,以及它的具体命名法) .
PS:不过我不是 110% 确定 VK_KHR_synchronization2
。有一些尝试“简化”同步,但这样做失去了一些直觉。我认为虽然这与你遍历所有内存屏障结构并将所有阶段收集在一起是一样的,但它仍然像(1)一样工作。