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

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

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

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

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

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

在以上示例中不可见但很重要的几点:

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

基准测试can be found here中使用的测试,但是唯一需要了解的关键是:

    如您所见,
  • This is the shader用于测试,我们只添加了一系列atomicAdd步骤以增加处理时间
  • 当前测试的大小为small bufferhigh 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

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

解决方法

您将获得“异步执行”。您只是不希望它的行为方式如此。

在CPU上,如果有一个活动线程,则说明您正在使用一个CPU内核(或超线程)。所有该内核的执行和计算功能都单独分配给您的线程(忽略抢占)。但是同时,如果有其他核心,则您的一个线程无法使用这些核心的任何计算资源。除非您创建另一个线程,否则不会。

GPU不能那样工作。队列不是像CPU线程。它并不具体涉及特定数量的计算资源。队列只是执行命令的接口;底层的硬件决定了如何将命令分配给GPU整体提供的各种计算资源。

执行命令时通常会发生的情况是,硬件会尝试使用命令完全饱和可用的着色器执行单元。如果可用的着色器单元数超过操作所需的调用次数,则某些资源可立即用于下一个命令。但是,如果没有,那么整个GPU的计算资源将专用于执行第一个操作。第二个必须等待资源可用才能开始。

您应该将多少计算队列投入工作;他们都将尝试使用尽可能多的计算资源。因此它们将在很大程度上按特定顺序执行。

存在队列优先级系统,但是这些系统主要有助于确定命令的执行顺序。也就是说,如果高优先级队列中有一些需要执行的命令,那么下次计算资源可用于新命令时,它们将具有优先级。

因此,在3个单独的队列中提交3个调度批处理不会比在一个包含3个调度操作的队列中提交1个批处理快。

存在多个(相同系列的)队列的主要原因是能够从多个线程提交工作,而无需进行线程间同步(并提供一些可能的提交优先级)。

,

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

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

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

有关实现https://kompute.cc/overview/async-parallel.html

的更多详细信息

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res