Методика тестирования кодеков JPEG и JPEG2000 на CPU и GPU

Редакция 1 · Обновлено:

Методика тестирования кодеков JPEG и JPEG2000: один и тот же кадр сжимается кодеком на процессоре и кодеком на видеокарте

По этой методике Fastvideo измеряет скорость кодеков JPEG и JPEG2000 на процессорах и на видеокартах NVIDIA, от настольной RTX до модулей Jetson. Сделана она в первую очередь для кодеков на видеокарте, но процессорные кодеки меряются по тем же правилам. Кодеки сравниваются при одинаковом размере сжатого файла, в каждом режиме измерений с явными границами отсчёта, в лучшей точке по числу потоков и размеру пачки, найденной перебором. Каждая точка измеряется трижды, качество восстановленного кадра проверяется при каждом запуске. Статьи с результатами ссылаются на эту страницу и на номер редакции, а отличия от методики называют одной строкой.

Главные правила методики. В левом столбце правило, в правом раздел, где оно разобрано.
ПравилоРаздел
Кодеки сравниваются при одинаковом размере сжатого файла, а не при одинаковом номере качествараздел 4
Все параметры сжатия задаются явно у обеих сторон, значения по умолчанию не используютсяраздел 3
Скорость публикуется вместе с режимом измерений: одиночные кадры или лучшее сочетание потоков и пачкираздел 6
Границы отсчёта у всех сторон одинаковые, работа кодека на процессоре входит в отсчётраздел 7
Лучшая точка ищется перебором, публикуется вся сеткараздел 8
Три повтора, медиана; при разбросе больше 7 % ещё два повторараздел 9
При каждом запуске кадр кодируется, декодируется и сравнивается с исходнымраздел 5
Программа измерений сверяется со штатной программой производителя кодекараздел 10
Энергия считается в джоулях на кадр и относится к тому устройству, у которого измеренараздел 11
Рядом с каждым числом стоят стенд, кадр, режим, дата и редакция методикираздел 13
У JPEG таблицы квантования сверяются по файлам, аппаратный декодер проверяется на каждой видеокартераздел 14

1. Для какой задачи написана эта методика?

Для одной задачи: сжатие и распаковка потока крупных кадров одного вида, от 2K и больше, которые целиком помещаются в память. Так работает конвейер камеры, запись видео покадровым кодеком, выдача кадров с сервера и пакетная перегонка однотипного материала. Вопрос, на который отвечают измерения, звучит так: сколько кадров в секунду даёт кодек на этой видеокарте при заданном размере сжатого файла и сколько времени уходит на один кадр.

У кодирования есть и другие задачи, и мерить их надо по-другому. Для очень больших изображений, которые не помещаются в память видеокарты целиком и обрабатываются по частям, главной становится организация данных, а не скорость кодека на кадре. Для обработки больших архивов в измерение входят диск, чтение файлов и разные по содержимому кадры. Для таких задач будут написаны отдельные методики, когда появятся сами задачи. Результаты, полученные по этой методике, на них не переносятся.

Отдельно о задаче, которую часто путают с этой: загрузка изображений для обучения нейросетей. Там декодируют сотни тысяч небольших JPEG, обычно по несколько сотен точек по стороне, разного размера и содержимого, пачками из сотен файлов, и главное число — сколько изображений в секунду уходит в обучение. Время одного кадра и качество сжатия там не важны, а размер пачки подбирают под объём данных, а не под поток с камеры. Под такую задачу устроены очень большие пачки в библиотеках декодирования и специальные библиотеки загрузки данных, например NVIDIA DALI. Это не наша задача. Режимы, выгодные только для неё, мы не подбираем и в сравнение не включаем, а числа, полученные на ней, к нашим задачам не переносятся.

