У меня есть сервер, который применяет фильтры (реализованные как шейдеры OpenGL) к изображениям. В основном это прямые цветовые сопоставления, а также иногда пятна и другие извилины.
Исходные изображения представляют собой PNG и JPG различных размеров, например, от 100x100 пикселей до 16,384x16,384 (размер текстуры для моего графического процессора).
Конвейер:
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 мс для обработки текстуры.
У меня есть несколько потоков ЦП, декодирующих PNG и JPG, чтобы обеспечить непрерывный поток работы дляGPU.
Проблема в том, что watch -n 0.1 nvidia-smi
сообщает, что загрузка GPU в основном составляет около 0% - 1%, периодически повышаясь до 18%.
Я действительно хочу получать больше пользы от графического процессора, то есть я хотел бы видеть, что его нагрузка составляет не менее 50%. Мои вопросы:
Дает ли nvidia-smi
разумное представление о том, насколько занят GPU? Включает ли это, например, время загрузки и выгрузки текстур? Если нет, то есть ли лучший показатель, который я мог бы использовать.
Если предположить, что это так, а графический процессор бездействует, есть ли хорошо понятые архитектуры для увеличения пропускной способности? Я подумал о том, чтобы объединить несколько изображений в большую текстуру, но создается впечатление, что это приведет к увеличению нагрузки на процессор, а не на графический процессор.
Есть ли возможность загрузить следующее изображение в графический процессор? память текстур, пока графический процессор обрабатывает предыдущее изображение?