由于占用率低而导致 GPU 利用率不足是什么意思?

2024-01-18

我正在使用 NUMBA 和 cupy 来执行 GPU 编码。现在我已将代码从 V100 NVIDIA 卡切换到 A100,但是随后我收到以下警告:

  1. NumbaPerformanceWarning:网格大小 (27)

  2. NumbaPerformanceWarning:CUDA 内核中使用的主机数组将产生与设备之间的复制开销。

有谁知道这两个警告到底意味着什么?那我应该如何改进我的代码呢?


NumbaPerformanceWarning:网格大小 (27)

GPU 又细分为 SM。每个 SM 可以容纳一组线程块(这就像说它可以容纳一组线程)。为了“充分利用”GPU,您会希望每个 SM 都“满”,这大致意味着每个 SM 有足够的线程块来填充其线程补充。 A100 GPU 有 108 个 SM。如果您的内核在内核启动时的线程块(即网格)少于 108 个,那么您的内核将无法充分利用 GPU。有些短信将是空的。一个线程块不能同时驻留在 2 个或更多 SM 上。即使 108 个(每个 SM 一个)也可能不够。一个 A100 SM 可以容纳 2048 个线程,这至少是两个线程块,每个线程块有 1024 个线程。内核启动中任何少于 2*108 线程块的情况都可能无法充分利用 GPU。当您没有充分利用 GPU 时,您的性能可能不会那么好。

解决方案是在内核启动时公开足够的并行性(足够的线程),以完全“占用”或“利用”GPU。 216 个线程块(每个线程块有 1024 个线程)对于 A100 来说足够了。少一点可能就不会了。

为了进一步理解这里,我推荐前 4 部分这个课程 https://www.olcf.ornl.gov/cuda-training-series/.

NumbaPerformanceWarning:CUDA 内核中使用的主机数组将产生与设备之间的复制开销。

numba 内核启动的最酷的事情之一是我可以向它传递一个主机数据数组:

a = numpy.ones(32, dtype=numpy.int64)
my_kernel[blocks, threads](a)

numba 会“做正确的事”。在上面的例子中它将:

  1. 创建一个设备数组,用于存储a在设备内存中,我们称之为d_a
  2. 复制数据来自a to d_a(主机->设备)
  3. 启动你的内核,内核实际使用的地方d_a
  4. 当内核完成后,复制内容d_a回到a(设备->主机)

这一切都非常方便。但如果我做这样的事情怎么办:

a = numpy.ones(32, dtype=numpy.int64)
my_kernel1[blocks, threads](a)
my_kernel2[blocks, threads](a)

numba 将执行上述步骤 1-4 来启动my_kernel1然后执行步骤1-4again为推出my_kernel2。在大多数情况下,这可能不是您作为 numba cuda 程序员想要的。

这种情况下的解决方案是“控制”数据移动:

a = numpy.ones(32, dtype=numpy.int64)
d_a = numba.cuda.to_device(a)
my_kernel1[blocks, threads](d_a)
my_kernel2[blocks, threads](d_a)
a = d_a.to_host()

这消除了不必要的复制,并且在许多情况下通常会使您的程序运行得更快。 (对于涉及单个内核启动的简单示例,可能没有什么区别。)

为了获得更多理解,可能可以使用任何在线教程,例如this one https://nyu-cds.github.io/python-numba/05-cuda/,或者只是 numba cuda 文档,将会很有用。

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

由于占用率低而导致 GPU 利用率不足是什么意思? 的相关文章

  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • cuda 文件组织的有效方式:.cpp .h .cu .cuh .curnel 文件

    cuda最容易理解 最高效的代码组织是什么 经过一番调查后 我发现 cuda 函数声明应位于 cuh 文件中 实现位于 cu 文件中 内核函数实现位于 curnel 文件中 其他 C 内容通常在 cpp 和 h 文件中 最近我发布了一个问题
  • 如何充分释放函数中使用的GPU内存

    我在用着cupy在接收一个函数numpy数组 将其推到 GPU 上 对其进行一些操作并返回cp asnumpy它的副本 问题 函数执行后内存没有被释放 如ndidia smi 我知道内存的缓存和重用cupy 但是 这似乎仅适用于每个用户 当
  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element
  • 如何在CUDA应用程序中正确应用线程同步?

    一般来说 我在应用程序中偶尔会使用线程同步 因为我并不经常需要此功能 我并不是真正的高级 C C 程序员 但我也不是初学者 我开始学习 CUDA C 对当今 GPU 与 CPU 的能力相比感到兴奋 我意识到 CUDA 编程主要是关于并行线程
  • NVCC 警告级别

    我希望 NVCC 将以下警告视为错误 warning calling a host function foo from a host device function bar NVCC 文档 NVIDIA CUDA 编译器驱动程序 NVCC
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 在 Cuda 中简单添加两个 int,结果始终相同

    我开始了学习Cuda的旅程 我正在玩一些 hello world 类型的 cuda 代码 但它不起作用 我不知道为什么 代码非常简单 取两个整数并将它们添加到 GPU 上并返回结果 但无论我将数字更改为什么 我都会得到相同的结果 如果数学那
  • CUDA 和 Eigen 的成员“已声明”错误

    我只是 CUDA 和 Nsight 的初学者 希望利用出色的 GPU 性能进行线性代数运算 例如 CUBLAS 我在以下人员的帮助下编写了很多自定义代码Eigen http eigen tuxfamily org index php tit
  • 使用推力来处理 CUDA 类中的向量?

    我对 C 类的推力的适用性有疑问 我正在尝试实现一个类对象 该对象接收顶点的 x y z 坐标作为 ver1 ver2 和 ver3 然后 分配给一个三角形并计算面积和法向量 然而 我不太明白如何创建一类推力向量 这是我从文件中读取的顶点坐
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • 如何从C++头文件调用CUDA文件?

    我知道从 c 文件调用 cu 文件的方法 但现在我想从 C 头文件调用 cu 文件 有可能做到吗 如果是这样 我应该如何设置我的项目 请帮忙 这是一个有效的例子 file1 h int hello file2 h include
  • 了解流式多处理器 (SM) 和流式处理器 (SP)

    我正在尝试了解 GPU 的基本架构 我已经阅读了很多材料 包括这个非常好的答案 https stackoverflow com a 2213744 2386113 但我仍然很困惑 无法得到一个好的图片 我的理解 GPU 包含两个或多个流式多
  • 如何降级cuda版本

    我目前使用的是 cuda 版本 4 2 但我需要将其更改为 3 1 是否可以卸载当前版本 4 2 版 然后安装以前的版本 3 1 版 编辑 请参阅我的操作系统是linux ubuntu 10 04 64位 编辑 我找到了如何获取 3 1 版

随机推荐