如何在Vulkan中跨多个计算队列执行并行计算着色器?

斧头

更新:此问题已解决,您可以在此处找到更多详细信息:https : //stackoverflow.com/a/64405505/1889253

一个类似的问题以前问,但这个问题最初重点围绕使用多个命令缓冲区,并触发在不同的线程提交实现着色器的并行执行。大多数答案表明解决方案是改为使用多个队列。在多个博客帖子和Khronos论坛答案中,使用多个队列似乎也是共识。我尝试了那些建议在多个队列中运行着色器执行,但是却看不到并行执行的建议,所以我想问一下我可能做错了什么。如建议的那样,此问题包括正在提交到多个队列的多个计算着色器的可运行代码,希望这对希望这样做的其他人很有用(一旦解决)。

当前实现在此pull request /分支中,但是我将介绍Vulkan的主要要点,以确保仅需要Vulkan知识即可回答此问题。还值得一提的是,当前用例专用于计算队列和计算着色器,而不是图形或传输队列(尽管获得洞察/经验的经验仍然非常有用,并且很可能会得出答案)。

更具体地说,我有以下内容:

在上面的示例中看不到但很重要的几点:

  • 所有evalAsync都在同一应用程序,实例和设备上运行
  • 每个evalAsync使用其自己的单独的commandBuffer和缓冲区,并在单独的队列中执行
  • 如果您想知道是否有内存障碍可以做,我们尝试通过完全删除所有memoryBarriers(例如在着色器执行之前运行)来执行此操作,但这对性能没有任何影响

可在此处找到基准测试中使用的测试,但是要了解的唯一关键是:

  • 如您所见,这是我们用于测试的着色器,我们只添加了一堆atomicAdd步骤以增加处理时间
  • 当前,该测试具有较小的缓冲区大小和大量的着色器循环迭代,但是我们还使用较大的缓冲区大小(即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

在类似帖子中分享的其他相关链接:

斧头

我已经能够使用这个建议解决为了提供进一步的上下文,我试图将命令提交到同一系列中的多个队列,但是在链接的建议中指出,NVIDIA(和其他GPU供应商)在并行处理命令时具有不同的功能范围。提交。

在我的特殊情况下,我正在测试的NVIDIA 1650卡仅在将工作负载提交到不同队列家族中时才支持并发处理-更具体地说,它只能支持在一个图形队列和一个计算家族队列中提交一个并发命令。

我重新实现了代码,以允许为特定命令分配族队列,并且我能够实现并行处理(通过在两个queueFamilies中提交,速度提高了2倍)。

这是有关实现的更多详细信息https://kompute.cc/overview/async-parallel.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在Vulkan中的多个计算队列之间执行并行计算着色器?

来自分类Dev

OpenGL:在着色器中执行 TexCoord 计算,不好的做法?

来自分类Dev

并行计算多个值

来自分类Dev

Julia中的并行计算

来自分类Dev

Matlab中的并行计算

来自分类Dev

如何在火花数据帧上逐行执行并行计算?

来自分类Dev

如何在R并行计算中使用Reduce()函数?

来自分类Dev

如何在分区数组上运行并行计算线程?

来自分类Dev

MATLAB:如何在并行计算中共享HashMap

来自分类Dev

MATLAB:如何在并行计算中共享HashMap

来自分类Dev

如何在R并行计算中使用Reduce()函数?

来自分类Dev

链接计算着色器

来自分类Dev

OpenGL计算着色器中线程的执行顺序

来自分类Dev

R中的并行计算:如何使用内核

来自分类Dev

并行计算开销

来自分类Dev

并行计算

来自分类Dev

并行计算

来自分类Dev

并行计算方差

来自分类Dev

XGBoost如何进行并行计算?

来自分类Dev

如何正确并行计算总和?

来自分类Dev

锈中数组元素的并行计算

来自分类Dev

在队列集群上使用Python进行并行计算

来自分类Dev

如何统一从计算着色器修改纹理像素?

来自分类Dev

在OpenGL中渲染数据:顶点和计算着色器

来自分类Dev

在计算着色器中添加图像原子

来自分类Dev

在计算着色器中添加图像原子

来自分类Dev

imageStore在计算着色器中以深度纹理

来自分类Dev

QML中的计算着色器出现段故障

来自分类Dev

HLSL(计算着色器)中的奇数线程程序