Методика относится к любому кодеку JPEG или JPEG2000 на процессоре или на видеокарте NVIDIA: к кодекам из Fastvideo SDK, к библиотекам NVIDIA nvJPEG и nvJPEG2000, к другим реализациям на CUDA, к процессорным кодекам, например OpenJPEG. Процессорный кодек меряется по тем же правилам и в сравнении с видеокартой показывает, где процессора достаточно, а где нет. Видеокарта может быть любой: настольной, серверной или встраиваемым модулем Jetson. Стенд с RTX 4090 в примерах ниже служит примером, а не условием методики; что меняется от платформы, собрано в разделе 12.

2. На каких изображениях тестируются кодеки?

На открытых фотографических кадрах в несжатом формате PPM, которые можно скачать и проверить у себя. Основной набор — два кадра, 8 бит на канал, три канала:

Основной набор кадров. Размер — объём несжатого файла.
ФайлРазрешениеРазмер, МБ
2k_wild.ppm1920 × 10805,93
4k_wild.ppm3840 × 216023,73

Формат PPM выбран потому, что это несжатый файл с минимальным заголовком: все кодеки получают на вход одни и те же байты, и чтение исходника ни на что не влияет. Степень сжатия при заданном качестве определяется содержимым кадра, поэтому кадры фотографические, с гладкими областями и мелкой фактурой. Дальше в набор войдут кадры 24 и 65 мегапикселей; каждая статья называет, на каких кадрах она мерила.

Этот набор — наш стандартный вариант, и он намеренно самый простой: два кадра, одни и те же параметры сжатия, одно и то же содержимое от прогона к прогону. Именно поэтому он хорошо подходит для сравнения кодеков между собой и для измерения энергии на кадр, где любая лишняя переменная мешает. Но по этой же методике можно тестировать любые изображения и с любыми параметрами сжатия. Главное правило другое: тест должен соответствовать решаемой задаче. Методика задаёт порядок измерения, а кадры, разрешение, разрядность, качество и режим выбираются под задачу, и статья называет их в таблице условий (раздел 13).

Измерение устроено как «один и тот же кадр N раз», а не «N разных кадров». Это правильно для измерения скорости кодека, но кадр 2K или 4K целиком помещается в кэш процессора, и данные после первого повтора берутся из кэша. Обработка папки с разными файлами устроена иначе, и это одна из задач, для которых нужна своя методика (раздел 1).

Разрядность выше 8 бит, монохромные кадры и кадры с мозаикой Bayer с камеры, кадры с разбиением на тайлы измеряются отдельными сериями со своим набором данных: поведение кодеков на них другое. Кадры разного размера для такой серии вырезаются из одного снимка камеры, а не уменьшаются: уменьшение усредняет соседние пикселы, ослабляет шум и мелкие детали, и такой кадр сжимается легче настоящего.

3. Как задаются параметры сжатия?

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

Для JPEG2000 в опубликованных сравнениях набор такой:

Параметры JPEG2000, общие для всех сравниваемых кодеков.
ПараметрЗначениеПочему так
Формат файлаJP2контейнер, который пишут все стороны
ВейвлетCDF 9/7 с потерями, CDF 5/3 без потерьстандартная пара
Размер кодоблока32 × 32nvJPEG2000 не поддерживает 16 × 16; из 32 и 64 взят размер с большим распараллеливанием
Уровни разрешения6одинаковая глубина разложения
Слои качества1у nvJPEG2000 другого значения нет
Порядок прогрессииLRCPкодер Fastvideo выдаёт только LRCP
Цветовое преобразованиевключенообычный режим для цветных кадров
Субдискретизация цветности4:4:4не добавляет ещё одну переменную; 4:2:2 и 4:2:0 кодеки тоже поддерживают
Тайлывыключенытайлы — отдельная серия
Маркеры SOP и EPHвыключеныу nvJPEG2000 их включить нельзя

Для JPEG набор такой:

