vulkan 管道内存屏障是否减轻了与没有内存屏障的管道屏障相关的同步约束?

问题描述

来自与 vkCmdPipelineBarrier 相关的规范:

如果没有指定内存屏障,则第一个访问范围不包括任何访问。

一个和第二个访问范围都注意到了这一点,所以如果我理解正确的话:

(1) 没有内存屏障的管道屏障会导致 all 后续命令在目标阶段等待,直到 all 命令完成源阶段之前。这是一个适用于所有命令的硬约束。

(2) 带有内存屏障的管道屏障减轻了同步约束,因此只有处理该内存的后续命令在目标阶段(在相关访问操作)等待,直到仅在前面处理该内存的命令完成源阶段(在相关访问操作中)。

正确吗?

解决方法

(1)
是的,除了 as-if 原则 的自由应用。如果您不能纯粹通过输出找到差异,那么驱动程序将被允许违反它(例如,如果唯一的差异是性能)。

它适用于所有命令,如果它们是动作命令,是同一个队列,在这个阶段确实处理了一些东西,等等……

规范称这种执行依赖

(2)
这称为内存依赖。它是执行依赖的超集。它不会削弱它。它使它更加严格。这意味着除了 (1) 之外,所有由内存依赖参数定义的副作用(缓存)都必须刷新\无效(或任何特定设备架构需要做的事情,以及它的具体命名法)。

PS:不过,我对 VK_KHR_synchronization2 不是 110% 确定。有一些尝试“愚蠢”同步,但这样做失去了一些直觉。我认为虽然这就像你走过所有内存屏障结构并收集所有阶段一样,但它仍然像(1)那样工作。