是否有可能在GPU中实现霍夫曼解码?

时间:2010-06-10 10:05:12

标签: algorithm gpu huffman-code

我们有一个用霍夫曼编码编码的数据库。这里的目的是在GPU上复制它与相关的解码器;然后在GPU上解码数据库并在这个解码的数据库上执行操作而不将其复制回CPU上。

我远远不是霍夫曼专家,但我知道的少数人表明它似乎是一种基本上基于控制结构的算法。使用基本算法,我担心会有很多序列化操作。

我的两个问题是:

  • 你知道是否存在任何有效的霍夫曼编码GPU版本
  • 如果没有,你认为是否存在适用于GPU的霍夫曼算法(即控制结构较少)。或许您知道(并且您可以提供参考)有效的霍夫曼解码在GPU上无法有效。

我看到其他限制,但它们并不重要:   - GPU处理树的效率不高:二叉树可以存储在经典数组中   - 工作量很难平衡:我们会看到

3 个答案:

答案 0 :(得分:5)

霍夫曼编码的问题在于你无法快进。即:你必须逐个线性地解码。

因此,并行性并不理想。

如果你可以决定编码,你可以完美地按块编码块,以便能够独立解码每个块。

答案 1 :(得分:2)

是的,您可以并行进行霍夫曼解码,这样您就可以在GPU中获得优势 - 提供的内存不是问题。

对于下面的讨论,我将讨论霍夫曼树和霍夫曼输出 - 输出是需要在霍夫曼树中查找以进行解码的压缩符号。

霍夫曼算法要求您有一个用于解码的霍夫曼树 - 该树可能很大。您可以通过使用适合GPU中本地内存的小型霍夫曼树来解决这个问题 - 但这会影响算法的压缩效率。例如。您可以将树限制为最佳的2 ^ n个节点,就像您的gpu处理器允许的那样。 (例如,使用限制为1024个节点的树。

如果你不限制huffman树,这样你就可以在每个gpu上的本地存储中放一个副本,那么你就不会真正得到你期望的并行性,因为所有的gpu处理器都会被阻塞访问内存所有读取相同的内存共享树。

霍夫曼输出符号以可变位数打包。如果你从输出的中间开始知道你是否在一个符号boudary上是没有办法的。但是你可以创建自己的边界。例如,在输出中,您可以强制每个x字的符号对齐为字对齐。然后你知道你可以在输出中的任意多个x字上开始解码,并将该块与适当的树一起发送到GPU处理节点。

您不必只使用一棵树 - 但每块一棵树也可能过度杀伤。也就是说,如果块每个块有一棵树,那么如果块很小,你将会严重削减压缩效率。

因此,您可以尝试查看块的相似性并使用相同的树对相似的块进行编码,并为每个块存储树索引。例如。您可能在输出中有10000个块,但只有50个1024节点树。然后向每个GPU处理节点发送一个块和一个树以并行解码。

使其快速化的关键是每个GPU处理节点仅在本地内存上工作。

答案 2 :(得分:1)

我很惊讶哈弗曼在GPU上的明显共识是不可能的。

我呼吁格言:“如果它发生,它必须是可能的”。 (不同归因于阿加莎克里斯蒂,阿尔伯特爱因斯坦等)

由于SuperXero在GPU上运行Huffman,我想它一定是可能的。

CPU huffman compression faster after first execution?(SuperXero)

Google: GPU huffman decompression