【问题标题】:Techniques for optimising GPU utilisation processing discrete images优化 GPU 利用率处理离散图像的技术
【发布时间】:2020-03-03 12:21:57
【问题描述】:

我有一个服务器正在对图像应用过滤器(实现为 OpenGL 着色器)。它们大多是直接颜色映射,但偶尔也会出现模糊和其他卷积。

源图像是各种尺寸的 PNG 和 JPG,例如100x100 像素,最高 16,384x16,384(我的 GPU 的纹理大小)。

管道是:

Decode image to RGBA (CPU)
        |
        V
Load texture to GPU
        |
        V
   Apply shader (GPU)
        |
        V
Unload to CPU memory
        |
        V
  Encode to PNG (CPU)

平均 GPU 时间约为 0.75 毫秒加载、1.5 毫秒卸载和 1.5 毫秒处理纹理。

我有多个 CPU 线程对 PNG 和 JPG 进行解码,以便为 GPU 提供连续的工作流。

挑战在于watch -n 0.1 nvidia-smi 报告说 GPU 利用率在很大程度上约为 0% - 1%,并定期飙升至 18%。

我真的希望从 GPU 中获得更多价值,即我希望看到它的负载至少在 50% 左右。我的问题:

  • nvidia-smi 是否合理地表示了 GPU 的繁忙程度?例如,它是否包括加载和卸载纹理的时间?如果没有,我可以使用更好的指标吗?

  • 假设是这样,并且 GPU 无所事事,是否有任何易于理解的架构来提高吞吐量?我考虑过将多个图像平铺成一个大纹理,但这感觉会耗尽 CPU 使用率而不是 GPU。

  • 是否可以在 GPU 处理上一张图像时将下一张图像加载到 GPU 纹理内存中?

【问题讨论】:

  • 对于直接颜色映射,您不应使用 GPU。在 CPU 中执行它肯定会更快。
  • 我可能在简化时误导了。 (大部分)着色器正在动态计算颜色映射,但计算非常简单,即亮度增强,不需要卷积或内核。
  • @DaveDurbin:“有没有什么方法可以在 GPU 处理上一张图像时将下一张图像加载到 GPU 纹理内存中?”你怎么还没有这样做呢? ?您是否尝试上传到当前正在使用的图像?我的意思是,这一切似乎都是一个非常简单的三重缓冲案例。

标签: performance opengl image-processing gpu hpc


【解决方案1】:

抽样nvidia-smi 是确定利用率的一种非常糟糕的方法。使用Nvidia Visual Profiler(我觉得这个最容易使用)或Nvidia Nsight 来了解你的性能和瓶颈是什么。

如果没有看到你的代码,也没有更好地了解瓶颈是什么,很难说如何提高性能。

  • 你说你有多个 CPU 线程在运行,但是你有多个 CUDA streams 以便隐藏数据传输的延迟吗?这允许您在 GPU 处理时将数据加载到它。
  • 你确定你有线程而不是进程吗?线程可能会减少开销。
  • 在 GPU 上应用单个着色器几乎不需要任何时间,因此您的管道最终可能会受到硬盘驱动器速度或总线速度的限制。您是否查看过这些规格,测量了图像的大小,并找到了最大处理能力的理论值?除非您对其进行大量复杂的数学运算,否则您的 GPU 可能会花费大量时间处于空闲状态。

【讨论】:

  • 感谢指向 CUDA 流的指针 - 和 NVIDIA Nsight,我正在寻找可以与例如集成的基于 CLI 的工具。 AWS 云观察。数据传输的大部分复杂性都隐藏在 OpenGL 调用之后。我曾考虑使用 CUDA 而不是 OpenGL,因为各个着色器非常简单,并且与处理重叠的数据传输似乎可以提高吞吐量,但我不确定这是否可能。我去看看。
  • @DaveDurbin:Visual Profiler 和 Nsight 可用于控制无头机器上的远程进程。 CLI 工具nvprof 也可用于生成输出,稍后可以在 NVVP 中进行分析。
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 2021-12-05
  • 2015-04-15
  • 2023-02-24
  • 2018-11-11
  • 2011-05-10
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多