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

Алгоритм кодека JPEG известен с 80-х годов прошлого века. Этот метод кодирования и декодирования естественных (фотографических) изображений сочетает в себе относительно невысокую сложность и высокое качество при хорошей степени сжатия. Таким образом, можно сжать фотографию в 10-15 раз при минимальном уровне артефактов. Алгоритм JPEG в настоящее время крайне популярен и формат JPEG наиболее распространён в мире, так что имеется огромное количество задач по работе с такими изображениями.

cuda jpeg codec

Поэтому мы создали быстрый кодек JPEG в соотвествии со стандартом JPEG для монохромных и цветных изображений, а также оптимизировали кодер и декодер для получения высокой производительности. Идея как раз и состояла в том, чтобы кодировать или декодировать фотографические изображения с максимальной скоростью. Этот алгоритм обеспечивает не только минимальные искажения при значительном коэффициенте сжатия, но также он может быть эффективно распараллелен. Именно распараллеливание алгоритма JPEG на видеокартах NVIDIA дало возможность получить очень высокую скорость работы.

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

  • Кодек полностью соответствует стандарту Baseline JPEG
  • Компрессия и декомпрессия по алгоритму JPEG для 8/24-битных изображений
  • Входные данные: 8/24-битные изображения в RAM/HDD/RAID/SSD/GPU
  • Выходные данные: итоговые сжатые/несжатые изображения в RAM/HDD/RAID/SSD/GPU
  • Максимальный размер изображения 16000 × 16000 и более (опция)
  • Качество сжатия (параметр Q алгоритма JPEG) от 1 до 100
  • Прореживание цветоразностных компонент 4:4:4, 4:2:2, 4:2:0 (4:1:1)
  • Максимальное количество рестарт маркеров - 1 на MCU
  • Непрерывный режим работы (потоковое кодирование и декодирование)
  • Опция: поддержка кодирования 12-битных изображений (Extended JPEG)
  • Стандартная схема обработки данных в соответствии со стандартом 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 (Pascal, Volta, Turing, Ampere, Ada)
  • Возможность работы на NVIDIA Jetson Nano, TX2, TX2i, NX/AGX Xavier, Orin
  • ОС Windows-10, Linux Ubuntu, L4T

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

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

На этой видеокарте нам требуется всего лишь 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 ГБайт/сек (1,2 мс)
  • 4K (3840 × 2160) ~ 11,2 ГБайт/сек (2,12 мс)

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

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

Этот кодек JPEG входит в состав библиотеки Фаствидео СДК для быстрой обработки изображений на видеокартах NVIDIA.

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

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