- Декодирование изображений по алгоритму JPEG на CUDA. Быстрая декомпрессия изображений в формате JPG. Декодер джипег на CUDA. GPU decoder. CUDA JPEG decoder, GPGPU, CUDA.
бенчмарки Fastvideo SDK

Быстрый декодер изображений JPEG на CUDA

Мы разработали систему быстрого сжатия серий монохромных изображений в формат JPEG на видеокарте NVIDIA для систем скоростной съёмки. Таким образом мы смогли в онлайне сжимать очень большие потоки данных и записывать их непрерывно на жёсткий диск компьютера. А обратную операцию, т.е. декодирование, мы ранее делали на CPU в оффлайне, потому что для систем скоростной съёмки это не требовалось делать настолько же быстро. Тем не менее, такая задача существовала, и мы смогли её решить. Декодирование данных формата JPEG является более трудоёмкой задачей по сравнению с кодированием, особенно для реализации алгоритма на видеокарте.

Декодирование сжатых изображений на видеокарте имеет смысл только при условии распараллеливания задачи. Если алгоритм декодирования последовательный, то использовать видеокарту не имеет смысла, поскольку в этом случае CPU будет во много раз быстрее, чем GPU. Для реализации возможности распараллеливания декодирования нужно ещё на этапе кодирования ставить специальные маркеры перед группами блоков 8х8. Стандарт JPEG предусматривает такую возможность и для этой цели выделены двухбайтные маркеры RSTm. Если поставить, например, тысячу таких маркеров при кодировании, то в этом случае при декодировании можно будет разбить задачу на тысячу подзадач и это значительно ускорит первую стадию декодирования. К сожалению, немногие кодеры JPEG ставят такие маркеры. Это делают кодер JPEG из IPP 7.0 и наш кодер JPEG на CUDA.

декодер JPEG изображений на CUDAОбщая схема работы декодера JPEG на CUDA

  • Загрузка приложения, инициализация и нумерация устройств, проверка их возможностей.
  • Чтение файла JPEG с жёсткого диска или из оперативной памяти.
  • Выделение памяти на видеокарте, создание групп потоков, синхронизация с пользовательским приложением на CPU.
  • Загрузка (копирование) закодированного массива данных изображения в память видеокарты.
  • Численные расчёты: поиск границ закодированных групп блоков 8х8 с помощью маркеров RSTm, декодирование по Хаффману и определение границ блоков 8х8, обратное RLE, обратное DPCM, обратный Zig-Zag, формирование блоков 8х8, обратное Quantization, IDCT и Level Shift для каждого блока 8х8. При декодировании используются таблицы Хаффмана и квантования, которые использовались при кодировании.
  • Упорядочивание декодированных блоков 8х8, формирование итогового массива байт.
  • Добавление заголовка для BMP-файла (опция) или копирование выходного массива декодированных данных в оперативную память компьютера.

Конфигурация компьютера и ОС

  • Настольный компьютер ASUS P6T Deluxe V2 LGA1366, X58, Core i7 920, 2,67 ГГц, DDR-III 6 ГБайт
  • Видеокарта для вычислений: GeForce GTX 580 (CC=2.0, 512 ядер)
  • Ноутбук ASUS N55S, Core i5 2430M, DDR III 6 ГБайт, видеокарта GeForce GT 555M (СС = 2.1, 144 ядра)
  • Операционная система Windows-7, 64-bit, CUDA 4.1, драйвер 296.10

Оценка латентности отдельных стадий обработки данных при декодировании JPEG

Для скорости декомпрессии 8-битного изображения с разрешением 7216 х 5408 (которое было сжато по алгоритму Baseline JPEG с потерями, коэффициент сжатия = 13, данные находятся в оперативной памяти компьютера, видеокарта модели GeForce GTX 580, измерение времени проводится встроенным профайлером CUDA_PROFILE_LOG_VERSION 2.0) были получены следующие результаты для времени выполнения отдельных стадий обработки данных:

  • HostIO (загрузка данных в оперативную память компьютера) - этой задержки нет, поскольку данные уже лежат в оперативной памяти
  • Host-to-Device (время копирования данных в память GPU) - 550 мкс
  • iHuffman - 1650 мкс
  • iRLE - 680 мкс
  • iLevel shift, iDCT, iQuantization, iZig-Zag - 1440 мкс
  • Device-to-Host (копирование выходной строки из видеокарты в оперативную память компьютера) - 6090 мкс
  • Разное - 790 мкс
  • ИТОГО: 11200 мкс

