ARM平台下基于NEON指令加速的纠删编解码方法及装置与流程

文档序号:26003564发布日期:2021-07-23 21:21阅读:666来源:国知局
ARM平台下基于NEON指令加速的纠删编解码方法及装置与流程

本发明属于分布式存储领域,具体涉及一种arm平台下基于neon指令加速的纠删编解码(ec)方法及装置,用于在arm平台的服务器上提高纠删编码、解码的运算速度,从而带来更高的存储服务器写入性能和故障情况下更快的数据恢复速度。



背景技术:

在编码理论中,纠删码(ec)是一种前向纠错编码,用于处理数据丢失(非错误)情况下的修复问题。它将k个数据块编码成更长的信息,假设其长度为n,n>k。当出现数据丢失时(丢失的数据块小于等于n-k),可以从剩余的长度为k的子集中恢复原始数据。r=k/n被称为编码率。在存储领域中ec在保障数据的可用性和提高磁盘利用率之间获得良好的平衡。其按照一定比例对数据进行纠删编码,在提高容错能力的同时占用更少的磁盘空间,降低存储成本。纠删编解码计算涉及到对大量数据执行相同的操作,比如矩阵的乘法运算。如果能够将这些操作并发进行,可以显著提高运算速度。类似的技术在现代处理器中广泛存在,统称为simd(单指令多数据),例如在intel处理器上支持的mmx、sse、avx等多代加速指令集;arm处理器支持的neon指令集。现有纠删编解码算法在x86平台上实现了对sse与avx2的支持,但在arm平台上尚未提供对neon的支持,目前只能利用cpu的通用寄存器进行串列化的运算,因此在arm平台下纠删编解码性能提升方面有较大的挖掘空间。



技术实现要素:

本发明要解决的技术问题:针对现有技术的上述问题,提供一种arm平台下基于neon指令加速的纠删编解码方法及装置,在arm平台下现有的纠删编解码算法只能利用cpu通用寄存器串行计算,本发明利用arm提供的16个128位neon寄存器实现对数据的并行处理,大幅提高纠删编解码的效率,提升存储系统的性能。

为了解决上述技术问题,本发明采用的技术方案为:

一种arm平台下基于neon指令加速的纠删编解码方法,包括进行纠删编码计算加速的下述步骤:

a1)从预设的编码矩阵c中包含n个元素的一行装载入第一组neon寄存器中;同时,加载包含n个元素的待编码数据列,对待编码数据列进行对数变换,逐字节取对数替换原始数据并装载至第二组neon寄存器中;

a2)将第一组neon寄存器、第二组neon寄存器进行simd异或运算,并将结果存储于数组t;

a3)对数组t中的每一个元素查询指数表并替换为对应的指数值,从而将数组t的内容通过指数变换还原为乘法计算结果;

a4)以异或代替加法,对数组t中的所有元素求和;

a5)判断预设的编码矩阵c的所有行是否计算完毕,若尚未计算完毕,则跳转执行步骤1),否则,将所有求和结果构成的编码结果m输出,结束并退出。

可选地,步骤a1)中预设的编码矩阵c为柯西矩阵。

可选地,步骤a1)中n个元素是指80个元素,其每一个元素为1个字节大小,加载包含n个元素的待编码数据列时若待编码数据列不足80个元素则将不足部分补0处理。

可选地,步骤a2)包括:

a2.1)将第一组neon寄存器中的寄存器、第二组neon寄存器中的寄存器按照顺序一一对应的方式进行组对得到5对寄存器对,对5对寄存器对逐对通过veorq_u8指令进行异或运算,将结果存储于第三组neon寄存器中,且每一条veorq_u8指令在一个处理器周期内,完成16对元素的异或运算;

a2.2)对第三组neon寄存器中执行vst1q_u8指令,将结果存储在内存中的数组t,数组t的数组总长度与待编码数据列包含的元素个数相同。

可选地,步骤a4)中以异或代替加法,对数组t中的所有元素求和的函数表达式:

上式中,m[x]表示所有求和结果构成的编码结果m中第x行的求和结果,x为从预设的编码矩阵c中取出的行的编号,t[i]为数组t中的第i个元素,n为待编码数据列包含的元素个数。

可选地,还包括进行纠删解码计算加速下述步骤:

b1)从预设的解码矩阵中包含n个元素的一行装载入第一组neon寄存器中;同时,加载包含n个元素的剩余编码数据列,对剩余编码数据列进行对数变换,逐字节取对数替换原始数据并装载至第二组neon寄存器中;