Параметры JPEG, общие для всех сравниваемых кодеков.
ПараметрЗначениеПочему так
Режимbaseline, последовательныйего понимает любой декодер; прогрессивный JPEG — отдельная серия
Разрядность8 бит на канал12 бит есть не у всех кодеков
Сжатие без потерьнету JPEG его нет: он всегда сжимает с потерями. Алгоритм, который называют «JPEG без потерь», устроен совсем иначе, и эта методика его не рассматривает
Прореживание цветности4:4:4, вторым прогоном 4:2:0кодек JPEG из Fastvideo SDK поддерживает 4:4:4, 4:2:2 и 4:2:0; измеряются не все варианты, но любой из них можно измерить по тем же правилам. 4:2:0 уменьшает объём данных вдвое и меняет соотношение стадий, поэтому идёт отдельными строками
Таблицы Хаффманастандартные, без оптимизации под кадроптимизация таблиц требует второго прохода по данным и меняет и размер файла, и время
Качествоодинаковое значение у кодека, задающего размер; у остальных подобранное под тот же размерраздел 4
Интервал перезапуска (маркеры RST)читается из каждого сжатого файла и публикуетсяот него зависит, сколько работы декодер может делать параллельно

Что у JPEG проверяется сверх этого, собрано в разделе 14.

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

4. Почему кодеки сравниваются при одинаковом размере файла?

Потому что шкалы качества у кодеков разные, и одно и то же число в параметре качества даёт разный размер файла. А от размера сжатого файла прямо зависит объём работы: кодек, который сжал сильнее, работает меньше и выглядит быстрее. Размер в байтах удобен ещё и тем, что определён однозначно, в отличие от коэффициента сжатия и оценки качества.

Процедура такая. Один кодек кодирует кадр при заданном качестве, и размер его файла становится целью. Остальные подбирают свою настройку делением отрезка пополам: кодируют, смотрят на размер, сдвигают границу и повторяют, пока не попадут в цель точнее 0,1 %. У кодека JPEG2000 Fastvideo настройка — качество q, у nvJPEG2000 — Q-фактор, у OpenJPEG — коэффициент сжатия. Подбор делается для каждого кадра заново: соответствие шкал зависит от содержимого кадра, и найденное на одном кадре значение годится на другом только как первое приближение.

У JPEG качество не сжимает кадр само по себе: кодек строит по нему таблицы квантования и записывает их прямо в файл. Поэтому шкалы сначала сверяются по таблицам: оба кодека кодируют кадр с одним и тем же значением качества, и таблицы из двух файлов сравниваются число за числом. Совпали таблицы, значит обе шкалы одинаково переводят качество в таблицы. Как таблица применяется, то есть как округляется частное и с какой точностью считается дискретное косинусное преобразование, в файле не записано, и это видно только по размеру файла и по PSNR. Если таблицы одинаковые, а размер или PSNR разные, разница в применении, а не в шкале.

Качество у JPEG обычно задаётся целым числом, поэтому попасть в размер точнее 0,1 % удаётся не всегда. Тогда берётся ближайшее значение, а отклонение размера публикуется рядом с результатом. Подбор делается двумя независимыми поисками с разных начальных отрезков: совпали оба, значит найденное значение говорит о шкалах, а не о самом поиске. Так же проверялась шкала JPEG2000, на отрезках от 1 до 100 и от 50 до 99.

В режиме без потерь подбирать нечего: параметра качества там нет, и кодеки обязаны выдать полностью восстановимый файл. Это относится к JPEG2000: у обычного JPEG режима без потерь нет. Совпадение размеров в этом режиме само служит проверкой, что кодеки делают одну работу (раздел 5).

Отсюда следствие для чтения чужих сравнений: «сжатие 20:1» без названия кадра ничего не значит. Одно и то же значение параметра на другом кадре даст другой коэффициент сжатия.

5. Как проверяется, что кодеки сделали одну и ту же работу?

Полным циклом при каждом запуске: кадр кодируется, декодируется и сравнивается с исходным. Декодер, который делает меньше работы, чем должен, выглядит быстрее, поэтому скорость без проверки результата ничего не доказывает.

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

