- Кодек JPEG на CUDA. Быстрое сжатие изображений на видекартах NVIDIA.

кодек JPEG на CUDAКодек JPEG на CUDA

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

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

кодек JPEG на CUDAВозможности кодека JPEG для CUDA

  • Кодек полностью соответствует стандарту Baseline JPEG
  • Компрессия и декомпрессия по алгоритму JPEG для 8/24-битных изображений
  • Входные данные: 8/24-битные изображения в RAM/HDD/RAID/SSD
  • Выходные данные: итоговые сжатые/расжатые изображения в RAM/HDD/RAID/SSD
  • Максимальный размер изображения 16000 x 16000 и более (опция)
  • Качество сжатия (параметр алгоритма JPEG) от 1 до 100%
  • Режимы работы 4:4:4, 4:2:2, 4:2:0 (4:1:1)
  • Максимальное количество рестарт маркеров - 1 на MCU
  • Непрерывный режим работы (потоковое кодировани и декодирование)
  • Стандартная схема обработки данных в соответствии с Baseline JPEG
    • Кодирование JPEG: Input data parcing, Color Transform, Level shift, 2D DCT, Quantization, Zig-zag, AC/DC, DPCM, RLE, Huffman, Byte stuffing, JFIF formatting
    • Декодирование JPEG: JFIF parcing, Restart marker search, Inverse Huffman, Inverse RLE, Inverse DPCM, AC/DC, Inverse Zig-zag, Inverse Quantization, IDCT, Inverse Level shift, Inverse Color Transform, Output formatting
  • Оптимизация для видеокарт NVIDIA (Kepler, Maxwell, Pascal, Volta, Turing)
  • ОС Windows-7/8/10, Linux Ubuntu/CentOS, L4T

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

Бенчмарки кодека JPEG на NVIDIA GeForce GTX 1080 TI и Quadro P6000 (Windows-7, CUDA-9.2)

На этой видеокарте нам требуется всего лишь 0,51 мсек для сжатия по алгоритму Baseline JPEG 24-битного цветного изображения с разрешением 4K (3840 × 2160) с качеством JPEG 90% и схемой прореживания 4:2:0 (этот набор параметров соответствуют так называемому визуальному сжатию без потерь), при этом коэффициент сжатия примерно равен 10:1.

Ниже приведены бенчмарки производительности при кодировании и декодировании изображений с разрешениями 2K и 4K, 24-бит (все вычисления на видеокарте, без учёта латентности ввода/вывода, при сжатии одиночных изображений, без режима пачки и без стримов) на видеокартах NVIDIA GeForce GTX 1080 TI и Quadro P6000:

  • Full HD (2K, 1920 × 1080) ~ 35 ГБайт/с (0,17 мс)
  • 4K (3840 × 2160) ~ 46 ГБайт/с (0,51 мс)

Производительность декодирования JPEG на видеокартах NVIDIA GeForce GTX 1080 TI и Quadro P6000:

  • Full HD (2K, 1920 × 1080) ~ 5,3 ГБайт/сs (1,2 мс)
  • 4K (3840 × 2160) ~ 11,2 ГБайт/с (2,12 мс)

Эти результаты гораздо выше, чем бенчмарки самого быстрого на сегодня кодека джипега libjpeg-turbo для CPU. Даже если учесть время копирования данных на видеокарту и обратно, всё равно производительность кодека на видеокарте будет во много раз больше.

Этот кодек входит в состав библиотеки Fastvideo SDK для быстрой обработки изображений на видеокартах NVIDIA.

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

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