有没有办法在硬件上并行化霍夫曼编码实现?

时间:2015-08-03 20:59:42

标签: algorithm parallel-processing hardware processor huffman-code

霍夫曼编码涉及的步骤非常顺序。所以,我想知道如何在支持并行实现的任何平台上实现霍夫曼编码时引入并行性,如GPU,许多核心处理器等。

2 个答案:

答案 0 :(得分:3)

多核/多处理器:

可以使用多核处理器并行化霍夫曼编码。基本思路是将源流分成块,为每个处理器分配一个块,将块并行编码为单独的中间缓冲区,然后将来自中间缓冲区(具有不同长度)的编码结果连接到最终输出缓冲区。

一个复杂因素是因为霍夫曼编码使用不同比特长度的代码,所以每个块很可能不会编码长度为整数个字节的比特流。这意味着在连接结果时,可能需要使用位移来正确地将一个中间缓冲区的输出与前一个缓冲区的输出对齐。例如,如果缓冲区A产生150字节和3位长的结果,那么当复制缓冲区B时,数据必须移位3位,一个字节的5位和中间缓冲区的下一个3位连接在一起将每个字节写入输出缓冲区。

一种解决方法是利用输出格式的特殊性。例如,如果您是Huffman编码JPEG格式的图像数据,则可以在写入输出缓冲区的每个块的开头输出JPEG重新开始标记,以将流对齐到字节边界。根据JPEG规范,这个标记旨在允许并行解码,但它也使并行编码更容易。

<强>线程

假设您有一个100Kb的源数据流和4个处理器。最简单的做法就是将其分成每个25Kb的块,但是这可能会导致最坏情况下第一个块是最后一个完成编码,因此所有其他处理器都必须等待它,因为第二个在知道第一个块的长度之前,不能将块写入输出缓冲区。为了避免这种情况,将输入流拆分为较小的块,以先到先得的方式将数据分配给可用的处理器,每个处理器在完成后立即将其中间缓冲区的内容写入输出缓冲区。并且所有早期的块都已完成编码(以便在输出缓冲区中写入索引是已知的),然后在输入流中分配下一个可用块。

您需要同步访问输入缓冲区的读取索引并写入输出缓冲区的索引,但不要同步访问输出缓冲区本身。例如,一旦处理器完成,它可以(使用线程同步)读取输出缓冲区索引以知道从哪里开始写入,然后(仍然使用线程同步)根据它将要写入的数据的大小更新索引,然后(不再使用同步)开始写。这样,多个处理器可以一次写入输出缓冲区。类似的方案可用于输入缓冲区。

GPU和硬件加速

我不知道任何使用GPU进行霍夫曼编码的简单方案。通常,GPU非常擅长从不均匀间隔的存储器位置读取并写入恒定间隔的存储器位置,但反之亦然(这就是为什么位移映射如此困难)。因为霍夫曼编码是后者的一个例子,所以它不太适合基于GPU的加速。但是,有针对此问题的自定义硬件解决方案,例如在许多移动电话中使用的硬件加速视频编码器中使用。

答案 1 :(得分:2)

基于快速谷歌搜索,哈弗曼编码的并行化是可能的,而且这些论文可以追溯到几十年前。

我还没有准备好任何一个(只需要一瞥就明白相关性)。

这是一个small blog post on the topic,这个人声称:

  但是,如果我们拥有适当数量的处理器,那么并行霍夫曼解码应该不会很难,我们假设处理器元件之间的通信时间非常短。