b2)将第一组neon寄存器、第二组neon寄存器进行simd异或运算,并将结果存储于数组t;

b3)对数组t中的每一个元素查询指数表并替换为对应的指数值,从而将数组t的内容通过指数变换还原为乘法计算结果;

b4)以异或代替加法,对数组t中的所有元素求和;

b5)判断预设的解码矩阵的所有行是否计算完毕,若尚未计算完毕,则跳转执行步骤1),否则,将所有求和结果构成的编码结果d输出,结束并退出。

可选地,步骤b2)包括:

b2.1)将第一组neon寄存器中的寄存器、第二组neon寄存器中的寄存器按照顺序一一对应的方式进行组对得到5对寄存器对,对5对寄存器对逐对通过veorq_u8指令进行异或运算,将结果存储于第三组neon寄存器中,且每一条veorq_u8指令在一个处理器周期内,完成16对元素的异或运算;

b2.2)对第三组neon寄存器中执行vst1q_u8指令,将结果存储在内存中的数组t,数组t的数组总长度与剩余编码数据列包含的元素个数相同。

可选地,还包括进行逆矩阵运算加速的下述步骤:

c1)构建待求逆矩阵及其伴随单位阵,在待求逆矩阵中遍历选择一个基准元素;

c2)针对待求逆矩阵及其伴随单位阵以基准元素所在列作为基准列,通过将各行加基准列元素自身完成对待求逆矩阵及其伴随单位阵的缩放;

c3)对缩放后的矩阵及其伴随阵查指数表,生成新的矩阵及其伴随阵;

c4)针对新的矩阵及其伴随阵,所有非基准行减去基准行,将所在列非基准元素清零,且对新的矩阵及其伴随阵中每一个非基准行执行如下操作a-h:

a.将新的矩阵的基准行元素装入第一组neon寄存器;

b.将新的矩阵的非基准行元素装入第二组neon寄存器;

c.以异或代替减法,通过veorq_s8指令执行异或运算,结果存放在第三组neon寄存器;

d.将结果输出回矩阵;

e.将伴随阵的基准行元素装入第一组neon寄存器;

f.将伴随阵的非基准行元素装入第二组neon寄存器;

g.以异或代替减法,通过veorq_s8指令执行异或运算,结果存放在第三组neon寄存器;

h.将结果输出回伴随阵;

c5)对新的矩阵及其伴随阵进行清零操作,且将清零操作后的新的矩阵及其伴随阵查对数表,生成对数形式的新的矩阵及其伴随阵;

c6)在矩阵中基准元素是否被遍历完毕,若尚未遍历完毕,则在矩阵中遍历选择下一个基准元素,跳转执行步骤c2);否则,判定矩阵已经被转换为单位阵i,而矩阵的伴随阵变换为对数形式的逆矩阵即为解码矩阵。

此外,本发明还提供一种arm平台下基于neon指令加速的纠删编解码装置,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述arm平台下基于neon指令加速的纠删编解码方法的步骤,或者所述存储器中存储有被编程或配置以执行所述arm平台下基于neon指令加速的纠删编解码方法的计算机程序。

此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有被编程或配置以执行所述arm平台下基于neon指令加速的纠删编解码方法的计算机程序。

和现有技术相比,本发明具有下述优点:在arm平台下现有的纠删编解码算法只能利用cpu通用寄存器串行计算,本发明利用arm提供的16个128位neon寄存器实现对数据的并行处理,一是在arm平台通过对neon指令的运用,实现多个数据分片同时与多个编码阵元进行运算;二是在求解编码矩阵的逆矩阵时,通过neon指令加速对编码矩阵与单位阵同步进行的基本变换(行变换),能够大幅提高纠删编解码的效率,提升存储系统的性能。

附图说明

图1为本发明实施例中的编码计算流程图。

图2为本发明实施例中的待编码数据列的流拆分与对数变换示意图。

图3为本发明实施例中的行变换加速原理图

图4为本发明实施例中的解码计算流程图。

图5为本发明实施例中的逆矩阵生成过程示意图。

具体实施方式

如图1所示,本实施例arm平台下基于neon指令加速的纠删编解码方法包括进行纠删编码计算加速的下述步骤:

