- Быстрое сжатие 8-битных изображений по алгоритму JPEG на CUDA. Самый быстрый кодек джипег. GPGPU кодер jpeg. Скоростное сжатие jpeg. Кодер джипег на CUDA. JPEG кодер на GPU. Super fast GPU encoder. JPEG, JPG, GPU, CUDA, КУДА. Сжатие jpg. Сжатие jpeg.
бенчмарки 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-7, 64-bit, CUDA 8.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 можно скачать здесь.

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

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