每个流有多个内核的 CUDA 并发内核执行

2024-02-02

对 CUDA 内核使用不同的流使得并发内核执行成为可能。所以n内核上n如果流适合硬件,理论上它们可以同时运行,对吧?

现在我面临以下问题: 没有n不同的内核但是n*m where m内核需要按顺序执行。例如n=2 and m=3将导致以下带有流的执行方案:

Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>>
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>>

我天真的假设是内核 x.0 和 y.1 应该同时执行(从理论角度来看)或至少不连续执行(从实际角度来看)。但我的测量结果表明情况并非如此,并且似乎执行了连续执行(即 K0.0、K1.0、K2.0、K0.1、K1.1、K2.1)。内核本身非常小,因此并发执行应该不成问题。

现在我的方法是完成一种调度,以确保内核以交错方式排队到 GPU 上的调度程序中。但是,当处理大量流/内核时,这可能弊大于利。

好吧,开门见山:解决这种情况的适当(或至少不同)方法是什么?

Edit:测量是通过使用 CUDA 事件完成的。我测量了完全解决计算所需的时间,即。 e. GPU 必须计算所有n * m内核。假设是:在完全并发的内核执行上,执行时间大致为(理想情况下)1/n按顺序执行所有内核所需时间的倍数,因此必须可以同时执行两个或多个内核。我现在只使用两个不同的流来确保这一点。

我可以测量使用所描述的流和交错分派内核之间执行时间的明显差异,即。即:

Loop: i = 0 to m
    EnqueueKernel(Kernel i.1, Stream 1)
    EnqueueKernel(Kernel i.2, Stream 2)

versus

Loop: i = 1 to n
    Loop: j = 0 to m
        EnqueueKernel(Kernel j.i, Stream i)

后者导致更长的运行时间。

Edit #2:将流编号更改为以 1 开头(而不是 0,请参阅下面的注释)。

Edit #3:硬件是NVIDIA Tesla M2090(即Fermi,计算能力2.0)


在 Fermi(又名计算能力 2.0)硬件上,最好将内核启动交错到多个流,而不是先将所有内核启动到一个流,然后再启动下一个流,依此类推。这是因为硬件可以立即将内核启动到不同的流(如果有)有足够的资源,而如果后续启动是针对同一个流,则通常会引入延迟,从而降低并发性。这就是您的第一种方法表现更好的原因,并且您应该选择这种方法。