a1)从预设的编码矩阵c中包含n个元素的一行装载入第一组neon寄存器(本实施例中为寄存器q0-q4)中;同时,加载包含n个元素的待编码数据列,对待编码数据列进行对数变换,逐字节取对数替换原始数据并装载至第二组neon寄存器(本实施例中为寄存器q5-q9)中;

a2)将第一组neon寄存器、第二组neon寄存器进行simd异或运算,并将结果存储于数组t;

a3)对数组t中的每一个元素查询指数表并替换为对应的指数值,从而将数组t的内容通过指数变换还原为乘法计算结果;

a4)以异或代替加法,对数组t中的所有元素求和;

a5)判断预设的编码矩阵c的所有行是否计算完毕,若尚未计算完毕,则跳转执行步骤1),否则,将所有求和结果构成的编码结果m输出,结束并退出。

作为一种可选的实施方式,步骤a1)中预设的编码矩阵c为柯西矩阵。

则伽罗华域gf(28)上的柯西矩阵的函数表达式为:

其中,x1~xm和y1~yn分别表示伽罗华域gf(28)中的两组数据,且两组数据x1~xm和y1~yn满足如下条件:

1、x1,x2,……,xm各不相同。

2、y1,y2,……,yn各不相同。

3、对于任意1≤i≤m,1≤j≤n,xi+yj≠0

n×n的柯西方阵具有非奇异性的特点,并且其任何子方阵仍然保持该特性,因此柯西方阵始终可逆。使用柯西矩阵进行编码,对允许范围内发生的部分行数据损失,总是可以通过矩阵求逆来获得解码矩阵,从而恢复原始数据。

本实施例中,步骤a1)中n个元素是指80个元素,其每一个元素为1个字节大小,加载包含n个元素的待编码数据列时若待编码数据列不足80个元素则将不足部分补0处理(补0部分在计算结束后丢弃)。参见图2,针对待编码数据流,以1个字节作为一个元素;其中,针对每一个元素根据d=log2b计算其以2为底的对数,以便后续流程中用加法代替乘法进行计算。d0~d79分别表示加载的80个元素,分别存储在寄存器q0-q4(图2中表示为q0-q4)中。

本实施例中,步骤a2)包括:

a2.1)将第一组neon寄存器中的寄存器、第二组neon寄存器中的寄存器按照顺序一一对应的方式进行组对得到5对寄存器对,对5对寄存器对逐对通过veorq_u8指令进行异或运算,将结果存储于第三组neon寄存器(本实施例中为寄存器q10-q14)中,且每一条veorq_u8指令在一个处理器周期内,完成16对元素的异或运算;

a2.2)对第三组neon寄存器中执行vst1q_u8指令,将结果存储在内存中的数组t,数组t的数组总长度与待编码数据列包含的元素个数相同。

步骤a2)将第一组neon寄存器、第二组neon寄存器进行simd异或运算是矩阵乘法的一部分,用对数加法替换了乘法,并且进一步用异或替换了加法,可表示为:

上式中,q0-q4为编码矩阵c的一行,q5-q9为待编码数据列,q10-q14为数组t。对q0-q4与q5-q9寄存器,以如(q0,q5)、(q1,q6)……的形式成对,逐对通过veorq_u8指令进行异或运算,将结果存储于寄存器q10-q14。每一条veorq_u8指令在一个处理器周期内,完成16对元素的异或运算,相比单纯的逐元素对处理极大提高了运算效率。然后对q10-q14执行vst1q_u8指令,将结果存储在内存中的中间结果数组t,数组总长度80字节。完成16对元素的异或运算的原理如图3所示,r1为一个寄存器、r2为另一个寄存器,两个寄存器的第0位同时为c0,则第一位的异或运算结果为0;第1~16位的m1-m16和c1-c16一一对应进行异或,分别获得结果m′1-m′16。

本实施例中,步骤a4)中以异或代替加法,对数组t中的所有元素求和的函数表达式:

上式中,m[x]表示所有求和结果构成的编码结果m中第x行的求和结果,x为从预设的编码矩阵c中取出的行的编号,t[i]为数组t中的第i个元素,n为待编码数据列包含的元素个数。在完成80+m行计算后,编码结果m即为编码后的数据。

本实施例中进行纠删编码计算的原理为编码矩阵乘以待编码数据列获得编码列,其函数表达式如下式所示:

上式中,c11~cmn为m行n列的编码矩阵c中的n个元素,d1~dn为包含n个元素的待解码数据列d,m1~mn为包含n个元素的编码列(编码结果m)。