Демонстрационные сборки кодеков наносят на кадр водяной знак, и прямое сравнение с исходником измеряло бы знак, а не кодек. Поэтому программа сначала проверяет, есть ли знак. Если он есть, эталоном для PSNR берётся кадр, вернувшийся через полный цикл без потерь на той же сборке: знак наносится до кодирования, а режим без потерь сохраняет всё побитно. Условие проверяется отдельно: два независимых цикла без потерь обязаны совпасть байт в байт. Так проверка качества воспроизводится и на демонстрационной версии.

6. В каких режимах измеряется скорость?

В двух основных режимах, и каждое число публикуется вместе со своим режимом. Скорость в кадрах в секунду без режима не имеет смысла: на одной видеокарте один кодек даёт разные числа, и все они верные. У кодера JPEG2000 Fastvideo на кадре 2K с потерями одиночные кадры дают 381 кадр в секунду, а лучшее сочетание потоков и пачки — 1914.

Режимы измерений. Первый отвечает на вопрос о времени одного кадра, остальные — о скорости обработки потока.
РежимКак устроенЧто показывает
Одиночные кадрыследующий кадр начинается после того, как предыдущий полностью готов; один потоклатентность, время одного кадра
Пачканесколько кадров уходят в кодек одним вызовомпромежуточный режим, отдельно не публикуется
Несколько потокову каждого потока своё состояние кодека и своя очередь заданий видеокарты (CUDA stream)пропускную способность
Потоки и пачканесколько потоков, в каждом несколько кадров в работе одновременнопропускную способность, самый быстрый режим

Латентность и пропускная способность — разные величины, а не разная точность для одной задачи. В многопоточном режиме время каждого отдельного кадра больше, чем в одиночном, и это плата за общую скорость. Для задачи с жёстким сроком на кадр главная величина — латентность, для потока с камеры или пакетной обработки — пропускная способность.

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

Если у библиотеки есть собственная пачка или аппаратный блок, они измеряются как отдельные способы запуска, рядом с сеткой потоков. Так у nvJPEG: декодирование пачкой (nvjpegDecodeBatched) меряется на CUDA и, если он есть, на аппаратном декодере. Размер пачки берётся того же порядка, что число кадров в работе в сетке потоков (раздел 8), то есть единицы и десятки крупных кадров, как в потоке от камер. Пачки из сотен кадров нужны для загрузки данных при обучении нейросетей и в сравнение не входят (раздел 1). В сравнение идёт лучший из способов, которые даёт сама библиотека в этих пределах. Кодирования пачкой у nvJPEG нет, там применяется та же схема, что у nvJPEG2000.

Несколько видеокарт в одной машине эта методика не рассматривает: речь о производительности одной карты.

7. Что входит в измеряемое время?

Вся работа кодека, включая ту её часть, которая идёт на процессоре, и не входит работа с диском. Где именно начинается и кончается отсчёт, зависит от режима, и это надо называть прямо.

Границы отсчёта в двух режимах. «Оперативная память» — память компьютера, «память видеокарты» — память на самой карте.
ЧтоОдиночные кадрыПотоки и пачка
Где начинается отсчёт у кодераисходный кадр уже в памяти видеокартыисходный кадр в оперативной памяти
Где кончается отсчёт у кодерасжатый файл в оперативной памятисжатый файл в оперативной памяти
Где начинается отсчёт у декодерасжатый файл в оперативной памятисжатый файл в оперативной памяти
Где кончается отсчёт у декодеракадр в памяти видеокартыкадр в оперативной памяти
Копирование кадра через шинуне входитвходит
Работа кодека на процессоре (Tier-2 у JPEG2000; разбор файла и декодирование Хаффмана у JPEG, если они идут на процессоре)входитвходит
Чтение и запись файлов на дискене входитне входит

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

Работа на процессоре входит в отсчёт у всех сторон. У JPEG2000 это свойство алгоритма: разбор и сборка сжатого потока (Tier-2) плохо распараллеливаются; у кодека Fastvideo они идут на процессоре и при кодировании, и при декодировании, у декодера nvJPEG2000 тоже, это сказано в его документации. Вынести эту часть за скобки у одного кодека и оставить у другого значило бы сравнивать разные вещи.

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

