近年来,随着物联网等场景的不断发展,一些问题也逐渐的暴露了出来,就比如嵌入式设备上的 CPU时钟频率
,电源
等资源都是有限的;对于部分设备来说可能换个时钟频率高的时钟、换个大的电池确实可以解决问题,但对于手机这种嵌入式移动设备来说,像是要做到便携、轻薄等等要求,体积就被限制住了,电源也因此被限制住了。
因此,需要一种基于硬件的压缩方法来解决这个问题。 大多数基于字典的自适应压缩方法都起源于 Lempel-Ziv 算法,就比如最快的压缩算法之一 LZ4。作者也就对 LZ4 进行了改进,并根据改进后的 LZ4 的压缩提出了一种硬件架构。
固定的(fixed),面向字节(byte-oriented)
的算法。
令牌(Token)
、 字面量长度(Literal length)
、 偏移量(Offset)
和 匹配长度(Match length)
组成。
搜索缓冲区
和一个向前查找缓冲区
组成。
令牌(Token) 长一个字节,其中前4个字节为 字面量长度(Literal Length)
,其后四个字节为 匹配长度(Match Length)
。
Token[3:0]
表示 匹配长度
,表示 0 ~ 15 的文字长度。Token[7:4]
表示 字面量长度
,是比较不重要的位,匹配长度从0 ~ 15。
Token [7:4]
的值如果为0,则代表没有文字。Token [7:4]
的值如果为15,则表示文字长度必须有从 0~255 的额外字节来表示字面量的完整长度。Token [3:0]
的如果值为0,则表示最小匹配长度为4,称为min match
。Token [3:0]
的值从0到15意味着匹配长度值从4到19。如果Token[3:0]
的值为15,则匹配长度中有更多字节。Token[7:4]
值为 15 时,字面值长度(Literal Length)
就是额外的字节。字面量长度
为 0~254,则没有更多的字节。如果字面量长度
是 255,在下一个字面量长度中有产生更多的字节。偏移量(Offset)
占用2字节,采用little-endian
格式,它表示要复制的匹配的位置。匹配长度(Match Length)
类似于上面说到的字面量长度(Literal Length)
。Token[3:0]
达到可能的最高值 15 时,额外的字节被添加到匹配长度
中。偏移量(Match Length)
分配 2字节,但其实这对压缩比的性能影响不大。
本文作者改进了数据格式的序列
和哈希计算
。
这里作者改变了 LZ4 的首部(Header)
和偏移量(Offset)
,下图分别是 改进后的 LZ4 与 LZ4 的格式。
Header | Token | Literal | Length Literals | Offset | Match Length |
---|---|---|---|---|---|
2 Bytes | 1 Byte | 0-n Bytes | 0-L Bytes | 1-2 Bytes | 0-n Bytes |
Token | Literal Length | Literals | Offset | Match Length |
---|---|---|---|---|
1 Byte | 0-n Bytes | 0-L Bytes | 2 Bytes | 0-n Bytes |
压缩大小(Compressed Size)
和原始标志(Raw Flag)
。压缩后的数据大小
大于原始数据大小
,则原始标志(Raw Flag)
则被标记为 1
,原始数据
将被添加在首部(Header)
之后,压缩符号将不被添加,解压器
也不需要解压该压缩单元。原始标志(Raw Flag)
使解压缩程序更快。偏移量(Offset)
由大小标志(Size Flag)
和偏移量大小(Offset Size)
组成。大小标志(Size Flag)
是最重要的位。如果大小标志
值为 0,偏移量大小
则使用 7 bit,即{offset [7], offset[6:0]}
。大小标志
值为 1,偏移量大小
则使用 15 bit,即{offset [15], offset[14:0]}
。偏移量大小
表示匹配的位置,最大偏移大小值为32768。IN
为32位值,LZ4的哈希计算公式在硬件上实现复杂,并且计算周期长。于是作者改进了该哈希计算公式,公式如下:
核心模块(压缩模块和解压缩模块)
和高级微控制器总线体系结构(AMBA)
接口组成,实现应用处理器的互连。
高级外设总线(APB)
与处理器
进行控制信号通信。输入数据和输出数据通过高级可扩展总线(AXI)
处理。
模块 | 模块数量 | 面积 | 总面积(mm2) |
---|---|---|---|
Compress | 1 | 0.01320 | 0.01320 |
Decompress | 1 | 0.01345 | 0.01345 |
Hash Table | 2 | 0.00515 | 0.01029 |
SRAM | 8 | 0.00652 | 0.05215 |
AXI(DMA) | 1 | 0.01187 | 0.01187 |
APB | 1 | 0.00133 | 0.00133 |
压缩模块主要由SRAM控制组件
、哈希计算组件
、字节匹配组件
和流生成组件
组成,下图为压缩模块的架构图。
原始标志(Raw Flag)
设置到首部(Header)
并输出原始数据。原始标志(Raw Flag)
,解压时执行memcpy
解压缩模块比压缩模块简单,它主要由SRAM控制组件
、流解析组件
和缓冲区组件
组成。
在这里,作者将提出的设计与原来的 LZ4 进行了比较,并展示了压缩比与压缩速度以及各种数据类型之间的关系,这些数据类型包括二进制数据
、文本数据
、Android应用程序包
、字体数据
、JPEG图像
以及 HTML页面数据
。
本实验所提出设计运行在400MHz的处理环境下。数据的吞吐量也取决于总线条件,在考虑总线条件的情况下,要考虑整个模块的压缩速率。
由于在LZ4中有一个加速选项,加速值越高,压缩越快;相应的,压缩比会降低。这里便有了与LZ4各加速方案进行了比较的实验在上述两图。
本文提出了一种改进的 LZ4 算法 和硬件结构。可变长的偏移量
、优化的哈希算法
以及硬件流水线
都提高了压缩速率和压缩比。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有