为提高计算速度,本实施例中将算术乘法以查对数表和指数表的方式实现。例如:

上式中,d1为待解码数据列d的第一个元素,c11为编码矩阵c中的第1行1列位置对应的元素。

在伽罗华域gf(28)上,算数加法与减法可以用异或运算代替。例如:

上式中,d1为待解码数据列d的第1个元素,c11为编码矩阵c中的第1行1列位置对应的元素,d2为待解码数据列d的第2个元素,c12为编码矩阵c中的第1行2列位置对应的元素。在域gf(28)上,一个元素的取值范围在0-255之间,恰好对应一个字节。neon提供16个128位(16字节)寄存器,可以容纳256字节数据。实际计算中使用15个寄存器,分为3组(第一组neon寄存器、第二组neon寄存器和第三组neon寄存器),分别用于存储编码矩阵行、待处理数据列、中间计算结果。一组有5个寄存器,各容纳16字节,总计80字节数据。因此用于编码的矩阵的行宽被确定为80个元素(一个元素对应一个字节)。本实施例中采用大小为(80+m)*80的柯西矩阵,m由用户指定,其意义为冗余存储量,预先计算柯西矩阵在域gf(28)中的对数表并存储于磁盘。

如图4所示,本实施例还包括进行纠删解码计算加速下述步骤:

b1)从预设的解码矩阵中包含n个元素的一行装载入第一组neon寄存器中;同时,加载包含n个元素的剩余编码数据列,对剩余编码数据列进行对数变换,逐字节取对数替换原始数据并装载至第二组neon寄存器中;

b2)将第一组neon寄存器、第二组neon寄存器进行simd异或运算,并将结果存储于数组t;

b3)对数组t中的每一个元素查询指数表并替换为对应的指数值,从而将数组t的内容通过指数变换还原为乘法计算结果;

b4)以异或代替加法,对数组t中的所有元素求和;

b5)判断预设的解码矩阵的所有行是否计算完毕,若尚未计算完毕,则跳转执行步骤1),否则,将所有求和结果构成的编码结果d输出,结束并退出。

本实施例中,步骤b2)包括:

b2.1)将第一组neon寄存器中的寄存器、第二组neon寄存器中的寄存器按照顺序一一对应的方式进行组对得到5对寄存器对,对5对寄存器对逐对通过veorq_u8指令进行异或运算,将结果存储于第三组neon寄存器中,且每一条veorq_u8指令在一个处理器周期内,完成16对元素的异或运算;

b2.2)对第三组neon寄存器中执行vst1q_u8指令,将结果存储在内存中的数组t,数组t的数组总长度与剩余编码数据列包含的元素个数相同。

对比图4和图1可知,进行纠删解码计算加速与前文进行纠删编码计算加速原理一致,过程相同,仅将编码矩阵替换为解码矩阵,将待解码数据列替换为剩余编码数据列。步骤b1)中加载包含n个元素的剩余编码数据列时,同样也以80字节为一个单元取剩余编码数据列,不足80字节的在末尾补0,计算结束后丢弃补0部分。对剩余编码数据列进行对数变换,逐字节取对数替换原始数据(查询对数表取其对数生成新的80个元素)并装载至第二组neon寄存器(寄存器q0-q4)中。步骤b1)中从预设的解码矩阵中包含n个元素的一行装载入第一组neon寄存器中,是指对预设的解码矩阵中包含n个元素的一行中的每一个元素,查询对数表取其对数生成新的80个元素。装载入第一组neon寄存器(寄存器q5-q9)中。通过veorq_s8指令将两组寄存器的对应行元素进行异或运算,结果保存到第三组neon寄存器(寄存器q10-q14)中。然后将寄存器q10-q14的内容输出至中间结果数组t。对数组t中的每一个元素查询指数表并替换为对应值,将数组内容还原为乘法计算结果。对数组t中的所有元素求和,以异或代替加法进行运算。求和结果保存至最终结果数组d中对应位置x,x为解码时选取的解码矩阵行行号。以同样的方式对解码矩阵中的每一行进行计算,输出到数组d。在完成对解码矩阵中每一行的计算后,数组d即为解码后的原始数据。

在发生数据丢失时,需要通过剩余的编码数据恢复原始数据。剩余的编码数据需要大于等于原始数据量。在本实施例中需要大于等于80字节。其基本原理为:

c*d=m

c-1*c*d=c-1*m

d=c-1*m

