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