【发布时间】: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