上式中,c为编码矩阵,m为剩余编码数据矩阵,d为待求解的原始数据。数据的恢复过程即为求解对应编码矩阵的逆矩阵,并执行逆矩阵与剩余编码数据的乘法操作。

上式中,c11~cmn为编码矩阵c,d1~dn为待求解的原始数据d,m1~mm为剩余编码数据矩阵m。编码矩阵c去除已丢失的行后重新组成的80*80大小矩阵为待求逆矩阵。

若矩阵c可逆,则对于其逆矩阵c-1有:

c-1×[ci]=[ic-1]

上式中,i为单位阵。根据上式可知,将编码矩阵c变换为单位阵i的行变换会将矩阵i变换为编码矩阵c的逆矩阵。

如图5所示,本实施例还包括进行逆矩阵运算加速的下述步骤:

c1)构建待求逆矩阵及其伴随单位阵,在待求逆矩阵中遍历选择一个基准元素;

本实施例中,构建待求逆矩阵及其伴随单位阵为:

上式中,c11~cnn为待求逆矩阵,右侧矩阵为待求逆矩阵的伴随单位阵。待求逆矩阵的左上至右下对角线元素被称为基准(pivot)元素,如c11至cnn。缩放行使基准元素为1,并通过行与行之间加、减法运算将基准元素所在列的非基准元素清零。计算过程中如果遇到基准元素为0的行,则选择基准元素所在列非0的行替换当前行。根据前述内容,待求解矩阵一定可逆,因此不存在一列全部为零的情况,必有可用于交换的行。为便于描述流程,下文假设不存在行交换操作。

c2)针对待求逆矩阵及其伴随单位阵以基准元素所在列作为基准列,通过将各行加基准列元素自身完成对待求逆矩阵及其伴随单位阵的缩放;

待求逆矩阵及其伴随单位阵可转换为:

将基准元素所在列(基准列)的所有元素缩放为1,如果该列为0则无需处理。如公式所示,各行乘以基准列元素在伽罗华域gf(28)中的乘法逆元。例如需要先求解由于待求逆矩阵以对数形式保存,并且乘法以对数加法和指数变换实现,因此缩放也需要以对数加法进行。求解缩放元素为1时的乘法系数的对数表达,等效于求解使其对数和为0的加法参数。

又因伽罗华域gf(28)上的加法等效于异或操作,log2c11+log2c11=0,可以得出最终缩放操作转变为各行加基准列元素自身。

最终得到的待求逆矩阵及其伴随单位阵缩放后的形式为:

因为0无对数,伴随单位阵中nan表示非数值。

c3)对缩放后的矩阵及其伴随阵查指数表,生成新的矩阵及其伴随阵;

c4)针对新的矩阵及其伴随单位阵,所有非基准行减去基准行,将所在列非基准元素清零,且对新的矩阵及其伴随阵中每一个非基准行执行如下操作a-h:

a.将新的矩阵的基准行元素装入第一组neon寄存器;

b.将新的矩阵的非基准行元素装入第二组neon寄存器;

c.以异或代替减法,通过veorq_s8指令执行异或运算,结果存放在第三组neon寄存器;

d.将结果输出回矩阵;

e.将伴随阵的基准行元素装入第一组neon寄存器;

f.将伴随阵的非基准行元素装入第二组neon寄存器;

g.以异或代替减法,通过veorq_s8指令执行异或运算,结果存放在第三组neon寄存器;

h.将结果输出回伴随阵;

c5)对新的矩阵及其伴随阵进行清零操作,且将清零操作后的新的矩阵及其伴随阵查对数表,生成对数形式的新的矩阵及其伴随阵;

c6)在矩阵中基准元素是否被遍历完毕,若尚未遍历完毕,则在矩阵中遍历选择下一个基准元素,跳转执行步骤c2);否则,判定矩阵已经被转换为单位阵i,而矩阵的伴随阵变换为对数形式的逆矩阵即为解码矩阵。

此外,本实施例还提供一种arm平台下基于neon指令加速的纠删编解码装置,包括相互连接的微处理器和存储器,该微处理器被编程或配置以执行前述arm平台下基于neon指令加速的纠删编解码方法的步骤,或者该存储器中存储有被编程或配置以执行前述arm平台下基于neon指令加速的纠删编解码方法的计算机程序。

此外,本实施例还提供一种计算机可读存储介质,该计算机可读存储介质中存储有被编程或配置以执行前述arm平台下基于neon指令加速的纠删编解码方法的计算机程序。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1