我有一台服务器,该服务器正在将滤镜(实现为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纹理内存中?