Vulkan 的同步看起来非常复杂和精细,但我没有找到满足我需求的方法。我需要这样做:
很明显,2 必须在 4 之前完成,这就是障碍存在的原因。但障碍是 STAGE_TRANSFER,这意味着管道 4 等待从设备到主机的读取 (1),这样做很疯狂,因为没有必要。这是对的吗?您可以有另一个专门用于设备到主机传输的队列,但实际上某些设备没有多个队列,至少在该系列中是这样。有些设备有一个系列和一个队列。
遇到这种情况该怎么办?
有些设备有一个系列和一个队列。
这也意味着该设备可能只有一个 DMA 控制器。
传输队列或多或少是为了与设备执行异步 DMA 传输的能力保持一致。 GPU 几乎总是通过 PCIe 总线连接到 CPU,即使在嵌入式设备中也是如此。这主要归因于使用经过验证的设计的便利性。 PCIe 数据传输的大小可达 4096 字节,但通常 CPU 一次只能移动更小的内存部分。因此,当软件以编程方式将数据发送到 GPU 时,通常必须首先从 CPU 传输 32 位数据。为了使数据传输更加高效,PCIe设备可以主控总线并绕过CPU直接访问RAM。这就是传输队列所代表的意义。
如果只有一个 DMA 控制器,则完全有可能在第一个移动命令完成之前第二个移动命令无法开始。
Vulkan 是一个抽象规范,旨在广泛适用于许多不同的设备。期望的是,如果 ICD 能够将两个传输分离为可以独立等待的并行操作,那么 ICD 还必须提供多个队列来公开该功能。队列毕竟是一组将按顺序执行的操作。
您唯一的选择是使用多个队列(如果可用),重新排序命令以防止不必要的命令堵塞队列,或者承担等待先前传输的成本。没有什么神奇的命令咒语可以克服物理硬件的限制。