【发布时间】:2021-01-30 17:13:36
【问题描述】:
更新:已解决,您可以在此处找到更多详细信息:https://stackoverflow.com/a/64405505/1889253
similar question was asked previously,但这个问题最初集中在使用多个命令缓冲区,并触发跨不同线程的提交以实现着色器的并行执行。大多数答案表明解决方案是使用多个队列。使用多个队列似乎也是各种博客文章和 Khronos 论坛答案的共识。我已经尝试了那些跨多个队列运行着色器执行但无法看到并行执行的建议,所以我想问一下我可能做错了什么。正如建议的那样,这个问题包括多个计算着色器的可运行代码被提交到多个队列,希望这对希望做同样事情的其他人有用(一旦解决)。
当前的实现是in this pull request / branch,但是我将介绍主要的 Vulkan 特定点,以确保回答这个问题只需要 Vulkan 知识。还值得一提的是,当前的用例专门用于计算队列和计算着色器,而不是图形或传输队列(尽管在这些方面实现并行性的见解/经验仍然非常有用,并且很可能也会导致答案)。
更具体地说,我有以下几点:
- Multiple queues first are "fetched" - 我的设备是 NVIDIA 1650,在队列族索引 0 中支持 16 个图形+计算队列,在队列族索引 2 中支持 8 个计算队列
- evalAsync performs the submission (which contains recorded shader commands) - 你应该注意到创建了一个我们可以使用的栅栏。提交也没有任何 waitStageMasks (PipelineStageFlags)。
- evalAwait allows us to wait for the fence - 调用 evalAwait 时,我们可以通过创建的栅栏等待提交完成
在上面的示例中看不到但很重要的几点:
- 所有 evalAsync 都在同一个应用程序、实例和设备上运行
- 每个 evalAsync 都使用自己单独的 commandBuffer 和缓冲区在单独的队列中执行
- 如果您想知道内存屏障是否有问题,我们已尝试完全移除所有内存屏障(this on for example 在着色器执行之前运行),但这对性能没有任何影响
在基准can be found here 中使用的测试,但是唯一需要理解的关键是:
- This is the shader 用于测试,如您所见,我们只是添加了一堆 atomicAdd 步骤以增加处理时间
- 目前测试有 small buffer 大小和 high number of shader loop iterations,但我们还测试了大缓冲区大小(即 100,000 而不是 10)和更小的迭代(1,000 而不是 100,000,000)。
在运行测试时,我们首先在同一个队列上运行一组“同步”着色器执行(数量是可变的,但我们使用 6-16 进行了测试,后者是队列的最大数量)。然后我们以异步方式运行它们,我们运行所有它们和 evalAwait 直到它们完成。在比较两种方法的结果时间时,即使它们在不同的计算队列中运行,它们所花费的时间也是相同的。
我的问题是:
- 我目前在获取队列时是否遗漏了什么?
- vulkan 设置中是否还有其他参数需要配置以确保异步执行?
- 关于潜在的操作系统进程只能以同步方式向 GPU 提交 GPU 工作负载,是否有任何我可能不知道的限制?
- 在处理多个队列提交时,是否需要多线程才能使并行执行正常工作?
此外,我在各种 reddit 帖子和 Khronos Group 论坛中找到了一些有用的资源,这些资源提供了关于该主题的非常深入的概念和理论概述,但我没有遇到显示并行执行的端到端代码示例着色器。如果您可以分享任何实用的示例,这些示例具有着色器的并行执行功能,那将非常有帮助。
如果有更多细节或问题可以帮助提供更多背景信息,请告诉我,我们很乐意回答和/或提供更多细节。
为了完整起见,我的测试使用的是:
- Vulkan SDK 1.2
- Windows 10
- NVIDIA 1650
已在类似帖子中分享的其他相关链接:
- Similar discussion with suggested link to example but which seems to have disappeared...
- Post on Leveraging asynchronous queues for concurrent execution(很遗憾没有示例代码)
- (相对较老 - 5 岁)Post that suggests nvidia cards can't do parallel execution of shaders,但似乎没有确定的答案
- Nvidia 演示文稿on Vulkan Multithreading with multiple queue execution(因此我在上面的线程问题)
【问题讨论】:
标签: c++ gpu gpgpu vulkan compute-shader