Методы оптимизации использования GPU при обработке дискретных изображений - PullRequest
3 голосов
/ 07 ноября 2019

У меня есть сервер, который применяет фильтры (реализованные как шейдеры 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? Включает ли это, например, время загрузки и выгрузки текстур? Если нет, то есть ли лучший показатель, который я мог бы использовать.

  • Если предположить, что это так, а графический процессор бездействует, есть ли хорошо понятые архитектуры для увеличения пропускной способности? Я подумал о том, чтобы объединить несколько изображений в большую текстуру, но создается впечатление, что это приведет к увеличению нагрузки на процессор, а не на графический процессор.

  • Есть ли возможность загрузить следующее изображение в графический процессор? память текстур, пока графический процессор обрабатывает предыдущее изображение?

1 Ответ

2 голосов
/ 07 ноября 2019

Выборка nvidia-smi - очень плохой способ выяснить использование. Используйте Nvidia Visual Profiler (мне кажется, с этим проще всего работать) или Nvidia Nsight , чтобы получить истинную картину того, какова ваша производительность и узкие места.

Трудноскажем, как повысить производительность, не видя свой код и не имея лучшего понимания того, что является узким местом.

  • Вы говорите, что у вас работает несколько потоков ЦП, но есть ли у вас несколько потоков CUDA чтобы скрыть задержку передачи данных? Это позволяет загружать данные в графический процессор во время его обработки.
  • Вы уверены, что у вас есть потоки, а не процессы? Потоки могут снизить накладные расходы.
  • Применение одного шейдера на графическом процессоре почти не займет времени, поэтому ваш конвейер может в конечном итоге быть ограничен скоростью вашего жесткого диска или скоростью шины. Вы посмотрели эту спецификацию, измерили размер ваших изображений и нашли теоретическое значение для максимальной производительности обработки? Ваш графический процессор, скорее всего, проведет много времени в режиме ожидания, если вы не выполняете на нем много сложных математических операций.
...