Synchronization 当srcStageMask指定一个不在命令管道中的阶段时会发生什么?

Synchronization 当srcStageMask指定一个不在命令管道中的阶段时会发生什么?,synchronization,vulkan,Synchronization,Vulkan,我的理解是,当您提交vkCmdPipelineBarrier命令时,源同步作用域中的所有命令都必须到达srcStage,然后目标同步作用域中的任何命令才能开始其管道的dstStage 但是,如果srcStageMask指定了一个源同步作用域中的命令不包含的阶段,该怎么办?例如,如果命令为vkCmdDispatch,srcStageMask=VK\u PIPELINE\u STAGE\u FRAGMENT\u SHADER\u BIT 规范似乎回答了这个问题: 如果同步命令包含源阶段掩码,则仅显示

我的理解是,当您提交vkCmdPipelineBarrier命令时,源同步作用域中的所有命令都必须到达srcStage,然后目标同步作用域中的任何命令才能开始其管道的dstStage

但是,如果srcStageMask指定了一个源同步作用域中的命令不包含的阶段,该怎么办?例如,如果命令为vkCmdDispatch,srcStageMask=VK\u PIPELINE\u STAGE\u FRAGMENT\u SHADER\u BIT

规范似乎回答了这个问题:

如果同步命令包含源阶段掩码,则仅显示其第一个同步作用域 包括在该掩码中指定的管道阶段的执行

因此,我希望该命令的任何阶段(上一个示例中的vkCmdDispatch)执行的任何操作都不会包含在同步范围中。但在中,作者说这会产生一个执行依赖链:

在这个例子中,我们实际上得到了{1,2}和{5,6}之间的依赖关系。这是因为我们在COMPUTE->TRANSFER->COMPUTE之间创建了一个依赖链。当我们在4号车厢等待换乘时。我们还必须等待目前阻止转移的任何事情

但是说明书上说

执行依赖关系链是一系列执行依赖关系,这些执行依赖关系形成一个 第一个依赖项A'和最后一个依赖项B'之间的关系。对于每个连续对 对于执行依赖项,如果第一个依赖项中的B与第二个依赖项中的a的交集不是空集,则存在一个链

在博客文章的示例中,由于vkCmdDispatch不包含传输阶段,第一个管道屏障的BS不是空集吗?然后,BS和AS的交集将是空集,不应存在依赖链

但是很明显,确实存在这样一个阶段,所以这让我相信我对srcstagemak或dststagemak指定一个不在命令管道中的阶段时会发生什么有一个错误的理解。那么会发生什么呢

编辑:

根据Nicol的回答:

它专门讨论了所涉及的一系列阶段。Bs列表传输。包括转帐。两级遮罩的交点为传输,因此不为空。因此,存在一个依赖链

那么AS={TRANSFER}union{stages逻辑上早于TRANSFER}

和BS={TRANSFER}并集{逻辑上比TRANSFER}晚

如果是这样的话,我的困惑就会得到解决。但是(来自尼科尔的回答)

规范没有提到执行什么命令

这似乎与我对规范的解释相矛盾。第6.6章说:

如果vkCmdPipelineBarrier是在渲染过程实例之外录制的,则第二个同步作用域将包括以后按提交顺序出现的所有命令

BS是规范为第二个同步作用域指定的另一个名称。那么BS包含命令,而不是管道阶段,对吗?那么,如何在BS中进行转移阶段

我不是故意装腔作势,我真的在努力学习如何解释规范,并自己得出这个结论,这样我就不会依赖stackoverflow了。

规范:

作为命令结果执行的管道阶段按特定顺序在逻辑上完成执行,因此逻辑上较后的管道阶段的完成不得在逻辑上较早的阶段完成之前发生。这意味着在特定同步命令的源阶段掩码中包含任何阶段也意味着该命令的AS中包含任何逻辑上较早的阶段

至于其他方面:

在博客文章的示例中,由于vkCmdDispatch不包含传输阶段,第一个管道屏障的BS不是空集吗

没有。规范没有提到执行什么命令。它专门讨论了所涉及的一系列阶段。Bs列表
传输
。包括
传输
。两级遮罩的交点为
传输
,因此不为空。因此,存在一个依赖链


似乎您可能不完全理解什么是同步作用域,因为它与由该作用域限定的实际操作是分开的。规范规定:

同步作用域定义了同步命令能够执行的其他操作 使用创建执行依赖项。不在同步中的任何类型的操作 命令的同步作用域将不包括在结果依赖项中。例如 对于许多同步命令,同步范围仅限于操作 在特定的管道阶段中执行,这允许将其他管道阶段从 附属国。根据特定命令,还可以使用其他范围选项

本规范还明确区分了同步范围和可能受该范围约束的命令:

  • 设A和B是独立的操作集
  • 让我们做一个同步命令
  • 设AS和BS为S的同步作用域
  • 设A'为集合A和AS的交点
  • 设B'为集合B和B的交集
AB表示作为操作一部分的实际命令ASBS表示命令的哪些部分可以参与依赖关系。当你把它们放在一起时,你会得到A'B':从实际命令中同步的实际阶段

您引用的关于依赖关系链的部分基于匹配作用域的存在,而不是这些作用域中的匹配命令
   1. vkCmdDispatch
   2. vkCmdDispatch
   3. vkCmdPipelineBarrier(srcStageMask = COMPUTE, dstStageMask = TRANSFER)
   4. vkCmdPipelineBarrier(srcStageMask = TRANSFER, dstStageMask = COMPUTE)
   5. vkCmdDispatch
   6. vkCmdDispatch