8. Как находится лучшее сочетание потоков и пачки?

Перебором по сетке, а не назначением. Сетка записывается как «число потоков × размер пачки»; в опубликованных сравнениях на RTX 4090 это 8×1, 8×2, 16×2, 8×4, 32×1 и 32×2. Точки, где потоков столько же, сколько логических ядер процессора, отвечают на прямой вопрос: не хватит ли библиотеке просто большего числа потоков.

Лучшее сочетание зависит от кодека, от размера кадра и от режима сжатия, поэтому публикуется вся сетка, а не только победившая точка: воспроизводится процедура, а не итоговое число. На кадре 2K у кодера JPEG2000 Fastvideo пачка помогает, на кадре 4K не даёт ничего, потому что крупный кадр и без неё загружает видеокарту.

Перед каждой точкой проверяется, поместится ли она в память. Каждый кадр, находящийся в работе, занимает место в памяти видеокарты, и точка, которой памяти не хватит, не запускается. В таблице на её месте стоит прочерк, и это результат, а не пропуск: например, 32 потока по 2 кадра на 4K потребовали бы кодеру около 37 ГБ при 22 ГБ свободной памяти на RTX 4090.

Если две точки или два кодека отличаются меньше, чем расходятся повторы одной точки, результат называется словом «вровень», и победитель не назначается.

9. Сколько раз повторяется измерение?

Трижды, в таблицы идёт медиана. Точка, у которой повторы разошлись больше чем на 7 %, домеряется ещё двумя запусками, и медиана берётся по всем пяти. Если разброс остаётся большим и после этого, точка называется в статье поимённо, вместе с разбросом.

Числа публикуются с двумя-тремя значащими разрядами: при разбросе повторов в проценты четвёртый разряд не измерен. Отношения «во сколько раз» считаются по напечатанным числам, чтобы читатель, поделив одно на другое, получил то же, что стоит в тексте.

10. Как проверяется сама программа измерений?

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

  1. Одна и та же работа. Штатная программа и программа измерений Fastvideo кодируют кадр с одинаковыми параметрами, и сжатые файлы должны совпасть по размеру до байта.
  2. Одна и та же подача кадров. Обе программы подают кадры по одному. Результаты должны сойтись в пределах нескольких процентов; для nvJPEG2000 на RTX 4090 расхождение составило 1–3 %.
  3. Границы отсчёта по исходникам. Что входит в отсчёт штатной программы, проверяется по её коду, а не по описанию. В примере декодирования nvJPEG2000 время разбора потока переводится в целые секунды и поэтому всегда равно нулю; без этой поправки его числа и числа нашей программы ставить рядом нельзя.
  4. Только потом та же библиотека запускается в многопоточном режиме, и прирост относится к схеме запуска, а не к разнице программ.

У JPEG штатные программы NVIDIA — кодер nvJPEG_encoder и декодер nvJPEG из набора cuda-samples и декодер nvjpegDecoder из набора CUDALibrarySamples. Первые два есть в cuda-samples до версии v13.2 и удалены в v13.3, поэтому берутся из v13.2. Декодированный кадр они оставляют в памяти видеокарты, и сверка с ними идёт в их границе отсчёта, как в режиме одиночных кадров.

Разбор времени кадра по стадиям делается двумя способами: изнутри, по выводу самого кодека в режиме одиночных кадров, и снаружи, профилировщиком NVIDIA Nsight Systems. Разбор изнутри включает разовые расходы и читается как порядок величины. Профилировщик показывает время работы вычислительных ядер видеокарты, простои между ними и загрузку шины у обоих кодеков одинаково, но сам замедляет тест, поэтому скорость под ним не публикуется.

11. Как измеряются энергия, загрузка процессора и память?

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

