- Кодек JPEG на CUDA. Быстрое сжатие изображений на видекартах NVIDIA.
высокоскоростная съёмка скоростная съёмка Fastvideo Фаствидео
Fastvideo
Fastvideo
Фаствидео ГЛАВНАЯ
Fastvideo
  ВИДЕОКАМЕРЫ
видеокамеры
  ПРОГРАММЫ
софт
  РЕШЕНИЯ
решения
  ПРОЕКТЫ
проекты
  НОВОСТИ
новости
  ИНФО
информация
  ВАКАНСИИ
вакансии
  АДРЕС
адрес
  КАРТА САЙТА
карта сайта
  ENGLISH VERSION
fastvideo.ru - English version
 
  Поиск по сайту:
скоростные видеокамеры
скоростные камеры
фаствидео камеры

бенчмарки Fastvideo SDKКодек 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 (Fermi, Kepler, Maxwell, Pascal)
  • ОС Windows-7/8/10, Linux/CentOS

Нам удалось распараллелить все стадии алгоритма 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.

fast camera
скоростная камера скоростная съемка быстрые видеокамеры Fastvideo
скоростной софт Rambler's Top100 НПО Астек - официальный дилер "Фаствидео"
Москва, 129344, ул. Искры 17А, корп. 3, тел: +7 (495)-542-04-49
высокоскоростные камеры