启用分析还可以禁用 Fermi 上的并发性,因此请小心。另外,在启动循环期间使用 CUDA 事件时要小心,因为它们可能会产生干扰——例如,最好使用事件来计时整个循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个流有多个内核的 CUDA 并发内核执行 的相关文章

  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • Java 8:并行 FOR 循环

    我听说 Java 8 提供了很多关于并发计算的实用程序 因此我想知道并行给定 for 循环的最简单方法是什么 public static void main String args Set
  • 内联 PTX 汇编代码强大吗?

    我看到一些代码示例 人们在 C 代码中使用内联 PTX 汇编代码 CUDA工具包中的文档提到PTX很强大 为什么会这样呢 如果我们在 C 代码中使用这样的代码 我们会得到什么好处 内联 PTX 使您可以访问未通过 CUDA 内在函数公开的指
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

    在 CUDA 可视化分析器版本 5 中 我知道 gld st requested throughput 是应用程序请求的内存吞吐量 然而 当我试图找到硬件的实际吞吐量时 我很困惑 因为有两对似乎合格的指标 它们是 gld st throug
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • 大型跨平台软件项目的技巧/资源

    我将开始一个大型软件项目 涉及跨平台 GUI 和大量的数字运算 我计划用 C 和 CUDA 编写大部分应用程序后端 并用 Qt4 编写 GUI 我计划使用 Make 作为我的构建系统 这将是一个只有两名开发人员的项目 一旦我相对深入地了解它
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern
  • PyInstaller 是否包含 CUDA

    我正在开发一个Python脚本 我使用Python 3 7 3 它使用tensorflow gpu 1 14 0 并使用PyInstaller 3 5将此脚本转换为可执行文件 我使用的是 CUDA 10 0 和 cuDNN 7 6 1 我的
  • Python 多处理:全局对象未正确复制到子级

    前几天我回答了一个关于SO的问题 https stackoverflow com q 67047533 1925388关于并行读取 tar 文件 这是问题的要点 import bz2 import tarfile from multipro
  • scala.concurrent.blocking - 它实际上做了什么?

    我花了一段时间学习 Scala 执行上下文 底层线程模型和并发性的主题 你能解释一下通过什么方式吗scala concurrent blocking 调整运行时行为 and 可以提高性能或避免死锁 如中所述scaladoc http www
  • ArrayDeque 和 LinkedBlockingDeque

    只是想知道为什么他们做了一个LinkedBlockingDeque而同一个非并发对应物是ArrayDeque它基于可调整大小的数组 LinkedBlockingQueue使用一组节点 例如LinkedList 尽管没有实施List 我知道可
  • CUDA Thrust 的多 GPU 使用

    我想使用我的两张显卡通过 CUDA Thrust 进行计算 我有两张显卡 在单卡上运行对于两张卡都适用 即使我在 std vector 中存储两个 device vector 也是如此 如果我同时使用两张卡 循环中的第一个周期将起作用并且不
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 设备内存刷新cuda

    我正在运行一个 C 程序 其中调用了两次 cuda 主机函数 我想清理这两个调用之间的设备内存 有没有办法可以刷新 GPU 设备内存 我使用的是计算能力为2 0的Tesla M2050 如果你只想将内存归零 那么cudaMemset可能是最

