Быстрый декодер изображений JPEG на CUDAМы разработали систему быстрого сжатия серий монохромных изображений в формат JPEG на видеокарте NVIDIA для систем скоростной съёмки. Таким образом мы смогли в онлайне сжимать очень большие потоки данных и записывать их непрерывно на жёсткий диск компьютера. А обратную операцию, т.е. декодирование, мы ранее делали на CPU в оффлайне, потому что для систем скоростной съёмки это не требовалось делать настолько же быстро. Тем не менее, такая задача существовала, и мы смогли её решить. Декодирование данных формата JPEG является более трудоёмкой задачей по сравнению с кодированием, особенно для реализации алгоритма на видеокарте. Декодирование сжатых изображений на видеокарте имеет смысл только при условии распараллеливания задачи. Если алгоритм декодирования последовательный, то использовать видеокарту не имеет смысла, поскольку в этом случае CPU будет во много раз быстрее, чем GPU. Для реализации возможности распараллеливания декодирования нужно ещё на этапе кодирования ставить специальные маркеры перед группами блоков 8х8. Стандарт JPEG предусматривает такую возможность и для этой цели выделены двухбайтные маркеры RSTm. Если поставить, например, тысячу таких маркеров при кодировании, то в этом случае при декодировании можно будет разбить задачу на тысячу подзадач и это значительно ускорит первую стадию декодирования. К сожалению, немногие кодеры JPEG ставят такие маркеры. Это делают кодер JPEG из IPP 7.0 и наш кодер JPEG на CUDA. Общая схема работы декодера JPEG на CUDA
Конфигурация компьютера и ОС
Оценка латентности отдельных стадий обработки данных при декодировании JPEGДля скорости декомпрессии 8-битного изображения с разрешением 7216 х 5408 (которое было сжато по алгоритму Baseline JPEG с потерями, коэффициент сжатия = 13, данные находятся в оперативной памяти компьютера, видеокарта модели GeForce GTX 580, измерение времени проводится встроенным профайлером CUDA_PROFILE_LOG_VERSION 2.0) были получены следующие результаты для времени выполнения отдельных стадий обработки данных:
Основной результат: 11200 микросекунд необходимо видеокарте GeForce GTX 580 для декомпрессии 8-битного изображения с разрешением 7216 х 5408 (сжатого ранее по алгоритму Baseline JPEG в 13 раз) с учётом загрузки и выгрузки данных. Таким образом, получена производительность декодирования порядка 3 ГБайт/с на видеокарте NVIDIA для изображений в формате JPEG. Результаты тестирования алгоритма декодирования JPEGМы реализовали программное декодирование изображений в формате JPEG на графических картах NVIDIA с помощью технологии CUDA. В качестве источника входных данных использовались файлы формата JPEG. Были получены следующие результаты для средней пропускной способности используемого алгоритма (указаны данные для декодированного потока) на разных видеокартах, время загрузки изображений и их выгрузки после декодирования включено в представленные результаты:
Таким образом, показана принципиальная возможность быстрого декодирования изображений, причём для довольно широкого класса графических карт, в том числе бюджетных и мобильных. Такое решение вместе с кодером JPEG даст возможность выполнять операции кодирования и декодирования на видеокарте. Приложения для быстрого декодирования данных в формате JPEGДанное решение может использоваться не только в скоростной видеосъёмке. Существует немало других задач, связанных с необходимостью быстрого декодирования больших объёмов данных:
В настоящее время реализованы алгоритмы сжатия с потерями и декодирования только для монохомных изображений. Если к нему добавить возможность восстановления цвета и сжатия цветных изображений, то количество возможных приложений значительно увеличится. Сравнение с самыми быстрыми аппаратными декодерами на FPGAИнтересно отметить, что производительность системы декодирования JPEG на базе видеокарты GeForce GTX 580 оставила позади лучшие на сегодняшний день системы аппаратного декодирования JPEG, построенные на ПЛИС (FPGA). Одни из самых быстрых систем на ПЛИС предлагают следующие компании:
Эти высокопроизводительные решения написаны на Verilog/VHDL и являются оптимальными для компактных (встраиваемых) систем с минимальными требованиями по питанию и габаритам. Сравнивая наше решение с аппаратными декодерами на ПЛИС, стоит отметить, что кроме более высокой производительности полученного нами решения, по сравнению с Verilog/VHDL, код на Си для CUDA намного более понятный и приспособленный для модификации и создания на его базе новых, более сложных систем обработки и сжатия изображений. Как достичь лучших результатовСуществует ряд методов, с помощью которых мы расчитываем в дальнейшем получить увеличение производительности подобных систем:
|