Кодек JPEG на CUDAАлгоритм кодека JPEG известен с 80-х годов прошлого века. Этот метод кодирования и декодирования естественных (фотографических) изображений сочетает в себе относительно невысокую сложность и высокое качество при хорошей степени сжатия. Таким образом, можно сжать фотографию в 10-15 раз при минимальном уровне артефактов. Алгоритм JPEG в настоящее время крайне популярен и формат JPEG наиболее распространён в мире, так что имеется огромное количество задач по работе с такими изображениями. Поэтому мы создали быстрый кодек JPEG в соотвествии со стандартом JPEG для монохромных и цветных изображений, а также оптимизировали кодер и декодер для получения высокой производительности. Идея как раз и состояла в том, чтобы кодировать или декодировать фотографические изображения с максимальной скоростью. Этот алгоритм обеспечивает не только минимальные искажения при значительном коэффициенте сжатия, но также он может быть эффективно распараллелен. Именно распараллеливание алгоритма JPEG на видеокартах NVIDIA дало возможность получить очень высокую скорость работы. Возможности кодека JPEG для CUDA
Нам удалось распараллелить все стадии алгоритма 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:
Производительность декодирования JPEG на видеокартах NVIDIA GeForce GTX 1080 TI и Quadro P6000:
Эти результаты гораздо лучше, чем бенчмарки самого быстрого на сегодня кодека джипега libjpeg-turbo для CPU. Даже если учесть время копирования данных на видеокарту и обратно, всё равно производительность кодека JPEG на видеокарте будет во много раз больше. Тут очень важным моментом является не только скорость кодирования или декодирования, но и латентность такого решения. Латентность кодека JPEG на видеокарте более чем на порядок лучше, чем у кодека либджипег-турбо. Таким образом, у кодека JPEG на видеокарте NVIDIA результаты значительно лучше как по скорости, так и по латентности. Этот кодек JPEG входит в состав библиотеки Фаствидео СДК для быстрой обработки изображений на видеокартах NVIDIA. |