使用管道障碍代替信号灯

Lie*_*mai 1 vulkan

我想确保我正确理解管道障碍。因此,如果第二个屏障的源阶段晚于第一个屏障的目标阶段,则屏障能够同步两个命令缓冲区。它是否正确?当然,如果命令缓冲区在管道的不同迭代期间执行,我将需要使用信号量。

在我看来,同步是Vulkan中最难掌握的部分。IMO规范对此还不够清楚。

krO*_*oze 6

前言:

适用于Vulkan管道屏障的大多数内容都适用于通用屏障和内存屏障,因此您可以从那里开始建立直觉。

我要指出的是,尽管该规范不是教程,但它相当清晰易读。同步可能是最难的部分和在说明书中的反射镜,该描述。最重要的是,内存障碍对于大多数人来说是新颖的(通常,它们被更高语言的编译器所屏蔽)。

所需的定义:

管道是工作单元如何处理的抽象方案。共有四种类型(尽管Vulkan并未说供应商只要遵循规则就如何做事):

  1. 主机访问伪管道(一级)
  2. 转移(一级)
  3. 计算(一级)
  4. 图形(具有很多阶段,即DI?VI?VS?TCS?TES?GS?EFT?FS?LFT?Output)

有特殊阶段TOP(完成任何操作之前),BOTTOM(完成所有操作之后)和ALL(与设置了所有阶段的位域相同)。

(动作)命令是需要(一个或多个)通过管道的命令。必须将其记录到命令缓冲区中(主机通过进行读写操作除外vkMapMemory())。

命令缓冲区是一些命令序列(按记录顺序!)。和队列过的序列记录命令(从submited命令缓冲器级联)。

队列具有一定的回旋余地,以其执行命令的顺序(只要保留用户设置状态,它就可以重新排序命令),并且还可以重叠命令(例如,在完成上一个命令的FS之前执行下一个命令的VS)。用户定义的同步原语为该余地设置了边界。(也有一些隐含的保证,但最好不要依赖它们,直到确信后才过度同步)

我对管道障碍的解释:

(也许不幸的是)流水线障碍融合了三个独立的方面-执行障碍,内存障碍和布局转换(如果是图像的话)。

执行屏障部分确保了屏障之前记录的所有命令在达到exececution至少指定的流水线级(或阶段)在srcStageMask 之前的任何屏障后记录的命令开始执行其指定的阶段(或阶段)中dstStageMask

它只处理执行依赖关系,而不处理内存!的存储器阻挡部分确保该存储器(高速缓存)被适当冲洗和无效的某处在之间执行屏障依赖性(即,根据后和从属命令和阶段之前)。

您可以提供它是哪种类型的内存依赖关系,以及在哪种类型的源/消费者之间(以便驱动程序可以选择适当的操作而无需记住状态本身)。通常情况下,读写依赖性(读写和读写不需要任何内存同步,而读写通常通常没有多大意义-为什么要覆盖一些数据而不先读取它们)。

在某些硬件上,内存中不同的数据布局可能是有利的(甚至是必要的)。在处理内存依赖关系的同时,对数据进行重新排序以遵循新的指定布局。