随机推荐

  • C# 与非托管 C++ 互操作性的延续传奇

    经过一天的头撞墙之后 我恳求帮助 我有一个非托管 C 项目 它被编译为 DLL 我们就这样称呼它吧光热发电项目 它目前在非托管环境中运行 另外 我还创建了一个WPF项目 该项目将被称为WPF项目 该项目是一个简单且目前几乎是空的项目 它包含
  • 向 Angular 4 添加第三方资源

    一般来说 我更喜欢添加第三方资源 angular cli json styles bower components animate css animate css bower components chosen chosen css bow
  • Android 上的关键字激活语音识别

    是否可以在您自己的应用程序中使用 google now 这个很酷的语音激活功能 所以我想要的是用户不必通过按下按钮或其他东西来触发激活 像那样 我宁愿有一个由关键字激活的自动语音识别功能 例如 当 google now 打开时 您只需说 g
  • Android:在 ActionBarSherlock 库中 getSupportActionBar() 始终返回 null

    我正在尝试使用动作栏夏洛克 https github com JakeWharton ActionBarSherlock库来为我的 Android 应用程序中的选项卡提供向后兼容的 ActionBar 支持 因此我下载了最新版本 构建了演示
  • 无法在项目 inv-project 上执行目标 org.codehaus.mojo:rpm-maven-plugin:2.0.1:rpm (default-cli)

    我在创建 Maven 项目的 RPM 时收到以下错误 我能够成功打包 Jar 但 RPM 创建失败 Note 我正在 Windows 7 上尝试 WARNING operable program or batch file INFO INF
  • 在哪里存储要执行的 SQL 命令

    由于内联 mysql 查询 我们面临代码质量问题 自己编写的 mysql 查询确实会使代码变得混乱 并且还会增加代码库等 我们的代码充满了类似的东西 beautify ignore start jshint ignore start var
  • 使 Meteor 方法同步

    我一直在尝试使这个功能同步 我读过几篇关于异步的 Stack Overflow 帖子 但我无法理解如何使其同步 到目前为止 它是异步的 因此在进入回调函数之前它会返回未定义 我从客户端调用它 Meteor call screenName f
  • 从 docker 容器连接到 SQL Server 数据库

    我的机器上安装了 docker for windows 有一个针对 net core 1 0 0 的控制台应用程序尝试访问在不同虚拟机上运行的 SQL Server 数据库 我可以从我的计算机上 ping 运行 SQL Server 的虚拟
  • 实体框架多对多映射上的软删除

    我有一个多对多 EF 映射 类似于下面的示例 我使用 EF 代码优先方法 因此我的映射类继承 EntityTypeConfiguration this HasMany a gt a KPIs WithMany Map a gt a ToTa
  • 具有不完整类型目标 C 的变量

    我试图将枚举作为方法签名的一部分 但在 h 文件中出现了这个可怕的错误 Declaration of enum CacheFile will not be visible outside this function 我的 h 文件中有这个
  • Flutter 中垂直 ScrollView 内的水平 ListView

    我现在试图实现一个非常常见的行为 即在另一个可同时滚动的小部件中拥有一个水平列表 想象一下 IMDb 应用程序的主屏幕 所以我想要一个可以垂直滚动的小部件 上面只有很少的项目 在它的顶部 应该有一个水平的ListView 随后是一些名为mo
  • 在 LINQ 查询中将 DateTimeOffset 转换为 DateTime

    当我通过 linq 查询从该表中获取数据并使用时 我的表中有 DateTimeOffset 列 from c in this dbContext SomeTable where c Id someId select new SomeMode
  • 如何自定义 Eclipse 工具栏(Kepler 或一般工具栏)

    我尝试自定义 Eclipse Kepler JavaEE 中的工具栏已经有一段时间了 最终在给定透视图 例如 主 JavaEE 透视图 中按照我想要的方式配置工具栏后 当我切换到不同的透视图 例如 调试透视图 然后再切换回来时 它完全混乱了
  • 模式匹配不等式

    我想从不平等的实例中提取论据 以下不起作用 知道为什么以及如何解决它吗 Inequality 1 Less x Less 2 Inequality a c e gt a c e Inequality 1 Less x Less 2 Hold
  • JBoss AS 7:日志记录

    我对 JBoss AS7 和日志记录有点挣扎 尽管我的问题是一个非常普遍的问题 但我在网络上找不到任何相关内容 默认日志目前如下所示 11 57 29 950 INFO stdout http 0 0 0 0 8081 78 2484089
  • 在 Go 中安装 exp/html

    看起来 Go 还不支持 HTML Web 解析工具 包 尽管它已经通过以下方式提供了 XML 抓取encoding xml 那么我该如何安装exp htmlGo 中的包 据我所知 所有的答案 至少我在网上搜索了10分钟后偶然发现的 都没有返
  • Visual Studio 的评论重花

    是否有内置命令或工具可以在 Visual Studio 中重排 C 注释 有时 一段代码需要多行注释 经过大量编辑后 您必须在适当的位置手动插入换行符 以免它超出编辑器窗口的右边缘 我希望能够通过一个键命令来完成此操作 使用 Visual
  • 使用 ggplot2 在 R 中绘制箱线图

    我是 R 新手 一直在尝试制作箱线图 显示了我正在使用的部分数据 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 1 0 003719430 0 002975544 0 003049933 0 003421876 0 0034
  • 在 Express / Connect 中配置上下文路径

    我有一个在 Expressconnect Jade Less 上使用 Coffeescript 构建的 Node js 应用程序 该应用程序将部署在几个不同的地方和不同的上下文路径上 例如 http someurl com http som
  • 每个流有多个内核的 CUDA 并发内核执行

    对 CUDA 内核使用不同的流使得并发内核执行成为可能 所以n内核上n如果流适合硬件 理论上它们可以同时运行 对吧 现在我面临以下问题 没有n不同的内核但是n m where m内核需要按顺序执行 例如n 2 and m 3将导致以下带有流