更新:此问题已解决,您可以在此处找到更多详细信息:https : //stackoverflow.com/a/64405505/1889253
一个类似的问题以前问,但这个问题最初重点围绕使用多个命令缓冲区,并触发在不同的线程提交实现着色器的并行执行。大多数答案表明解决方案是改为使用多个队列。在多个博客帖子和Khronos论坛答案中,使用多个队列似乎也是共识。我尝试了那些建议在多个队列中运行着色器执行,但是却看不到并行执行的建议,所以我想问一下我可能做错了什么。如建议的那样,此问题包括正在提交到多个队列的多个计算着色器的可运行代码,希望这对希望这样做的其他人很有用(一旦解决)。
当前实现在此pull request /分支中,但是我将介绍Vulkan的主要要点,以确保仅需要Vulkan知识即可回答此问题。还值得一提的是,当前用例专用于计算队列和计算着色器,而不是图形或传输队列(尽管获得洞察/经验的经验仍然非常有用,并且很可能会得出答案)。
更具体地说,我有以下内容:
在上面的示例中看不到但很重要的几点:
可在此处找到基准测试中使用的测试,但是要了解的唯一关键是:
在运行测试时,我们首先在同一队列上运行一组“同步”着色器执行(数量是可变的,但是我们已经使用6-16进行了测试,后者是最大队列数)。然后,我们以异步方式运行它们,在其中运行所有它们和evalAwait,直到它们完成为止。比较两种方法的结果时间时,即使它们跨不同的计算队列运行,它们也花费相同的时间。
我的问题是:
此外,我在各种reddit帖子和Khronos Group论坛上在线找到了一些有用的资源,这些资源提供了有关该主题的非常深入的概念和理论概述,但是我没有碰到显示着色器并行执行的端到端代码示例。如果有任何您可以共享的实际示例,并且具有并行执行着色器的功能,那将非常有帮助。
如果还有其他细节或问题可以帮助您提供更多背景信息,请告诉我,很高兴为您解答和/或提供更多细节。
为了完整起见,我的测试使用的是:
在类似帖子中分享的其他相关链接:
我已经能够使用这个建议解决。为了提供进一步的上下文,我试图将命令提交到同一系列中的多个队列,但是在链接的建议中指出,NVIDIA(和其他GPU供应商)在并行处理命令时具有不同的功能范围。提交。
在我的特殊情况下,我正在测试的NVIDIA 1650卡仅在将工作负载提交到不同队列家族中时才支持并发处理-更具体地说,它只能支持在一个图形队列和一个计算家族队列中提交一个并发命令。
我重新实现了代码,以允许为特定命令分配族队列,并且我能够实现并行处理(通过在两个queueFamilies中提交,速度提高了2倍)。
这是有关实现的更多详细信息https://kompute.cc/overview/async-parallel.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句