Vulkan 中的信号量何时用于在队列操作和主机之间插入依赖关系?
When are semaphores in Vulkan used to insert dependency between a queue operation and the host?
规范中关于 VkSemaphore 的描述:
Semaphores are a synchronization primitive that can be used to insert a dependency between queue operations or between a queue operation and the host.
在什么情况下您会使用信号量在队列操作和主机之间建立依赖关系?我只见过 VkSemaphore 用于在队列操作之间放置依赖关系,以及用于在队列和主机之间进行同步的栅栏。
Fences 用于在队列操作完成到某个点时发出信号。通信是单向的:从 GPU 到主机。
时间轴信号量有点不同。它们代表不断增加的计数器值。当时间线信号量为 "signaled" 时,计数器会增加,等待操作可以等待计数器达到特定值。
因为时间线信号量只是计数器,主机完全有可能"signal"一个and/or等待一个达到给定的计数器值。这两者都很有用,因为栅栏代表非常粗粒度的操作:整个队列提交等。相比之下,信号量附加到单个提交中的各个批次。
请注意,这仅适用于时间线信号量(这就是您之前可能没有见过它的原因;时间线信号量是 Vulkan 1.2 的一项功能)。主机不能直接与二进制信号量交互,尽管可以从中提取特定于实现的句柄并以这种方式与它们交互。
至于它的用途,好吧,您可以仅用时间线信号量代替栅栏和事件的许多用途。信号量比栅栏更细粒度,您不必为重置它们和循环遍历多个栅栏对象而烦恼。如果你想知道你是否执行过第 X 帧,你只需询问时间轴信号量它的计数器是否超过了第 X 帧的计数器值。
事件仍然是您所需要的,因为信号量信号和等待操作只能在批次之间进行。但是,如果可以将 GPU 等待操作放入批处理的开始,则可以将许多用于主机到 GPU 传输操作的事件制成时间线信号量。所以再一次,你减少了你必须做的对象重置和杂耍的数量。
规范中关于 VkSemaphore 的描述:
Semaphores are a synchronization primitive that can be used to insert a dependency between queue operations or between a queue operation and the host.
在什么情况下您会使用信号量在队列操作和主机之间建立依赖关系?我只见过 VkSemaphore 用于在队列操作之间放置依赖关系,以及用于在队列和主机之间进行同步的栅栏。
Fences 用于在队列操作完成到某个点时发出信号。通信是单向的:从 GPU 到主机。
时间轴信号量有点不同。它们代表不断增加的计数器值。当时间线信号量为 "signaled" 时,计数器会增加,等待操作可以等待计数器达到特定值。
因为时间线信号量只是计数器,主机完全有可能"signal"一个and/or等待一个达到给定的计数器值。这两者都很有用,因为栅栏代表非常粗粒度的操作:整个队列提交等。相比之下,信号量附加到单个提交中的各个批次。
请注意,这仅适用于时间线信号量(这就是您之前可能没有见过它的原因;时间线信号量是 Vulkan 1.2 的一项功能)。主机不能直接与二进制信号量交互,尽管可以从中提取特定于实现的句柄并以这种方式与它们交互。
至于它的用途,好吧,您可以仅用时间线信号量代替栅栏和事件的许多用途。信号量比栅栏更细粒度,您不必为重置它们和循环遍历多个栅栏对象而烦恼。如果你想知道你是否执行过第 X 帧,你只需询问时间轴信号量它的计数器是否超过了第 X 帧的计数器值。
事件仍然是您所需要的,因为信号量信号和等待操作只能在批次之间进行。但是,如果可以将 GPU 等待操作放入批处理的开始,则可以将许多用于主机到 GPU 传输操作的事件制成时间线信号量。所以再一次,你减少了你必须做的对象重置和杂耍的数量。