Основной результат: 11200 микросекунд необходимо видеокарте GeForce GTX 580 для декомпрессии 8-битного изображения с разрешением 7216 х 5408 (сжатого ранее по алгоритму Baseline JPEG в 13 раз) с учётом загрузки и выгрузки данных. Таким образом, получена производительность декодирования порядка 3 ГБайт/с на видеокарте NVIDIA для изображений в формате JPEG.

Результаты тестирования алгоритма декодирования JPEG

Мы реализовали программное декодирование изображений в формате JPEG на графических картах NVIDIA с помощью технологии CUDA. В качестве источника входных данных использовались файлы формата JPEG. Были получены следующие результаты для средней пропускной способности используемого алгоритма (указаны данные для декодированного потока) на разных видеокартах, время загрузки изображений и их выгрузки после декодирования включено в представленные результаты:

  • GeForce GT 555M (144 ядра, мобильный вариант) - 1150 МБайт в секунду
  • GeForce GTX 580 (512 ядер) - 3000 МБайт в секунду

Таким образом, показана принципиальная возможность быстрого декодирования изображений, причём для довольно широкого класса графических карт, в том числе бюджетных и мобильных. Такое решение вместе с кодером JPEG даст возможность выполнять операции кодирования и декодирования на видеокарте.

Приложения для быстрого декодирования данных в формате JPEG

Данное решение может использоваться не только в скоростной видеосъёмке. Существует немало других задач, связанных с необходимостью быстрого декодирования больших объёмов данных:

  • Системы получения и хранения медицинских изображений
  • Охранные системы
  • Промышленные системы
  • Научные исследования

В настоящее время реализованы алгоритмы сжатия с потерями и декодирования только для монохомных изображений. Если к нему добавить возможность восстановления цвета и сжатия цветных изображений, то количество возможных приложений значительно увеличится.

Сравнение с самыми быстрыми аппаратными декодерами на FPGA

Интересно отметить, что производительность системы декодирования JPEG на базе видеокарты GeForce GTX 580 оставила позади лучшие на сегодняшний день системы аппаратного декодирования JPEG, построенные на ПЛИС (FPGA). Одни из самых быстрых систем на ПЛИС предлагают следующие компании:

  • Visengi JPEG Decoder (JPEG / MJPEG Hardware Decompressor / Decoder) - функция аппаратного декодирования джипег для FPGA Virtex-6, производительность до 133 МБайт/с.
  • Cast Inc. (JPEG-D Baseline JPEG Compression Decoder Core) - функция аппаратного декодирования джипег для FPGA, производительность до 210 МБайт/с для Xilinx Virtex-6, до 140 МБайт/с для Altera FPGA Stratix III.

Эти высокопроизводительные решения написаны на Verilog/VHDL и являются оптимальными для компактных (встраиваемых) систем с минимальными требованиями по питанию и габаритам. Сравнивая наше решение с аппаратными декодерами на ПЛИС, стоит отметить, что кроме более высокой производительности полученного нами решения, по сравнению с Verilog/VHDL, код на Си для CUDA намного более понятный и приспособленный для модификации и создания на его базе новых, более сложных систем обработки и сжатия изображений.

Как достичь лучших результатов

Существует ряд методов, с помощью которых мы расчитываем в дальнейшем получить увеличение производительности подобных систем:

  • Оптимизация алгоритма декодирования JPEG, схемы его распараллеливания и реализации.
  • Использование новых решений NVIDIA в последних моделях видеокарт: возможности архитектуры Fermi и Kepler.
  • Использование более мощных видеокарт GeForce, Quadro и Tesla.
  • Распараллеливание алгоритма между разными видеокартами, увеличение количества видеокарт для организации параллельных вычислений.

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

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