假设行动 1、2、3 产生结果 A,
行动 4、5、6 产生结果 B。
还有,
行动 7,8 需要结果 A,但不需要结果 B。
行动 9 需要 OutcomeB,但不需要 OutcomeA。
如果我这样写,事件B的范围是多少? 行动 9 也会等待结果 A(行动 1,2,3)吗?
如果答案是肯定的(这不是我想要的),正确的方法是什么?
// Three dispatches that don’t have conflicting resource accesses
vkCmdDispatch( 1 );
vkCmdDispatch( 2 );
vkCmdDispatch( 3 );
// 4, 5, and 6 don’t share resources with 1, 2, and 3
// No reason for them to be blocked, so set an event to wait for later
vkCmdSetEvent( A, srcStageMask = COMPUTE );
vkCmdDispatch( 4 );
vkCmdDispatch( 5 );
vkCmdDispatch( 6 );
// 7 and 8 don’t use the same resources as 4, 5, and 6. So use an event
vkCmdSetEvent( B, srcStageMask = COMPUTE );
// 7 and 8 need the results of 1, 2, and 3
// So we’ll wait for them by waiting on A
vkCmdWaitEvents( A, dstStageMask = COMPUTE );
vkCmdDispatch( 7 );
vkCmdDispatch( 8 );
// 9 uses the same resources as 4, 5, and 6 so we wait.
// Also assumed is that 9 needs nothing from 7 and 8
vkCmdWaitEvents( B, dstStageMask = COMPUTE );
vkCmdDispatch( 9 );
是的,事件将与信号之前和等待之后提交的每个命令同步,前提是它们与管道阶段匹配。如果您确实想要最大程度的独立性,则需要将这些命令集提交到不同的队列/队列系列。
但是,您还应该记住,仅仅因为驱动程序可以并行安排工作,并不一定会这样做 - 这取决于您提交的大小和可用的硬件资源。使用多个队列也不是免费的,因此您应该衡量这种分割是否真的值得。