Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有办法在硬件上并行化哈夫曼编码的实现?_Algorithm_Parallel Processing_Hardware_Processor_Huffman Code - Fatal编程技术网

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

Algorithm 有没有办法在硬件上并行化哈夫曼编码的实现?,algorithm,parallel-processing,hardware,processor,huffman-code,Algorithm,Parallel Processing,Hardware,Processor,Huffman Code,哈夫曼编码所涉及的步骤是相当连续的。因此,我想知道,在任何支持并行实现的平台上(如GPU、多核处理器等)实现哈夫曼编码时,如何引入并行性?基于快速谷歌搜索,哈夫曼编码的并行化是可能的,论文可以追溯到几十年前 我还没有准备好它们中的任何一个(只是瞥了一眼,以了解它们的相关性) 下面是一个例子,这个家伙声称: 不过,如果我们有适当数量的处理器,并行哈夫曼解码应该不难,并且我们假设处理器元素之间的通信时间非常短 多核/多处理器: 可以使用多核处理器并行化哈夫曼编码。基本思想是将源流分割成块,

哈夫曼编码所涉及的步骤是相当连续的。因此,我想知道,在任何支持并行实现的平台上(如GPU、多核处理器等)实现哈夫曼编码时,如何引入并行性?

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

我还没有准备好它们中的任何一个(只是瞥了一眼,以了解它们的相关性)

下面是一个例子,这个家伙声称:

不过,如果我们有适当数量的处理器,并行哈夫曼解码应该不难,并且我们假设处理器元素之间的通信时间非常短


多核/多处理器:

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

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

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

线程化

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

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

GPU和硬件加速


我不知道使用GPU进行哈夫曼编码有什么简单的方案。一般来说,GPU非常擅长从间隔不均匀的内存位置读取和写入间隔恒定的内存位置的操作,但反之亦然(例如,这就是位移映射如此困难的原因)。因为哈夫曼编码是后者的一个例子,它不太适合基于GPU的加速。但是,对于这个问题,有一些定制的硬件解决方案,例如用于许多手机中的硬件加速视频编码器。

当你说“在硬件中”你的意思是设计一个系统/芯片的架构吗?无论是什么,都是为了并行地运行赫夫曼的。我的意思是设计一个硬件体系结构,它在支持GPU、多核处理器等并行实现的系统上实现赫夫曼编码。哈夫曼编码体系结构中的allelism,其步骤非常有序。我仍然感到困惑。你在标题中说“在硬件上”,但在评论中说“在支持并行实现的系统上”。那么你是在问1)在已经能够并行运行的计算机上创建哈夫曼编码的并行实现,或者2)创建专门为并行运行哈夫曼而设计的硬件体系结构?很抱歉造成混淆。选项1是我想要的。谢谢。您是对的,有几种并行实现哈夫曼解码器的方法,但几乎没有任何文章讨论编码器的并行实现。