优化 GPU 利用率处理离散图像的技术

Techniques for optimising GPU utilisation processing discrete images

我有一台服务器正在对图像应用滤镜(作为 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 是一种非常糟糕的计算利用率的方法。使用 Nvidia Visual Profiler (I find this easiest to work with) or Nvidia Nsight 了解您的性能和瓶颈的真实情况。

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

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