首页 > 解决方案 > vulkan 管道内存屏障是否缓解了与没有内存屏障的管道屏障相关的同步约束?

问题描述

从与 vkCmdPipelineBarrier 相关的规范中:

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

这对于第一个和第二个访问范围都有说明,所以如果我理解正确:

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

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

这是正确的吗?

标签: vulkanmemory-barriers

解决方案


(1)
是的,除了自由地应用“好像”原则。如果你不能仅仅通过输出找到差异,那么驱动程序将被允许违反它(例如,如果唯一的差异是性能)。

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

规范称之为执行依赖

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

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


推荐阅读