优化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.75ms,卸载时序约为1.5ms,处理纹理的时序约为1.5ms。

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

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

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

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

  • 假设情况确实如此,而GPU却无所事事,是否有任何众所周知的架构可以提高吞吐量?我曾考虑过将多个图像平铺为大的纹理,但这似乎会消耗CPU而不是GPU。

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

ilu8989 回答:优化GPU利用率处理离散图像的技术

抽样nvidia-smi是弄清楚利用率的一种非常糟糕的方法。使用Nvidia Visual Profiler(我发现最简单的方法)或Nvidia Nsight来获得有关您的性能和瓶颈的真实情况。

很难说如何在不看代码的情况下以及没有更好地理解瓶颈的情况下提高性能。

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

大家都在问