Чем измеряется каждая величина. Способы для Jetson — в разделе 12.
ВеличинаЧем измеряетсяЧто в неё входит
Энергия видеокартынакопительный счётчик карты через NVML (nvmlDeviceGetTotalEnergyConsumption); для сверки опрос nvidia-smi 10 раз в секундутолько видеокарта
Энергия процессора AMDAMD uProf, мощность всего процессора с шагом 50 мс, интегрирование по настоящим меткам временивесь процессор, включая кристалл ввода-вывода и контроллер памяти
Энергия процессора Intelсчётчик RAPL, тот же порядок измерениявесь процессор
Загрузка процессорапроцессорное время процесса кодека, пользовательское и системное, делённое на время его работытолько сам кодек, в логических ядрах
Память видеокартынаибольшее занятое место за запуск минус занятое до неговся карта, вместе с контекстом CUDA

Разностный способ. Счётчик читается до и после запуска, поэтому в показание попадают постоянные расходы: запуск процесса, подготовка буферов, выход карты на режим. Чтобы их убрать, каждая точка измеряется дважды, на N кадрах и на 2N, и энергия кадра берётся как разность, делённая на N. Если программа читает счётчик сама, внутри цикла и после прогрева, разность не нужна; статья называет, каким способом получены её числа.

Простой измеряется отдельно, после того как мощность перестала меняться. Для процессора и для модуля Jetson в таблице стоят оба числа: полное и за вычетом простоя. Полное нужно для расчёта питания системы, за вычетом простоя — для сравнения кодеков между собой.

Скорость и энергия снимаются разными прогонами: профилировщик энергии процессора работает на том же процессоре, который измеряет. Что он заметной доли процессора не занимает, проверяется отдельно, на одинаковой счётной нагрузке с ним и без него.

Загрузка процессора показывается в логических ядрах, а не в процентах: 7 логических ядер из 32 читаются сразу, а «22 %» требуют пересчёта. В ватты она не переводится, потому что одно ядро на разной работе потребляет разную мощность. Там, где энергия процессора не измерена, статья говорит, в чью пользу это сдвигает вывод.

Память видеокарты на Windows по процессам не отдаётся, поэтому числа верны для всей карты и при условии, что на ней не работало ничего постороннего.

12. Что меняется на Jetson и на других видеокартах?

Правила сравнения остаются теми же, меняются способы измерения. Всё, что зависит от платформы, собрано здесь по пунктам.

Чем отличаются измерения на настольной видеокарте и на модуле Jetson.
ЧтоНастольная или серверная видеокартаJetson
Энергиясчётчик NVML, только видеокартадатчики модуля (INA3221 на Orin), весь модуль: процессор, графическая часть и память вместе
Режим питанияпредел мощности карты, записывается в условияnvpmodel и jetson_clocks, названы в условиях
Памятьсвоя память карты, копирование через шину PCIeобщая память модуля, импорт кадра в буфер без шины
Загрузкапрофилировщик и счётчики NVMLtegrastats и проба нагрузкой
Кодеки NVIDIAпроверяются на каждой картепроверяются на каждом модуле

На серверных и профессиональных картах добавляются свои условия: режим работы драйвера, заданный предел мощности, соседние задачи на той же карте. Они записываются в условия так же, как режим питания на Jetson.

13. Какие условия публикуются рядом с результатом?

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

