如何优化2个相同的内核,占用率50%,可以在CUDA中同时运行?

2023-12-13

我在 CUDA 中有 2 个相同的内核,报告理论占用率为 50%,并且可以同时运行。但是,在不同的流中调用它们会显示顺序执行。

每个内核调用的网格和块尺寸如下:

Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.

这会导致每个 SM 的线程过多以及每个块的寄存器过多。

我应该将下一步的优化重点放在减少内核使用的寄存器数量上吗?

或者将网格分割成许多较小的网格是否有意义,从而可能允许发布两个内核并同时运行。每个块的寄存器数量仍然会造成问题吗?

Note- deviceQuery 报告:

MAX_REGISTERS_PER_BLOCK 65K
MAX_THREADS_PER_MULTIPROCESSOR 1024
NUMBER_OF_MULTIPROCESSORS 68

我在 CUDA 中有 2 个相同的内核,报告理论占用率为 50%...

OK

...并且可以同时运行

这不是占用的含义,也是不正确的。

50% 的占用率并不意味着您有 50% 的未使用资源可供不同的内核同时使用。这意味着当运行最大理论并发扭曲数的 50% 时,您的代码耗尽了资源。如果您耗尽了资源,则无法再运行任何扭曲,无论它们来自该内核还是任何其他内核。

但是,在不同的流中调用它们会显示顺序执行。

由于上述原因,这正是应该预期的

每个内核调用的网格和块尺寸如下:

Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.

您提供了一个启动 1041600 个块的内核。这比最大的 GPU 可以同时运行的数量级还要高出几个数量级,这意味着如此巨大的网格的并发内核执行范围基本上为零。

这会导致每个 SM 的线程过多以及每个块的寄存器过多。

寄存器压力可能是限制占用率的原因

我应该将下一步的优化重点放在减少内核使用的寄存器数量上吗?

鉴于并发内核执行的目标是不可能的,我认为目标应该是使该内核运行得尽可能快。如何做到这一点是特定于代码的。在某些情况下,寄存器优化可以提高占用率和性能,但有时发生的情况是溢出到本地内存,从而损害性能。

或者将网格分割成许多较小的网格是否有意义,从而可能允许发布两个内核并同时运行。

当您说“很多”时,您将暗示数千个网格,这将意味着如此多的启动和调度延迟,如果您能够设法达到可以并发内核执行的程度,我无法想象这样做有什么好处。

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

如何优化2个相同的内核,占用率50%,可以在CUDA中同时运行? 的相关文章

  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • 比较字符串结尾的最佳方法是使用 RIGHT、LIKE 还是其他?

    我需要将字符串的结尾与存储过程中可能的结尾列表进行比较 会被叫很多 大概有10 15个候选结局 此时 仅使用代码的解决方案比创建专用于此的表更好 类似的东西 IF ENDSWITH var foo OR ENDSWITH var bar O
  • 如何通过点积获得峰值 CPU 性能?

    Problem 我一直在研究 HPC 特别是使用矩阵乘法作为我的项目 请参阅我的个人资料中的其他帖子 我在这些方面取得了不错的成绩 但还不够好 我退后一步 看看我在点积计算方面能做得如何 点积与矩阵乘法 点积更简单 并且允许我测试 HPC
  • 了解 Tensorflow 中的 while 循环

    我正在使用用于 Tensorflow 的 Python API https www tensorflow org api docs python 我正在努力实施罗森布罗克函数 https www sfu ca ssurjano rosen
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • Python 中快速、小型且重复的矩阵乘法

    我正在寻找一种使用 Python Cython Numpy 快速将许多 4x4 矩阵相乘的方法 任何人都可以给出任何建议吗 为了展示我当前的尝试 我有一个需要计算的算法 A 1 A 2 A 3 A N 哪里每个 A i A j Python
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • 使用列模数的更简洁方法

    我目前有一个人员列表 我已将其分为两列 但在完成代码后 我一直想知道是否有更有效或更干净的方法来完成同样的事情 echo table class area list tr Loop users within areas divided up
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 为什么 hibernate 在 SAVE 之前执行 SELECT?

    为什么 hibernate 在保存对象之前要进行选择 我在互联网上找不到有用的信息 这是每次保存之前的正常行为吗 我发现这个话题 选择 hibernateTemplate save 的查询运行 https stackoverflow com
  • Scipy 最小化 fmin - 语法问题

    我有一个函数 它接受多个参数 一个数组和两个浮点数 并返回一个标量 浮点数 现在我想通过改变两个参数来最小化这个函数 两个浮点数 该数组在函数内部 解包 然后使用其内容 数组和浮点数 如何使用 SciPy 的 fmin 函数来完成此操作 我
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • 缩小 ASP.NET 生成的 Javascript 的最佳方法是什么?

    在 ASP NET 3 5 运行时缩小 ASP NET 生成的 Javascript 例如由 webresource axd 提供的 Javascript 的最佳方法是什么 我尝试使用Mb压缩 http mbcompression code
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I

随机推荐