Кодек JPEG на CUDA

Обновлено:

JPEG-кодер и декодер на видеокартах NVIDIA: до 5500 кадров Full HD в секунду на RTX 4090, полное соответствие стандарту Baseline JPEG. Для тех, кому нужно кодировать и декодировать потоки с камер или архивы изображений в реальном времени.

Кодек JPEG на CUDA — JPEG-кодер и декодер компании Фаствидео для видеокарт NVIDIA. Он полностью соответствует стандарту Baseline JPEG и на видеокарте GeForce RTX 4090 кодирует до 5500 кадров Full HD в секунду при коэффициенте сжатия около 10:1.

Зачем GPU-кодек, если есть libjpeg-turbo? CPU-кодеки упираются в потолок на многомегапиксельных потоках: даже многопоточный libjpeg не даёт тысяч кадров в секунду и занимает процессор, нужный под другие задачи. Наш JPEG работает целиком в памяти видеокарты, освобождает CPU и выдаёт на порядок большую скорость при том же качестве и полной совместимости со стандартом — файлы открываются любым просмотрщиком.

Мы сами написали эти алгоритмы

Кодеки и ISP-модули Fastvideo — это не обёртки над чужим кодом. Алгоритмы демозаики, шумоподавления, тон-маппинга и кодеков JPEG/JPEG2000 мы спроектировали — а многие и придумали — сами и сами реализовали на CUDA, на базе экспертизы в обработке изображений, которую нарабатываем с 2009 года. Поэтому вы получаете цельное, настроенное решение, а не набор GPU-примитивов; и если вашей задаче нужно что-то специфическое, мы можем изменить сам алгоритм, а не просто вызвать его.

Крупный веб-сервис обрабатывал на нашем SDK свыше 400 000 изображений JPEG в секунду.

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

cuda jpeg codec

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

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

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

Бенчмарки кодека JPEG на NVIDIA GeForce RTX 4090 (Windows-10, CUDA-12.6)

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

Ниже приведены бенчмарки производительности при кодировании и декодировании цветных изображений с разрешениями 2K и 4K, 24-бит (все вычисления на видеокарте, без учёта латентности ввода/вывода, при сжатии одиночных изображений, без режима пачки и без стримов, качество JPEG 90%, прореживание 4:2:0) на видеокарте NVIDIA GeForce RTX 4090:

Разрешение (24-бит, 4:2:0, качество 90%)КодированиеДекодирование
Full HD (2K, 1920×1080)~5500 фпс
4K (3840×2160)~3800 фпс~1350 фпс
8K (7680×4320)~1180 фпс~650 фпс

Как проверить эти цифры: они измерены на указанной видеокарте NVIDIA и воспроизводимы на вашем GPU — скачайте демо-программы и измерьте скорость на своих изображениях.

Скорость декодирования JPEG может быть увеличена в несколько раз при использовании рестарт-маркеров.

Чем кодек JPEG на видеокарте быстрее libjpeg-turbo?

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

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

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

Смежные продукты Фаствидео

Сначала — на ваших данных, бесплатно

До любых обязательств пришлите нам несколько своих снимков или опишите задачу. Мы прогоним их через софт, покажем результат и разберём его вместе на созвоне. Если решаете двигаться дальше — заказ простой: коммерческое предложение, ваш заказ (договор/PO), наш счёт; условия лицензии уже входят в софт.

Как мы работаем →

Фёдор Серженко, Fastvideo

Об авторе

Фёдор Серженко, к.ф.-м.н. — основатель и генеральный директор Fastvideo. Окончил МФТИ, кандидатскую защитил в 1993 году. С 2009 года руководит разработкой GPU-кодеков и ISP-модулей Fastvideo, включая Fastvideo SDK. LinkedIn.

Почему результатам можно верить

Fastvideo разрабатывает софт для видеокарт NVIDIA с 2009 года. Наши кодеки соответствуют стандартам, которые реализуют — JPEG (ITU-T T.81 / ISO IEC 10918) и JPEG2000 (ITU-T T.800 / ISO IEC 15444), — а часть инструментов открыта на GitHub, так что заявленное можно проверить в коде. Все опубликованные цифры воспроизводимы: см. методику тестирования и измерьте на своём GPU.

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

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