Обязательные условия измерений. Справа пример — стенд сравнения кодеков JPEG2000 от 31 августа 2026 года.
УсловиеПример
Редакция методикиредакция 1
Видеокарта и её памятьNVIDIA GeForce RTX 4090, 24 ГБ
Предел мощности или режим питания450 Вт
Драйвер видеокарты610.88
ПроцессорAMD Ryzen 9 7950X, 16 ядер, 32 логических ядра
Оперативная память128 ГБ
Операционная системаWindows 11
Кодеки и их версииFastvideo SDK 0.23.1.0, CUDA 13.3; nvJPEG2000 0.11.0.51
Чем измерялся каждый кодекприложение из Fastvideo SDK; программа измерений Fastvideo nvj2k_bench-02
Кадры2k_wild.ppm, 4k_wild.ppm, 8 бит, три канала
Качество или размер файлаq = 85 у кодека Fastvideo, у остальных подобран тот же размер файла
Режим измерений и границы отсчётаодиночные кадры и лучшее сочетание потоков и пачки, по разделу 7
Сетка потоков и пачки8×1, 8×2, 16×2, 8×4, 32×1, 32×2
Повторы3, при разбросе больше 7 % — 5; медиана
Чем измерялась энергиясчётчик видеокарты NVML, разность прогонов N и 2N
Дата измерений31 августа 2026
Код и данныеgithub.com/fastvideo/jpeg2000-benchmark, DOI 10.5281/zenodo.22811905

Если число цитируется отдельно от статьи, рядом с ним должны стоять хотя бы стенд, кадр, режим и дата: например, «1914 кадров в секунду, кодирование JPEG2000 кадра 2K с потерями, RTX 4090, лучшее сочетание потоков и пачки, 31.08.2026».

Каждая статья с результатами начинается с короткого раздела «Как мерили» по единой заготовке: абзац со ссылкой на эту страницу и номер редакции, таблица условий и строка «Отличие от методики». Строка обязательна, и если отличий нет, в ней так и написано: «нет».

14. Чем тесты JPEG отличаются от тестов JPEG2000?

Порядок измерений у двух форматов общий, отличаются настройки качества и то, что приходится проверять отдельно.

Что проверяется у каждого формата сверх общего порядка измерений.
ЧтоJPEGJPEG2000
Чем задаётся качествотаблицы квантования; шкала качества у каждой реализации своякачество или шаг квантования; у некоторых кодеров ещё коэффициент сжатия
Как сверяются шкалыв два слоя: таблицы квантования, записанные в файлах, и результат их применения — размер файла и PSNRпо результату: размер файла и PSNR
Прореживание цветностикодек Fastvideo поддерживает 4:4:4, 4:2:2 и 4:2:0; в сравнении 4:4:4, затем 4:2:0кодек Fastvideo поддерживает 4:4:4, 4:2:2 и 4:2:0; основное сравнение на 4:4:4
Сжатие без потерьнетесть, вейвлет 5/3
Заданный размер файланетрежим PCRD у кодера Fastvideo, измеряется отдельно
Работа на процессореэнтропийное кодирование Хаффмана может идти на процессоре или на видеокарте, это записывается для каждой точкиTier-2 на процессоре, входит в отсчёт
Аппаратный блокна части видеокарт и модулей есть аппаратный декодер JPEG; его наличие проверяется на каждой картенет
Главная работадискретное косинусное преобразование и кодирование Хаффманавейвлет-преобразование и энтропийное кодирование EBCOT

У библиотек бывают пороги, на которых меняется путь выполнения. В заголовочном файле nvJPEG сказано, что в режиме GPU hybrid декодирование Хаффмана уходит на видеокарту, только когда в пачке больше 50 кадров; при меньшей пачке оно идёт на процессоре. Такие пачки нужны загрузке данных для нейросетей, а не потоку крупных кадров (раздел 1), поэтому сетка под порог не подгоняется. У каждой точки записывается, где шло декодирование Хаффмана, и это входит в отсчёт как работа кодека на процессоре. Правило общее: если путь выполнения зависит от размера задачи, это называется в статье, а сетка строится по нашей задаче.

14.1. Как проверяется аппаратный декодер JPEG?

Четырьмя независимыми способами на самой видеокарте, потому что документация отвечает не на каждую карту. У nvJPEG она называет поколения, а не модели: аппаратный декодер есть у «Ampere (A100, A30), Hopper, Ada, Blackwell», и из поколения Ampere названы только две серверные модели. Кроме того, библиотека может без предупреждения перейти с аппаратного блока на CUDA, и такую работу легко принять за работу блока.

