纠删码数据的快速编解码方法和系统的制作方法_3

文档序号:9579052阅读:来源:国知局
[0103] pshufb xmm3, xmm4;获取16字节的hi乘法结果放在xmm3
[0104] pxor xmm3, xmm2;获取最后乘法结果到xmm3
[0105] .....
[0106] 其中寄存器xmmO存放16字节Di数据,寄存器xmml存放16字节0x0f数据(即 OxOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOf),寄存器xmm2存放Gij对0x00至0x0f的低字节乘 法结果,寄存器xmm3存放GlS对0x00至OxfO的高字节乘法结果。
[0107] 通过采用以上的7个指令,即可计算出16个字节的伽罗瓦域乘法。计算出所有 DjGy的值后,原有Di的block就变成了 的block,随后对其进行X0R获得最后的匕 结果。
[0108] 在本发明的优选实施例中,当以字节为单位进行编码,即伽罗瓦域为GF(2S)时,可 采用SSE指令集中的xorps或pxor指令。该指令一次可完成128位寄存器之间的异或,即 一个指令完成16个字节的X0R。
[0109] 对于Pi的计算,使用指令"xorpsxmmO,xmml" 或"pxorxmmO,xmml" 计算 .Di?D:? ... ? 的异或和,其中的xmmO,xmml为128位寄存器,xmmO存放Pi地址,xmml 依次存放D2~Dn数据。Di可在初始化时直接复制到xmmO。
[0110] 如果处理器支持AVX指令集,可采用AVX指令集中的vxorps指令,即指令"vxorps ymmO, ymml, ymm2",该指令为三寄存器命令,把256位(32字节)的寄存器ymml和ymm2异 或后,结果给寄存器ymmO。ymmO存放Pi的地址,Di数据复制到Ppymml和y_2依次存放D2 至Dn数据。如果最后数据不足,ymm2用0填充。和SSE指令集的命令相比,AVX指令集的 vxorps指令不仅字长大一倍,而且一个指令完成两个数据的X0R,因此速度比SSE快4倍。
[0111] 对于p2至Pm的计算,可以在上面的基础上进行并行XOR。
[0112] 实施例2
[0113] 在解码时,如果丢失了不超过校验码冗余数m的原数据分片,可使用校验码block 参与解码,获得丢失的那些原数据block。传统Reed-Solomon解码方法需要解ηXη阶方阵 的逆矩阵,需要〇(η3)的计算量(应用高斯消元法,其中η为原数据分片数)。
[0114] 本发明的解码方法不需要计算ηΧη阶方阵的逆矩阵,只需要计算kXk阶方阵解 码矩阵Gllt&的逆矩阵,其中k为解码时使用的校验码block数量,有0〈k<m(k为0时表 示原数据block均已收到,直接组成解码数据即可,无需再使用解码矩阵)。由于k总是小 于等于原数据分片数η(因m<η),因此可以节约解码时矩阵求逆的难度和时间。
[0115] 在该优选实施例中,解码方法的步骤S23时使用k个校验码block(获取到的η 个数据block中包括k个校验码和n-k个原数据,即有k个原数据丢失),则k阶解码矩阵 Gllt&的确定方式为:在原有生成矩阵(生成矩阵的构造方式同实施例1的描述,不再赘述) 中,确定丢失的k个原数据所对应的行和所使用的k个校验码block所对应的列,取其交叉 点的元素构成解码矩阵Gllt&。
[0116] 以实施例1中示例的第二生成矩阵G4为例,其中η= 8,m= 3,如果丢失了 03和 D5,使用了校验码Pi和P3,则解码矩阵为:
[0117]
[0118] 该解码矩阵是由原第二生成矩阵G4的第3和第5行的第1和第3列的元素组成。 通过传统高斯消元法可求出其逆矩阵G' llt&。
[0119] 同时,在该优选实施例中,步骤S24中为了加快后面的乘法运算,也对该逆矩阵中 的每个元素用与前述实施例1中同样原理准备解码乘法缓存表,共需要kXkX32字节的内 存。
[0120] 步骤S25中,利用k个校验码、n-k个原数据以及生成矩阵计算恢复码P',的通 项公式为:
;其中,如果某个Di不在已获取的n-k个原数据中(即 其为丢失数据),则认为该Di= 0。
[0121] 若校验码中存在Pi,因生成矩阵第一列元素均为l,P'i的计算简化为Pi与各Di的 异或和(同上,未获取到的Di为0,可直接忽略),无需伽罗瓦域乘法操作,因而首先就可省 略一部分的伽罗瓦域乘法操作的消耗。由此也可见,在解码时应尽可能使用第一个校验码 Pi参与计算恢复码,以便减少计算恢复码时的总乘法数量。
[0122] 对于其他恢复码,也采用上述实施例1中的方式来加快伽罗瓦域乘法操作和X0R 操作的速度。亦即,第一个原数据Di直接用于计算异或和,将参与计算的其他每个原数据Di 拆分为高字节部分和低字节部分,分别乘以对应矩阵元素G、,以计算伽罗瓦域乘法(同上, 未获取到的Di为0,相关计算可直接忽略),所述伽罗瓦域乘法数据存放在所述编码乘法缓 存表中。计算时使用SMD指令计算所述伽罗瓦域乘法和异或和,比如使用SSE或AVX指令 集可并行查表计算伽罗瓦域乘法;随后采用SSE指令集中的xorps或pxor指令、或采用AVX 指令集中的vxorps指令,在伽罗瓦域乘法结果的基础上进行并行X0R。
[0123] 继续前述的示例,目前待解码数据包括6个原数据blocl^DpDyDpDeU^和2 个校验码block的、P3)以及解码矩阵的逆矩阵G' llt&。
[0124] 下面要准备恢复码矩阵P' [P'i,P' 3],计算公式为:
[0125]
[0126]
[0127] 由于本发明的生成矩阵中第一行和第一列元素均为1,以上公式化简为:
[0128]
[0129]
[0130] 可见,采用本发明的生成矩阵,可以减少伽罗瓦域乘法次数,尤其是尽可能使用第 一个校验码Pi的情况下。
[0131]通过以上方式,获得k个恢复码P',(下标与解码使用的k个校验码P,对应)后,随 后步骤S26中乘以解码矩阵的逆矩阵G'llt&,即可获得丢失的k个原数据。然后将解码恢复 出的原数据(k个)和已获取的原数据(n-k个)统一组装成文件或者Chunk。步骤S26中 矩阵乘法的计算也借助上述方式加快运算速度,字节拆分、并行查表及并行X0R方式相似, 在此不再赘述。
[0132] 此外,因本发明的生成矩阵中第一行元素全为1,其编解码方法还兼容了副本算 法。只要令分片数η=1,就是1+m的多副本算法。解码时只需要有任意一个副本存在即 可,逆矩阵是一阶单位阵[1]。
[0133] 实施例3
[0134] 参见附图3,本发明的再一个优选实施例中,以计算机详细数据处理流程的方式进 一步描述了编码方法的过程:
[0135]步骤S102:根据分片数η和冗余数m初始化编码器,准备生成矩阵。此处选用Sun 矩阵作为生成矩阵,其特征是矩阵的第1行和第1列均为1。所述生成矩阵可以选择由范德 蒙德矩阵或柯西矩阵变换而来。比如由柯西矩阵变换的示例,使用Glj= (iXjV(i+j-l) 形式的矩阵,其中i,j分别代表矩阵的行和列。
[0136] 再根据Sun矩阵的mXη个元素,准备mXηX32字节的编码乘法缓存表,存放Sun 矩阵中每个元素Gl]的伽罗瓦域乘法数据。对于每个元素,使用32字节,前16字节存放该元 素对(^00、(^01、《"(^(^(即0到15)的乘法数据,后16字节存放该元素对(^00、(^10、~ Οχ??(即0X16到15X16)的乘法数据。可以认为该编码乘法缓存表是一个[n][m][32]的 数组。
[0137] 步骤S104:将待编码文件F,桉照分布式文件系统(或云存储系统)的Chunk大 小,分为若干个Chunk(若最后一个Chunk不足则补零)。具体的划分过程,可能需要分布式 文件系统的元数据服务器的支持。默认的Chunk-般为64MB。
[0138]步骤S106:读取一整块Chunk数据,按照分片数n,将整块Chunk数据顺序分为η 个block,计为DpD2、…、Dn。每个block长度为16倍数(使用SSE指令集时)或32倍数 (使用AVX指令集时),最后一个block不足时要补零。此处block长度设置为16字节或 者32字节的整数倍,是为了方便并行X0R和并行乘法运算。
[0139] 步骤S108:将DuD,、···、0"的各个block数据保存到分布式文件系统中。每个Di 位于独立的磁盘或者存储节点中。这可能需要分布式文件系统元数据服务器的支持。
[0140] 步骤S110:开始编码校验码block。首先判断是否是计算第一个校验码Pi;如果 结果为真,转到步骤S112,否则,转步骤S118。
[0141] 步骤S112:当确认要编码第一个校骑码P,时进入本步骤,将Di的block直接复制 给Pi的block。
[0142] 步骤S114:循环执行n-1次,每次使用SSE指令集的16字节的异或执行P,二 PiΦDi。该步骤的目的是将所有Di的block从头到尾进行异或,并将异或和赋值给Pi,这样 就能够获得校验码Pi。
[0143] 步骤S116:将P,的block数据保存到分布式文件系统中。Pi存储位置和Di不同, 这可能需要分布式文件系统元数据服务器的支持。之后跳转到步骤S110。
[0144] 步骤S118:对除第一个校验码Pi以外的其它校验码进行编码,设置j= 2。
[0145]
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1