一种Huffman硬件解码方法 |
|||||||
申请号 | CN202011063334.5 | 申请日 | 2020-09-30 | 公开(公告)号 | CN113271107B | 公开(公告)日 | 2024-04-26 |
申请人 | 北京清微智能科技有限公司; | 发明人 | 孔超; 唐士斌; 欧阳鹏; | ||||
摘要 | 本 发明 为一种Huffman 硬件 解码方法,包括:接受霍夫曼树的码流,接收未解码的数据码流,将同一个标记的64bit未解码的数据码流拼接为一个目标数据组, 解码器 Decoder_i在第一次解码时均向后延迟i个时钟周期。其中,i=0,1,2,3,4,5,6,7。单个解码器接收到目标数据组后,单个解码器在对应的第一个时钟周期提取目标数据组的前12bit数据。依次查找前12bit数据中每个比特数据。若命中前12bit数据中的一个数据data_0时,则停止查找,累加器获取目标数据data_0的编码长度a1,再将目标数据组中所有数据左移a1位。解码器在每个固定时钟周期交替读出第一 存储器 的高64位和低64位数据完成解码。每个Decoder均在64个时钟周期解码出64个8bit数据。实现8路并行流 水 解 码,大幅度减少数据解码所需时间。 | ||||||
权利要求 | 1.一种Huffman硬件解码方法,其特征在于,包括: |
||||||
说明书全文 | 一种Huffman硬件解码方法技术领域背景技术[0002] 由于人们对算法精度的高要求,神经网络的层数越来越多,神经网络的权重参数在数量和大小上达到了一个前所未有的高度。庞大神经网络权重规模导致了严重的存储墙问题,这会严重影响整体系统的性能发挥。通过有效的数据压缩从而解决存储墙问题一直是学术界和工业界的热点。 [0003] 以Huffman编码为代表的熵编码是一种常用的数据压缩方式,由于Huffman编码是一种不定长的编码方式,高速并行的Huffman解码效率低。 发明内容[0004] 本发明的目的是提供一种Huffman硬件解码方法,提高解码效率。 [0005] 为了实现上述目的,采用的技术方案为:一种Huffman硬件解码方法,包括下述步骤: [0006] S100:接受霍夫曼树的码流,其数据格式为冗余码和掩码的拼接格式。 [0007] S101:接收未解码的数据码流,分割所述数据码流获取多个数据组;所述数据组包括64个数据和固定比特长度的Head。 [0008] S102:每个时钟周期内向定位器输入64bit定长的未解码的数据码流。定位器截取第一批64bit未解码的数据码流中高10位作为Head。则当前已累计的Group长度为54bit。每到来一笔新的未解码的数据码流时,当前已累计的Group长度自增64bit。 [0009] 判断当前已累计的Group长度是否大于或等于Head的值。若是,则更新Head,重新计算当前已累计Group的长度。若否,则等待新的未解码的数据码流。 [0010] S103:根据Head的值与当前已累计的Group长度,对当前的64bit未解码的数据码流进行拆分并标记。 [0011] 判断当前已累计的Group长度是否小于Head的值。若是,则不对当前的64bit未解码的数据码流进行拆分,且标记为0。若否,则拆分当前64bit未解码的数据码流获取第一部分和第二部分。第一部分隶属于当前Group且标记为0,第二部分隶属于下一个Group且标记为1。 [0012] S104:将同一个标记的64bit未解码的数据码流拼接为一个目标数据组。 [0013] S105:解码器Decoder_i在第一次解码时均向后延迟i个时钟周期。其中,i=0,1,2,3,4,5,6,7。 [0014] S106:单个解码器接收到目标数据组后,单个解码器在对应的第一个时钟周期提取目标数据组的前12bit数据。依次查找前12bit数据中每个比特数据。若命中前12bit数据中的一个数据data_0时,则停止查找,累加器获取目标数据data_0的编码长度a1,再将目标数据组中所有数据左移a1位。 [0015] S107:在第二个时钟周期内,解码器提取左移a1位后的目标数据组的前12bit数据。依次查找每个前12bit数据。若命中前12bit数据中的一个数据data_1时,则停止查找。累加器获取数据data_1的编码长度a2,将左移a1位后的目标数据组再次左移a2位。依次类推,在第一个时钟周期至第十六个时钟周期内,获取编码长度a0至编码长度a15。 [0016] S108:在第二个时钟周期内,将a0写入第一存储器(ram_0)的[127:120]位。在第三个时钟周期内,将a1写入ram_0的[119:112]位。依次类推,在第二个时钟周期至第十七个时钟周期内,编码长度a0至a15均被依次写入第一存储器。 [0017] S109:解码器在每个固定时钟周期交替读出第一存储器ram_0的高64位和低64位数据完成解码。 [0018] 与现有技术相比,本发明的技术效果为: [0019] 首先,设置八个解码器,即解码器Decoder_0至解码器Decoder_7,通过解码器Decoder_i在第一次解码时均向后延迟i个时钟周期。这样再通过S106至S109单个解码器的解码步骤,每个Decoder均在64个时钟周期解码出64个8bit数据。实现全流水解码操作,也就是实现8路并行流水解码,达到了64bit/cycle的解码效率。相比于串行解码,本发明可以大幅度减少数据解码所需时间。 [0020] 其次,本发明使用霍夫曼解码,在稀疏数据的编码场景下,可以达到25倍以上的压缩效率。在一些数据带宽受限的应用场景下,本发明有着非常好的应用效果。 [0022] 图1是本发明的整体架构示意图。 [0023] 图2是本发明单个解码器的解码流程图。 [0024] 图3是本发明实现并行解码全流水操作的时序说明示意图。 具体实施方式[0025] 下面结合附图对本发明的具体实施方式进行描述。 [0026] 如图1至3所示,本发明一实施例为一种Huffman硬件解码方法,包括步骤S100和S109,首先,本发明中准备解码的步骤为S100和S102。 [0027] S100:接受霍夫曼树的码流,其数据格式为冗余码和掩码的拼接格式。 [0028] 解码器decoder_0至decoder_7接受霍夫曼树的码流,霍夫曼树的码流即为为解码的码表,解码器能够根据霍夫曼树的码流对未解码的数据码流进行解码。 [0029] S101:接收未解码的数据码流,分割所述数据码流获取多个数据组;所述数据组包括64个数据和固定比特长度的Head; [0030] 具体地,数据码流通过Huffman编码后将每64个数据分为一个数据组。每一个数据未进行Huffman编码前为8bit定长数据,编码后为2bit至12bit的不定长数据,形如{data0,data2,data3,..,data63}为一个数据组,即1个数据组内包括64个已经过Huffman编码的二进制码流数据。 [0031] 在每个数据组前添加一个固定比特长度为10的Head。数据组的长度包括Head的比特长度。添加Head是为了将每个数据组分割开来。 [0032] 也就是码字使用冗余码(12bit)及掩码(4bit)的方式写入霍夫曼共享树。举例来说,若码字为11001,写入时应补零至12bit,其为110010000000。同时写入其掩码,其掩码应为1001。 [0034] 掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位,并用二进制字符串表示有效位数的个数。 [0035] 下述步骤S102为读取数据的过程。 [0036] S102:每个时钟周期内Huffman向定位器输入64bit定长的未解码的数据码流。 [0037] 定位器截取第一批64bit未解码的数据码流中高10位作为Head。则当前已累计的Group长度为54bit。每到来一笔新的未解码的数据码流时,当前已累计的Group长度自增至64bit。 [0038] 判断当前已累计的Group长度是否大于或等于Head的值。若是,说明在此笔未解码的数据码流中存在新的Head,则更新Head,并且重新计算当前已累计Group的长度。若否,则等待新的未解码的数据码流。 [0039] S103:根据Head的值与当前已累计的Group长度,对当前的64bit未解码的数据码流进行拆分并标记。 [0040] 判断当前已累计的Group长度是否小于Head的值。若是,则不对当前的64bit未解码的数据码流进行拆分,且标记为0。若否,则拆分当前64bit未解码的数据码流获取第一部分和第二部分。第一部分隶属于当前Group且标记为0,第二部分隶属于下一个Group且标记为1。 [0041] S104:将同一个标记的64bit未解码的数据码流拼接为一个目标数据组。 [0042] S104还包括:判断目标数据组是否低于768bit,若是,则目标数据组补零至768bit。 [0043] S105:解码器Decoder_i在第一次解码时均向后延迟i个时钟周期。其中,i=0,1,2,3,4,5,6,7。 [0044] 本发明设置八个解码器,即解码器Decoder_0至解码器Decoder_7,也就是解码器Decoder_0在第一次解码时均向后延迟0个时钟周期,即解码器Decoder_0无需延迟。 [0045] 解码器Decoder_1在第一次解码时向后延迟1个时钟周期,解码器Decoder_2在第一次解码时向后延迟2个时钟周期,以此类推,解码器Decoder_7在第一次解码时向后延迟7个时钟周期。 [0046] 将Decoder_i(i=0,1,2,3,4,5,6,7)在第一次解码时均向后延迟i个时钟周期,每个Decoder均在64个时钟周期解码出64个8bit数据。实现全流水解码操作,也就是实现8路并行流水解码。 [0047] 具体地,如图2所示,单个解码器的解码步骤为S106至S109。 [0048] S106:单个解码器接收到目标数据组后,单个解码器在对应的第一个时钟周期提取目标数据组的前12bit数据。依次查找目标数据组中前12bit数据中每个比特数据。 [0049] 判断前12bit数据中的第i个数据是否命中,若是,则停止查找,累加器获取目标数据data_0的编码长度a1,再将目标数据组中所有数据左移a1位。若否,则i自增1,继续下一次是否命中的判断。 [0050] 比如,解码器Decoder_0在第一个时钟周期内,先提取768bit数据的前12bit数据,先依次查找1bit、2bit、3bit、....、11bit、12bit。若命中2bit时,不再继续查找之后的3bit、....、11bit、12bit情况。命中一个数据data_0后,同时累加器获得其编码长度a1,再将768bit数据左移a1位。 [0051] S107:在第二个时钟周期内,解码器提取左移a1位后的目标数据组的前12bit数据。依次查找每个前12bit数据。若命中前12bit数据中的一个数据data_1时,则停止查找。累加器获取数据data_1的编码长度a2,将左移a1位后的目标数据组再次左移a2位。依次类推,在第一个时钟周期至第十六个时钟周期内,获取编码长度a0至编码长度a15。 [0052] 在第二个时钟周期内,以同样的方式命中data_1后,同时累加器获得data_1的编码长度a2,768bit数据再次左移a2位。 [0053] 在第一到第十六个时钟周期内,命中a0,a1,a2,...,a14,a15。 [0054] S108:在第二个时钟周期内,将a0写入第一存储器ram_0的[127:120]位。在第三个时钟周期内,将a1写入第一存储器ram_0的[119:112]位。依次类推,在第二个时钟周期至第十七个时钟周期内,编码长度a0至a15均被依次写入第一存储器ram_0。 [0055] S109:解码器在每个固定时钟周期交替读出第一存储器ram_0的高64位和低64位数据完成解码。 [0056] 比如,在第十个时钟周期内,读出第一存储器ram_0的高64位。在第十八个时钟周期内,读出第一存储器ram_0的低64位。 [0057] 由以上步骤循环可以实现第一存储器ram_0的pingpong操作。 [0058] Ping‑pong实质是一种数据缓冲的手段(是一种数据传输技术),能够同时利用两个数据缓冲区达到数据连续传输的目的,从而提高数据传输速率。由于单个缓冲区得到的数据在传输和处理中很容易被覆盖,而Ping‑pong缓冲区的方式能够总是保持一个缓冲区的数据被利用,另一个缓冲去用于存储数据。即两个相同的对象作为缓冲区交替地被读和被写。 [0059] 首先,本发明设置八个解码器,即解码器Decoder_0至解码器Decoder_7,通过解码器Decoder_i在第一次解码时均向后延迟i个时钟周期。这样再通过S106至S109单个解码器的解码步骤,每个Decoder均在64个时钟周期解码出64个8bit数据。 [0060] 实现全流水解码操作,也就是实现8路并行流水解码,达到了64bit/cycle的解码效率。相比于串行解码,本发明可以大幅度减少数据解码所需时间。 [0061] 其次,本发明使用霍夫曼解码,在稀疏数据的编码场景下,可以达到25倍以上的压缩效率。在一些数据带宽受限的应用场景下,本发明有着非常好的应用效果。 [0062] 最后,本发明采用固定长度的数据作为Head,非常有利于并行设计。 [0063] 图3是本发明实现并行解码全流水操作的时序说明示意图,图3中只示意性地给出了解码器decoder_0和解码器decoder_1,数据输入是768bit的目标数据组din_0、din_1和din_2,每一个解码器在每一个时钟周期,都会解码出一个8bit的数据。 [0064] 在解码器decoder_1解码出dout_0时,此时解码器decoder_0已经解码出了dout_0至dout_8。 [0065] 在下一拍,解码器decoder_0将dout_0至dout_7通过pingpongbuffer发送出来,形成数据输出DO_00,DO_00即为64bit的数据输出。 [0066] 表1示出了霍夫曼共享树的码流存储格式。 [0067] 表1 [0068] |