Проверка аппаратного декодера JPEG. Каждый способ отвечает на вопрос сам по себе, вывод делается по всем четырём.
СпособЧто показывает
Библиотекасоздаётся ли декодер на аппаратном блоке, сколько блоков на карте и принимает ли блок каждый сжатый файл серии
Кадрсовпадает ли кадр аппаратного декодера с кадром декодера на CUDA
Счётчик драйверарастёт ли загрузка блока JPEG во время работы на аппаратном блоке и стоит ли она на нуле при работе на CUDA
Штатная программа NVIDIAработает ли на блоке nvjpegDecoder, которая сама пробует аппаратный декодер

Тем же порядком проверяется аппаратный кодер JPEG: в заголовочном файле nvJPEG он объявлен (NVJPEG_ENC_BACKEND_HARDWARE), и есть ли он на конкретной карте, выясняется только на ней. На модулях Jetson аппаратный блок JPEG свой (в выводе tegrastats это поле NVJPG), и проверяется он так же.

14.2. Как делится на стадии декодирование JPEG?

У nvJPEG декодирование разбито на три стадии самой библиотекой: разбор файла и декодирование Хаффмана на процессоре, пересылка данных на видеокарту и обратное преобразование на видеокарте. Каждая стадия измеряется отдельно. Доли показывают, куда уходит время одного кадра, но складывать их во время кадра нельзя: между стадиями стоят синхронизации, которых в обычной работе нет. У кодеков Fastvideo стадии печатает сам кодек, как у JPEG2000 (раздел 10).

14.3. Что у JPEG измеряется отдельными сериями?

Прогрессивный JPEG, 12 бит и сжатие кадров с мозаикой Bayer. У кодека JPEG из Fastvideo SDK эти режимы есть, но у других кодеков их может не быть, а поведение на них другое. Каждый такой режим измеряется своей серией по тем же правилам, и в статье он называется в строке «Отличие от методики» или в названии серии.

15. Чего эта методика не измеряет?

Того, что лежит за пределами задачи из раздела 1, и того, что требует отдельного набора данных:

В каждой статье есть раздел «Что не проверено». Утверждение, которое не подтверждено измерением, стоит только там, а не по тексту, и читатель видит, где вывод опирается на измерение, а где на рассуждение.

16. Как повторить измерения у себя?

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

Как быстро проверить скорость отдельного модуля Fastvideo на своей видеокарте демо-программой, описано на странице «Как проверить производительность Fastvideo на своём оборудовании». Замечания к методике принимаются в разделе issues репозитория.

17. Редакции методики и статьи, которые на неё ссылаются

Методика меняется редакциями. Статья ссылается на редакцию, по которой получены её числа, поэтому новая редакция не меняет смысла старых результатов.

Редакции методики.
РедакцияДатаЧто изменилось
120 сентября 2026первая редакция; собрана из статей о сравнении кодеков JPEG2000 на RTX 4090, на процессоре и на Jetson Orin и из подготовки сравнения кодеков JPEG на RTX 4090

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

Права на этот материал

Текст методики распространяется по лицензии CC BY 4.0: его можно перепечатывать, пересказывать, переводить и применять в своих измерениях, в том числе в коммерческих, со ссылкой на источник. Ссылка выглядит так: Fastvideo, «Методика тестирования кодеков JPEG и JPEG2000», редакция 1, https://www.fastvideo.ru/benchmarks/codec-benchmark-methodology.htm. Номер редакции нужен обязательно: по нему видно, по каким правилам получены числа. Если вы меняли методику, скажите, что именно.

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

Об авторе

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

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

Фаствидео делает обработку изображений на видеокартах с 2009 года. Кодеки соответствуют стандартам, которые реализуют — JPEG (ITU-T T.81 / ISO IEC 10918) и JPEG2000 (ITU-T T.800 / ISO IEC 15444). Любой опубликованный результат воспроизводим: скрипты измерений и сырые логи лежат в открытом репозитории, демонстрационные версии — в разделе загрузок.

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

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