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



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

源图像是各种大小的PNG和JPG,从例如100x100像素到16384x166384(我的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纹理内存?

采样nvidia-smi是计算利用率的一种非常糟糕的方法。使用Nvidia Visual Profiler(我发现它最容易使用(或Nvidia Nsight来真实了解您的性能和瓶颈。

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

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

最新更新