技术领域
[0001] 本发明涉及集成电路技术领域,尤其涉及一种SNAPPY压缩算法硬件加速器。
相关背景技术
[0002] SNAPPY压缩算法是大数据应用中常用的压缩算法,该压缩算法以字节为最小单位进行压缩,同时兼顾了压缩率和压缩速度,在保证可观的压缩率前提下有较快的压缩速度。SNAPPY压缩算法主要原理是通过将后面的数据与前面的数据进行比较,若存在重复的数据段,则使用偏移和长度代替重复的数据,其中偏移是指找到的重复数据段与当前数据的距离,长度是指重复数据段的长度。通过存储这样的一个(偏移,长度)数据对,来代替长度较长的重复数据段,达到压缩的目的。而对于未找到重复数据的部分,保留其原数据。
[0003] 目前,SNAPPY压缩算法以64KB大小将数据切分为压缩块,每个压缩块之间独立压缩,即压缩过程中不会跨过64KB的边界寻找重复数据段,也不会将跨越64KB边界的元数据用于生成资料标记。
[0004] 现有的SNAPPY压缩算法软件方案运行时需要占用大量的CPU计算资源,影响SNAPPY压缩算法性能和计算机系统的整体性能。如何克服SNAPPY压缩算法软件方案占用大量CPU计算资源的问题是需要解决的技术问题。
具体实施方式
[0042] 为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明具体实施例及相应的附图对本发明技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0043] 以下结合附图,详细说明本发明实施例提供的技术方案。
[0044] 具体地,本发明中的一种SNAPPY压缩算法硬件加速器,SNAPPY压缩后的文件由压缩前的长度、若干拷贝标记和若干资料标记组成。其中,压缩前的长度以变体小端格式(little‑endian variant)表示;拷贝标记由元数据、偏移和拷贝长度组成,用于代表重复数据段;资料标记由元数据、资料长度和资料组成,用于代表未重复数据段。
[0045] 具体地,以变体小端格式表示的压缩前的长度由一系列字节组成,并以小端格式排列。每个字节的后7位是数值位。每个字节的第1位是标记位,用于表示下一字节是否属于该数值,若该字节的第一比特位如果为1,则表示下一个字节也属于该数值的一部分;若第一比特位为0,则下一个字节不属于该数值的一部分,亦即该字节是本数值的组后一个字节。例如2097149(0x1FFFFD)用变体小端格式应表示为0xFD0xFF 0x7F。
[0046] 具体地,根据资料长度的不同,资料标记有2种格式。格式一能表示资料长度为1至60,该资料标记由1个元数据字节和若干字节资料组成,其中元数据字节前6位表示资料长度减1,后2位固定位“00”。元数据字节后紧跟数据本身,数据的长度由资料长度指定。
[0047] 具体地,格式二能表示资料长度大于60的资料标记,该资料标记由1个元数据字节、若干个资料长度字节和若干字节资料组成,其中元数据字节前4位固定为“1111”且后2位固定为“00”,剩余中间两位用于表示资料长度字节的字节数,其中“00”表示1个字节,“01”表示2个字节,“10”表示3个字节,“11”表示4个字节;资料长度字节表示资料长度减1,紧跟在元数据字节后面,以小端格式排列。资料长度字节后紧跟数据本身,数据的长度由资料长度字节指定。
[0048] 具体地,拷贝标记有三种格式。格式一长度为2个字节,第1个字节为元数据字节,第2个字节为偏移字节,其中元数据字节的前3位和偏移字节的所有8位组成的11位数据用于表示偏移,元数据的4到6位表示拷贝长度减4,元数据的后两位固定为“01”。格式二为3个字节,第1个字节为元数据字节,第2、3字节为偏移字节,其中元数据的前6位表示拷贝长度‑1,后两位固定为“10”,2个偏移字节表示偏移(以小端格式)。格式三为5个字节,第1个字节为元数据字节,第2至5字节为偏移字节,其中元数据的前6位表示拷贝长度‑1,后两位固定为“11”,4个偏移字节表示偏移(以小端格式)。
[0049] 如附图1‑4所示,本发明实施例提供了一种SNAPPY压缩算法硬件加速器,该加速器包括:
[0050] 长度生成模块1,长度生成模块1用于接收待压缩数据,并获取待压缩数据的首地址,待压缩数据的长度和压缩写回数据首地址,将待压缩数据的首地址和待压缩数据的长度发送至读取模块2,将压缩写回数据首地址发送至写回模块4,将待压缩数据的长度转换为预设格式,同时发送到写回模块4;
[0051] 读取模块2,读取模块2用于读取主机端中的待压缩数据,并接收来自长度生成模块1发送的待压缩数据的首地址和待压缩数据的长度,并将所读取的待压缩数据传输至压缩模块3;
[0052] 压缩模块3,压缩模块3用于将读取模块2传输的待压缩数据进行压缩,并将所压缩的数据传输至写回模块4;
[0053] 写回模块4,写回模块4用于接收来自长度生成模块1中传输的按预设格式转换后的待压缩数据的长度和压缩模块3所压缩的数据并进行缓存,并将上述两种数据均发送至主机端。
[0054] 需要说明的是:上述两种数据都需要发送,首先发送预设数据,然后发送压缩数据。
[0055] 需要说明的是:写回的数据首先是一个变体小端格式的长度(预设格式),然后是一堆被压缩完的数据。
[0056] 具体地,预设格式为变体小端格式。
[0057] 具体地,长度生成模块1在对数据进行处理时:长度生成模块1接收从主机端传来的待压缩数据首地址、待压缩数据长度、压缩写回数据首地址,并将待压缩数据首地址和待压缩数据长度转发给读取模块2,将压缩写回数据首地址发送给写回模块4。同时,长度生成模块1会将待压缩数据长度转换成变体小端格式,作为SNAPPY压缩文件的“压缩前的长度”字段,发送给写回模块4,并发送启动信号给读取模块2和压缩模块3,启动读取、写回以及压缩操作。
[0058] 具体地,写回模块4包括写回数据缓存模块41,写回生成模块42和写回控制模块43;
[0059] 写回数据缓存模块41用于缓存长度生成模块1中传输的按预设格式转换后的待压缩数据的长度和和压缩模块3中传输的已压缩数据;
[0060] 写回生成模块42用于接收长度生成模块1传输的压缩写回数据首地址,并生成从压缩写回数据首地址开始的连续写访问请求,完成写回缓存模块42中的数据到主机端的数据写回;
[0061] 写回控制模块43用于与主机端进行交互并产生控制信号,控制写回模块4的写回过程。
[0062] 具体地,将待压缩数据的长度转换为预设格式的方法为:
[0063] 将待压缩的数据按预设形式进行排列;
[0064] 将排列后的数据从低位起按照预设位数将所排列后的数据划分为若干字段;
[0065] 将所划分的若干字段进行高位补齐后进行按照预设格式进行排列,完成待压缩数据的长度预设格式的转换。
[0066] 在本实施例的一些可选的实现方式中,数据转换成变体小端格式的过程如下:
[0067] (1)将一个数按二进制形式表示,从低位起每7位分为一个字段,最后高位剩下的不多于7位为最后一个字段(最高字段);
[0068] (2)将这些字段修改为以8位为长度的字段,修改方式为:对于最高字段,其高位全部补0;对于其他字段,高位补1个1;
[0069] (3)将这些修改后的字段按小端格式排列,则完成一个数向其变体小端格式的转换。
[0070] 需要说明的是:转换后的预设格式的数据也会发送到写回模块(只发一次),而且是在压缩模块3给写回模块4发数据之前,写回模块4除了接收来自压缩模块3所压缩的数据外,同样会接收该预设格式数据,之后缓存并发送至主机端。
[0071] 具体地,读取模块2包括读取生成模块21、读取控制模块22和读取缓存模块23;
[0072] 读取生成模块21用于缓存长度生成模块1传输的待压缩数据首地址和待压缩数据长度,并生成从待压缩数据首地址开始且访问长度为待压缩数据长度的连续访问请求,完成待压缩数据从主机端的读取;
[0073] 读取控制模块22用于完成与主机端的交互,并产生控制信号,控制读取模块2的读取过程;
[0074] 读取缓存模块23用于缓存从主机端读取的数据,并将所缓存的数据发送至压缩模块3进行压缩。
[0075] 具体地,如图1和图3所示,本发明中的读取模块2在读数据进行处理时:读取模块2负责从主机端读取和缓存待压缩数据,并将读取的待压缩数据发送给压缩模块3进行压缩。由于Snappy压缩具有64KB边界的特性,读取模块2对发送给压缩模块3的数据进行计数,每满64KB则给压缩模块3发送一个数据块边界信号EOB(end of block)。当发送的数据为待压缩数据的最后一个字节时,给压缩模块3发送一个数据结束信号EOD(end of data)。
[0076] 读取模块2包括读取生成逻辑、读取控制模块22和读取缓存模块23。读取生成模块21缓存长度生成模块1发来的待压缩数据首地址和待压缩数据长度,并生成从待压缩数据首地址开始、访问长度为待压缩数据长度的连续访问请求,完成待压缩数据从主机端的读取。读取控制模块22完成与主机端的具体交互,产生控制信号,控制整个数据读取过程。读取缓存模块23负责缓存从主机端读取的数据,并将这些数据发送到压缩模块3进行压缩操作。
[0077] 具体地,读数据缓冲通常可设置为若干个读数据位宽大小,如64字节的读数据位宽可将读数据缓冲设置成64字节、128字节、256字节等。
[0078] 需要说明的是:end of data或end of block表示数据结束信号或块结束信号。当接收到EOB信号时,表示的含义为当前接收的数据为块数据的最后一个字节;当接收到EOD信号时,表示的含义为当前接收的数据为待压缩数据的最后一个字节。
[0079] 具体地,压缩模块3包括:字符串匹配模块31,拷贝标记生成模块32和资料标记生成模块33,
[0080] 字符串匹配模块31用于缓存读取模块2的数据并写入预设的数据历史表中进行存储,同时字符串匹配模块31用于对缓存的数据进行哈希运算,根据哈希运算结果从预设哈希匹配表中读取相应的哈希项用于匹配对比寻找重复的字符串,根据哈希运算结果将缓存的数据作为新的哈希表项更新到哈希匹配表;
[0081] 拷贝标记生成模块32用于待字符串匹配模块31字符串匹配成功后,完成最长字符串匹配和拷贝标记生成;
[0082] 资料标记生成模块33用于对未找到重复字符串的数据进行处理并生成资料标记。
[0083] 具体地,资料标记生成模块33中所缓存的资料数据不大于60字节。
[0084] 具体地,本发明一种SNAPPY压缩算法硬件加速器中的哈希匹配表如下表1所示;
[0085] 表1:哈希匹配表
[0086] 数据段 匹配位置段 有效段ABCD 30 1
BCDE 31 1
DDDD 65 1
MNOP 90 0
… … …
ZZZZ 32500 1
[0087] 具体地,字符串匹配模块31字符串匹配成功后,完成最长字符串匹配和拷贝标记生成的方法为:
[0088] 初级字符串匹配成功后字符串匹配模块31从读取模块2中获得的数据直接传递给拷贝标记生成模块32,拷贝标记生成模块32将其缓存;同时,拷贝标记生成模块32以对应的哈希表项的匹配位置段为数据历史表的读取地址,从数据历史表中读取一个字节数据,将其与刚刚缓存的数据做比较,若相等则匹配成功,若不相等则匹配不成功;同时,拷贝标记生成模块32设置最长匹配长度计数器进行匹配和拷贝标记。
[0089] 具体地,本发明中的压缩模块3在对数据进行处理时:压缩模块3负责对读取模块2发送过来的数据进行压缩,压缩后将数据发送到写回模块4进行数据写回。压缩模块3包括字符串匹配模块31、拷贝标记生成模块32和资料标记生成模块33。
[0090] (1)字符串匹配模块31
[0091] 字符串匹配模块31负责缓存来自读取模块2的数据,将其写入数据历史表,数据历史表的大小为64KB,用于顺序存储一个64KB的数据块,可采用RAM存储或者寄存器。一般情况下,缓存数据应为4个字节数据,字符串匹配模块31对缓存的数据进行哈希运算,根据哈希结果从哈希匹配表中读取相应的哈希项用于匹配对比寻找重复的字符串。同时,根据哈希结果将缓存的数据作为新的哈希表项更新到哈希匹配表中。
[0092] 具体地,哈希匹配表其包含3个字段,数据段、匹配位置段、有效段,其中数据段存储4个字节的数据,匹配位置段存储该4个字节数据在64KB数据块中的位置,有效段存储该哈希表项是否有效,可用1位表示有效。具体地,字符串匹配模块31对缓存的4个字节数据进行哈希运算,哈希运算可采用Snappy软件压缩程序推荐的哈希函数(即将缓存的数乘以0x1e35a7bd后右移若干位),也可以采用别的哈希函数。若最后处理的数据不足4个字节(如处理本数据块只剩3个字节或更少数据时),则不进行后续的字符串匹配或强制该匹配不成功。
[0093] 具体地,字符串匹配模块31读出哈希匹配表对应的表项后,若该表项有效,则进行初级字符串匹配操作,即将数据段与缓存的数据进行比较确定缓存的数据,判断两者是否相等,若相等,则字符串匹配成功,否则,匹配不成功。若该表项无效,则匹配不成功。匹配成功后,字符串匹配模块31向拷贝标记生成模块32、资料标记生成模块33发送匹配成功信号,激活拷贝标记生成模块32,并将当前缓存数据的位置信息和对应哈希表项的匹配位置段发送给拷贝标记生成模块32用于后续的拷贝标记生成。匹配不成功时,向资料生成标记模块发送缓存数据的第一个字节数据,用于后续生成资料标记。匹配不成功时,字符串匹配模块31中的缓存数据更新一个字节,重新进行上述的匹配操作。
[0094] 具体地,当字符串匹配模块31收到来自读取模块2的EOB和EOD信号后,说明当前数据为该数据块最后一个数据,当该数据处理完毕后重置哈希匹配表,具体可通过将哈希匹配表中的有效段置位无效。同时,向拷贝标记生成模块32和资料标记生成模块33传递EOB信号和EOD信号用于各自模块的控制。
[0095] (2)拷贝标记生成模块32
[0096] 拷贝标记生成模块32负责在字符串匹配模块31的初级字符串匹配成功后,完成最长字符串匹配和拷贝标记生成。
[0097] 具体地,当初级字符串匹配成功后,字符串匹配模块31向拷贝标记生成模块32发送当前缓存数据的当前位置信息和对应哈希表项的匹配位置段,同时,将后续从读取模块2获得的数据直接传递给拷贝标记生成模块32,拷贝标记生成模块32开始最长字符串匹配操作,匹配过程如下:
[0098] 具体地,初级字符串匹配成功后字符串匹配模块31从读取模块2中获得的数据直接传递给拷贝标记生成模块32,拷贝标记生成模块32将其缓存。同时,拷贝标记生成模块32以对应的哈希表项的匹配位置段为数据历史表的读取地址,从数据历史表中读取一个字节数据,将其与刚刚缓存的数据做比较,如果相等则匹配成功,如果不相等则匹配不成功。拷贝标记生成模块32设置最长匹配长度计数器,该计数器每次重置为4,当上述匹配成功后自动加1,匹配不成功后重置为4。
[0099] 具体地,匹配成功后,拷贝标记生成模块32将数据历史表的读取地址加1,后继续从数据历史表中读取数据,与下一个从读取模块2直接传递给拷贝标记生成模块32的数据进行比较,完成匹配操作,直至匹配不成功。
[0100] 具体地,当匹配不成功后,拷贝标记生成模块32生成一个拷贝标记,并发送给写回模块4进行写回。拷贝标记生成过程如下,拷贝标记生成模块32以当前缓存数据的当前位置信息和对应哈希表项的匹配位置段的差值作为偏移,将计数器重置前的数据作为拷贝长度,生成一个拷贝标记,若偏移小于2048且拷贝长度小于12,则生成格式一拷贝标记,长度为2个字节,否则生成格式二拷贝标记,长度为3个字节。
[0101] 具体地,当收到字符串匹配模块31发送的EOB信号或EOD信号时,说明已处理到本数据块的最后一个数据,此时拷贝标记生成模块32按当前处理情况生成一个拷贝标记,即拷贝标记生成模块32以当前缓存数据的当前位置信息和对应哈希表项的匹配位置段的差值作为偏移,将计数器重置前的数据作为拷贝长度,生成一个拷贝标记并发送给写回模块4进行写回。
[0102] (3)资料标记生成模块33
[0103] 具体地,资料标记生成模块33负责将未找到重复字符串的数据进行处理并生成资料标记。
[0104] 具体地,当初级字符串匹配不成功时,字符串匹配模块31向资料生成标记模块发送缓存数据的第一个字节数据,和匹配不成功信号。资料标记生成模块33设置资料标记数据缓存,资料生成模块收到匹配不成功信号后,将发送过来的一个字节数据放进资料标记数据缓存,缓存大小应至少大于60字节,即能满足一个资料标记格式一的数据大小。同时,资料标记生成模块33设置资料数据计数器,用于统计资料数据缓存中的数据大小,该计数器初始值为0,每当收到一个缓存数据则加1。当资料数据计数器大于等于60时,资料标记生成模块33将资料标记数据缓存中的前60个字节取出,生成一个资料长度为60字节的资料标记,并发送给写回模块4进行写回,同时将资料数据计数器的值减去60。
[0105] 具体地,当初级字符串匹配成功时,字符串匹配模块31向资料生成模块发送匹配成功信号,资料生成模块收到匹配成功信号后,将当前资料数据缓存中的所有数据取出,生成一个资料长度为资料数据计数器值大小的资料标记,并发送给写回模块4进行写回,同时,将资料数据计数器的值重置为0。
[0106] 具体地,当收到字符串匹配模块31发送的EOB信号或EOD信号时,说明已处理到本数据块的最后一个数据,此时资料标记生成模块33将当前资料数据缓存中的所有数据取出,生成一个资料长度为资料数据计数器值大小的资料标记,并发送给写回模块4进行写回,同时,将资料数据计数器的值重置为0。
[0107] 具体地,资料标记生成模块33和拷贝标记生成模块32在同一时间段最多只有一个模块向写回模块4发送数据。
[0108] 需要说明的是(仲裁说明):如图1和图2所示,本发明中的一种SNAPPY压缩算法硬件加速器对数据的处理是串行的,资料标记生成模块33和拷贝标记生成模块32在同一时间段最多只有一个模块向写回模块4发送数据。而长度生成模块1在系统启动后只有一次写数据的过程,且都在资料标记生成模块33和拷贝标记生成模块32之前,因此,长度生成模块1、资料标记生成模块33、拷贝标记生成模块32不存在冲突。若存在写回时的数据阻塞而导致资料标记生成模块33和拷贝标记生成模块32需要同时向写回模块4发送数据,则可在该两个模块向写回模块4传输数据时增加原数据位置信息,选择位置信息较前的数据优先进行处理通过写回模块4写回主机端。拷贝标记生成模块32和资料标记生成模块33收到EOB或EOD信号,且完成当前的标记数据传递到写回模块4后,压缩模块3向写回模块4发送EOB或EOD信号。
[0109] 具体地,如图1和图4所示,本发明中的写回模块4在对压缩数据进行处理时:写回模块4负责从压缩模块3中接收已压缩数据并将其缓存,之后将已压缩数据发送回主机端。当写回模块4接收到来自压缩模块3的EOD信号后,写回模块4将当前接收数据最后一个字节标记为最后字节,当最后字节写回到主机端后,文件压缩完毕。写回模块4包括写回数据缓存模块41、写回生成模块42和写回控制模块43。
[0110] 具体地,写回数据缓存模块41用于完成缓存来自长度生成模块1长度生成模块1的“压缩前长度”字段,且该数据仅发送一次,且在资料标记生成模块33和拷贝标记生成模块32启动前完成,之后开始缓存从压缩模块3发送来的已压缩数据。当缓存的数据符合写回大小或为本压缩块最后一个字节时,将数据写回到主机端。写数据缓冲通常可设置为若干个写数据位宽大小,如64字节的读数据位宽可将读数据缓冲设置成64字节、128字节、256字节等。
[0111] 写回生成模块42用于接收长度生成模块1传输的压缩写回数据首地址,并生成从压缩写回数据首地址开始的连续写访问请求,完成所述写回缓存模块中的数据到主机端的数据写回;
[0112] 具体地,写回控制模块43用于完成与主机端的具体交互,产生控制信号,控制整个数据写回过程。当写回模块4接收到来自压缩模块3的EOB信号时,说明当前接收的已完成压缩数据为当前压缩块的最后一个数据,此时立即生成写回请求,完成当前数据块的写回。当写回模块4接收到来自压缩模块3的EOD信号时,说明当前接收的已完成压缩数据为压缩文件的最后一个数据,此时立即生成写回请求,数据写回后压缩过程结束。
[0113] 具体地,本发明的一种SNAPPY压缩算法硬件加速器,在对数据进行压缩时的步骤和原理为:
[0114] 长度生成模块1接收来自主机端的待压缩数据首地址、待压缩数据长度、压缩写回数据首地址,将待压缩数据首地址和待压缩数据长度发送给读取模块2,将压缩写回数据首地址发送给写回模块4。然后,长度生成模块1将待压缩长度转化为变体小端格式,作为SNAPPY压缩后的文件中的压缩前的长度数据,发送给写回模块4,由写回模块4将该数据写回到主机端。之后,长度生成模块1向读取模块2、压缩模块3和写回模块4发送启动信号,启动后续的数据读取、压缩和写回操作。
[0115] 读取模块2从待压缩数据首地址起,顺序读取数据,并发送给压缩模块3进行数据压缩操作。压缩模块3收到来自读取模块2的数据后启动压缩操作,并将压缩后的数据传给写回模块4,由写回模块4将压缩后的数据写回主机端。
[0116] 读取模块2读取到最后一个数据后,向压缩模块3传递EOD信号,压缩模块3收到EOD信号后,记录当前数据为需要处理的最后一个数据。当压缩模块3处理完最后一个数据后,向写回模块4传递EOD信号,标记当前数据为最后一个数据,当最后一个数据写回到主机端,压缩过程结束。
[0117] 由此,本发明的一种SNAPPY压缩算法硬件加速器,在对压缩数据进行处理时,通过硬件电路方式实现SNAPPY压缩算法,以硬件流水并行的处理能力完成SNAPPY压缩操作,资料标记处理和拷贝标记处理由不同的硬件完成,互不干扰;将资料标记的长度超过60的资料标记拆分成多个长度为60或以下的资料标记,降低硬件复杂度;采用流水方式实现,数据读取、压缩、写回均可同时进行,使得在对数据进行压缩时,通过本发明的压缩算法硬件加速器进行数据压缩,也即从根源上解决了软件实现SNAPPY占用CPU资源比较高的问题,采用本发明的硬件实现压缩算法可以不运行在CPU上,就不存在CPU占用问题,从而进一步增加数据处理的并行度,压缩速度快,效率高,占用CPU资源少。
[0118] 需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。此外,本文中“前”、“后”、“左”、“右”、“上”、“下”均以附图中表示的放置状态为参照。
[0119] 最后应说明的是:以上实施例仅用于说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。