优化 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
是否合理地表示了 GPU 的繁忙程度?例如,它是否包括加载和卸载纹理的时间?如果没有,我可以使用更好的指标吗?
假设是这样,并且 GPU 无所事事,是否有任何易于理解的架构来提高吞吐量?我考虑过将多个图像平铺成一个大纹理,但这感觉它会耗尽 CPU 使用率而不是 GPU。
有什么方法可以在 GPU 处理上一张图像的同时将下一张图像加载到 GPU 纹理内存?
抽样 nvidia-smi
是一种非常糟糕的计算利用率的方法。使用 Nvidia Visual Profiler (I find this easiest to work with) or Nvidia Nsight 了解您的性能和瓶颈的真实情况。
如果没有看到您的代码并且没有更好地理解瓶颈是什么,很难说如何提高性能。
- 你说你有多个 CPU 线程,但你有多个 CUDA streams 可以隐藏数据传输的延迟吗?这允许您在处理数据时将数据加载到 GPU。
- 你确定你有线程而不是进程吗?线程可能会减少开销。
- 在 GPU 上应用单个着色器几乎不需要时间,因此您的管道最终可能会受到硬盘驱动器速度或总线速度的限制。您是否查看过此规格、测量图像大小并找到最大处理能力的理论值?您的 GPU 可能会花费大量时间闲置,除非您在其上进行大量复杂的数学运算。
我有一台服务器正在对图像应用滤镜(作为 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 纹理内存?
抽样 nvidia-smi
是一种非常糟糕的计算利用率的方法。使用 Nvidia Visual Profiler (I find this easiest to work with) or Nvidia Nsight 了解您的性能和瓶颈的真实情况。
如果没有看到您的代码并且没有更好地理解瓶颈是什么,很难说如何提高性能。
- 你说你有多个 CPU 线程,但你有多个 CUDA streams 可以隐藏数据传输的延迟吗?这允许您在处理数据时将数据加载到 GPU。
- 你确定你有线程而不是进程吗?线程可能会减少开销。
- 在 GPU 上应用单个着色器几乎不需要时间,因此您的管道最终可能会受到硬盘驱动器速度或总线速度的限制。您是否查看过此规格、测量图像大小并找到最大处理能力的理论值?您的 GPU 可能会花费大量时间闲置,除非您在其上进行大量复杂的数学运算。