бенчмарки Fastvideo SDK

Быстрое сжатие изображений по алгоритму JPEG на CUDA

Задача максимально быстрого сжатия изображений возникла в контексте приложений для скоростных видеокамер, выпускаемых нашей компанией. Все наши скоростные видеокамеры работают по принципу онлайн передачи всего регистрируемого потока несжатых данных от камеры в кольцевой буфер оперативной памяти компьютера. Таким образом, в компьютер поступает очень большой поток данных, которые нужно быстро обработать и записать. Обычно такие потоки данных записывают либо в оперативную память компьютера, либо на RAID-массив или SSD, а обработка всего потока данных в онлайне возможна только внутри камеры на ПЛИС (FPGA). К сожалению, софт для CPU с обработкой таких потоков данных не справляется в принципе, поэтому для решения задач этого класса мы использовали видеокарты NVIDIA с технологией CUDA.

В системах скоростной съёмки обычно используются монохромные видеокамеры, поскольку их чувствительность значительно выше, чем у цветных, поэтому ниже мы рассмотрим задачу онлайн компрессии видеопотока именно от монохромной камеры. Наша цель состоит в том, чтобы успеть всё сжать в онлайне, а полученный выходной поток записать на жёсткий диск компьютера. Мы выбрали алгоритм компрессии JPEG с потерями, потому что он может обеспечить быстроту и минимальные искажения при значительном коэффициенте сжатия, а также может быть эффективно распараллелен. Вопрос быстрого декодирования для задач скоростной съёмки не критичен, но тем не менее, декодирование изображений в формате JPEG тоже было реализовано на видеокарте.

быстрое сжатие изображений по алгоритму JPEG на CUDAОбщая схема работы кодера JPEG на CUDA

  • Загрузка приложения, инициализация и нумерация устройств, проверка их возможностей.
  • Выделение памяти, создание групп потоков, синхронизация с пользовательским приложением на CPU.
  • Получение от драйвера фреймграббера или от пользовательского приложения адреса или номера для последнего полученного изображения, находящегося в оперативной памяти компьютера.
  • Загрузка (копирование) кадра или серии последовательных 8-битных кадров из оперативной памяти CPU в память GPU.
  • Численные расчёты: Level shift, DCT, Quantization, Zig-Zag, AC/DC, DPCM, RLE, Huffman для каждого блока 8х8. Для кодирования используются статические таблицы Хаффмана. Все кадры кодируются по отдельности, корреляция кадров не учитывается.
  • Создание выходной строки байт для каждого сжатого блока 8х8, упорядоченная запись таких строк, запись выходного массива в отдельный буфер оперативной памяти.

Конфигурация компьютеров для тестирования

  • Настольный компьютер с Intel Core i7-5930K (Haswell-E, 6 ядер, 3.5–3.7 ГГц), DDR-III 8 ГБайт
  • Видеокарта для вычислений NVIDIA GeForce GTX 1080
  • Операционная система Windows-10, 64-bit, CUDA 12.0

Производительность CUDA JPEG на видеокарте GeForce GTX 1080 для 24-битных изображений

Мы получили следующие результаты для скорости сжатия (время загрузки изображений и их выгрузки после сжатия не включено в представленные результаты) на видеокарте GeForce GTX 1080:

  • Изображение Full HD (2К, 1920 х 1080, качество 90%, 4:2:0) - 15 ГБайт в секунду (время работы 0,356 мс)
  • Изображение 4К (3840 х 2160, качество 90%, 4:2:0) - 30 ГБайт в секунду (время работы 0,778 мс)

Кодирование в JPEG с качеством 90% и 4:2:0 примерно соответствует коэффициенту сжатия 10:1. Это случай сжатия, который визуально определяется как "почти без потерь" (visually lossless compression), т.е. при выборе таких параметров искажения малозаметны.

Производительность CUDA JPEG на видеокарте GeForce GTX 1080 для 12/36-битных изображений

Кроме стандартного решения для кодирования в JPEG для 8/24-битных изоражений была реализована и схема работы с изображениями, у которых 12 бит на канал (монохромные и цветные). Были получены следующие результаты для времени работы (время загрузки изображений и их выгрузки после сжатия не включено в представленные результаты) на видеокарте GeForce GTX 1080 для 12-битного изображения с разрешением 8736 × 5856:

  • Кодирование в JPEG с качеством 90% и прореживанием 4:4:4 ~ 8,6 мс
  • Кодирование в JPEG с качеством 90% и прореживанием 4:2:2 ~ 5,9 мс
  • Кодирование в JPEG с качеством 90% и прореживанием 4:2:0 ~ 5,8 мс
  • Кодирование в JPEG с качеством 90% для такой же 12-битной картинки ~ 3,9 мс

Таким образом, показана принципиальная возможность онлайн сжатия для систем скоростной съёмки, причём для довольно широкого класса графических карт, в том числе бюджетных и мобильных. Такое решение позволит значительно увеличить длительность скоростной съёмки и даст возможность записывать сжатый поток данных на жёсткий диск компьютера даже без использования RAID или SSD.

Бенчмарки для кодека JPEG и для других алгоритмов на CUDA можно скачать здесь.

Форма для отправки запроса

Эта форма сохраняет имя и адрес электронной почты.