Можно ли добиться декодирования Хаффмана в графическом процессоре?

У нас есть база данных, закодированная методом Хаффмана. Цель здесь состоит в том, чтобы скопировать его на GPU с соответствующим декодером; затем на графическом процессоре декодируйте базу данных и делайте что-то с этой декодированной базой данных, не копируя ее обратно на ЦП.

Я далек от того, чтобы быть специалистом по Хаффману, но те немногие, кого я знаю, показывают, что этот алгоритм, по сути, основан на управляющих структурах. Боюсь, что с базовым алгоритмом будет много сериализованных операций.

Мои 2 вопроса:

  • знаете ли вы, существует ли какая-либо эффективная версия графического процессора для кодирования Хаффмана?
  • если нет, как вы думаете, существует ли алгоритм Хаффмана, который можно адаптировать к графическому процессору (т.е. с меньшим количеством управляющих структур). Или, может быть, вы знаете (и могли бы предоставить ссылку), что эффективное декодирование Хаффмана не может быть эффективным на графическом процессоре.

Я вижу и другие ограничения, но они не критичны: - GPU может быть не очень эффективен для обработки дерева: бинарное дерево можно хранить в классическом массиве - может быть сложно сбалансировать нагрузку: посмотрим позже


person Jérôme    schedule 10.06.2010    source источник
comment
Я сомневаюсь, что вы увидите какую-либо реальную выгоду, реализуя это на графическом процессоре - CUDA или как-то иначе. Графические процессоры действительно хороши только для подмножества задач, где есть параллелизм и однородная работа с несколькими точками данных.   -  person Paul R    schedule 10.06.2010
comment
Хаффман, насколько я знаю, полностью серийный. Вы не можете вообще разделить код для декодирования, потому что вы не знаете, где находится разрыв, пока не обработаете весь код до разрыва.   -  person Justin Peel    schedule 10.06.2010
comment
Пример реализации (ссылка) на iOS Metal показывает, что одновременное декодирование нескольких блоков намного быстрее, чем выполнение логики на ЦП. Необходимо создать справочную таблицу для каждого блока, поэтому возникают некоторые накладные расходы. См. stackoverflow.com/a/47954985/763355.   -  person MoDJ    schedule 28.12.2017


Ответы (3)


Проблема с кодированием Хаффмана в том, что вы не можете перемотать вперед. то есть: вам нужно декодировать побитно, линейно.

Таким образом, это не идеально для параллелизма.

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

person Matthieu M.    schedule 10.06.2010
comment
Как вы думаете, почему пошаговая обработка не идеальна для параллелизма? Я думаю, что прочитать несколько независимых закодированных значений побитно не проблема. Проблема заключается в параллельном выполнении декодирования этих битов. - person Jérôme; 11.06.2010
comment
Проблема для Хаффмана в том, что вы не знаете, сколькими битами закодирован символ. Вы читаете первое, проверяете, является ли это символом, читаете второе, проверяете, является ли это символом, читаете третье АХ, это символ, хорошо поэтому я сохраняю символ и перематываю конечный автомат. Продолжается. Это не параллелизуется. - person Matthieu M.; 11.06.2010

Да, вы можете выполнять декодирование Хаффмана параллельно, и поэтому вы можете получить преимущества в графическом процессоре — при условии, что память не является проблемой.

Для дальнейшего обсуждения я расскажу о дереве Хаффмана и выводе Хаффмана — вывод представляет собой сжатые символы, которые нужно искать в дереве Хаффмана для декодирования.

Алгоритм Хаффмана требует, чтобы у вас было дерево Хаффмана для декодирования — это дерево может быть большим. Вы можете обойти это, используя небольшое дерево Хаффмана, которое помещается в локальную память графического процессора, но это повлияет на эффективность сжатия алгоритма. Например. вы можете ограничить дерево лучшими узлами 2 ^ n настолько, насколько позволяют ваши процессоры GPU. (например, используйте дерево, ограниченное, скажем, 1024 узлами.

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

Хаффман выводит символы, упакованные в переменное количество битов. Если вы начнете с середины вывода, вы не сможете узнать, находитесь ли вы на границе символа. Но вы можете создать свои собственные границы. Например, в выводе вы можете просто принудительно выровнять символы через каждые x слов, чтобы они были выровнены по словам. Тогда вы знаете, что можете начать декодирование любого слова, кратного x в выходных данных, и отправить этот блок на узел обработки графического процессора вместе с соответствующим деревом.

Вам не обязательно использовать только одно дерево, но одно дерево на блок также может быть излишним. То есть, если у вас есть одно дерево на блок, вы сильно сократите эффективность сжатия, если блоки маленькие.

Таким образом, вы можете попробовать посмотреть на сходство блоков и закодировать похожие блоки одним и тем же деревом и сохранить индекс дерева для каждого блока. Например. у вас может быть 10000 блоков на выходе, но всего 50 деревьев с 1024 узлами. Затем вы отправляете один блок и одно дерево на каждый узел обработки GPU для параллельного декодирования.

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

person Rafael Baptista    schedule 10.10.2012

Я поражен явным консенсусом, что Хаффман на GPU невозможен.

Я апеллирую к афоризму: «Если случилось, то должно быть возможно». (по-разному приписывается Агате Кристи, Альберту Эйнштейну и др.)

Поскольку SuperXero выполняет алгоритм Хаффмана на графическом процессоре, я полагаю, что это должно быть возможно.

Сжатие Хаффмана процессора быстрее после первого выполнения? (SuperXero)

Google: декомпрессия Хаффмана на графическом процессоре

person David Cary    schedule 18.05.2012