一种大整数乘法Karatsuba算法的并行实现方法

文档序号:9887343阅读:1254来源:国知局
一种大整数乘法Karatsuba算法的并行实现方法
【技术领域】
[0001 ]本发明涉及一种大整数乘法Karatsuba算法的并行实现方法,通过开启多个线程并行计算,提尚计算机多核利用率,从而提尚算法效率。
【背景技术】
[0002]Karatsuba算法是当大整数数位较小时调用的重要底层大整数快速乘法算法,该算法应用非常广泛,其通过分治思想以及巧妙的运算技巧以加减运算代替部分乘法运算,降低了算法计算时间复杂度,然而该运算本身在运行时仍然具有较大空间开销和时间开销,尤其当数据达到一定规模时,其内存空间和计算时间的消耗将是巨大的。因此提高Karatsuba算法的性能尤为必要。Karatsuba算法作为重要的大整数底层乘法运算如果能够提高运行速度,整个计算的运行效率将会大大改善,在实际应用中也有着十分重要的作用。
[0003]伴随着多核处理器和加速部件的普及,通过充分挖掘算法本身的并行度将算法并行化,高效地提升算法性能,已经成为一种行之有效的方法。目前Karatusba算法优化方面,Tudor Jebelean曾在9核paclib计算机中将算法进行3线程和9线程并行,其中基为229,与串行算法相比,3线程并行最高可达2.93倍加速,9线程最高可达7.98倍加速,该并行算法虽然有较好的性能加速,但性能平台依赖性大,数据表示能力受到限制。
[0004]Karatsuba算法基于分治思想,将参与运算的乘数与被乘数进行拆分,通过运算技巧将部分乘法操作转换为加减操作,表述如下:假设乘数U、被乘数V均为2n位,拆分为两部分后分别为m、uQ和V1、VQ,位数均为n,R为基,则u、vS:分别表示成如(1)、(2)所示:
[0005]u = ui*Rn+uo (I)
[0006]v = vi*Rn+vo (2)
[0007]则由公式(I)和(2)得:
[0008]r = u*v = ui*vi*R2n+(ui*vo+U()*vi)Rn+U()*vo (3)
[0009]由公式(3)可转化为如下公式:
[0010]r = ui*vi*R2n+ [ ui*vi+uo*vo- (ui~uo) * (νι~νο) ] Rn+uo*vo (4)
[0011]基于公式(4),可将2n位的大整数乘法转换成3个n位的大整数乘法以及若干次加法和减法运算,减少单精度乘法的次数,而部分积也可采用相似的方法求解,从而提高算法执行效率。
[0012]Tudor Jebelean所提出的并行化Karatusba算法策略虽然已经达到了很好的效果,但是其实现时基为229,数据表达能力受到限制,且受限于机器平台的核数为3或9时性能达到最优。

【发明内容】

[0013]本发明技术解决问题:克服现有技术的不足,提供一种大整数乘法Karatsuba算法的并行实现方法,实现基为264,将原始算法乘数与被乘数拆分为两部分改为根据计算资源拆分为相应数目的数据部分,再通过运算技巧将加减运算代替部分乘法运算以减少乘法运算次数,同时增加算法的并行度,实现了并行化。
[0014]Karatsuba算法基于分治思想,将参与运算的乘数与被乘数的乘积运算拆分成3个部分积的计算,每个部分积的计算可采用相同的策略递归求取,而部分积的计算具有独立性。为了充分挖掘Karatusba算法的并行性,本发明基于64位无符号长整型数据操作,提供一种适用于通用多核平台的并行思路,即将原始算法乘数与被乘数拆分为两部分改为根据计算资源拆分为相应数目的数据部分,再通过运算技巧将加减运算代替部分乘法运算以减少乘法运算次数,同时增加算法的并行度,若运行平台核数较多时可通过结合在递归更深层次进行并行的方式,将算法并行化。基于本实验平台为8核平台,接下来的并行化方案阐述将基于此8核平台进行阐述。本发明实施实例通过解决部分积存储与计算的相关性,对Karatsuba递归实现算法采用运算技巧将原有乘数与被乘数的运算修改为8个部分积的运算,并在递归第一层进行并行,通过存储策略解决其计算时的数据相关性问题,从而保证此8个部分积计算时的独立性,通过并行编程技术实现此8个部分积的并行计算,而8个部分积更深层的递归计算仍调用已有串行算法求取,待所有部分积求取完毕,再对所得的8个部分积的结果进行串行归并。
[0015]为方便阐述,设乘数U、被乘数V的位数均为W,基仍设为R,则u、v分别拆分成三个部分^拆分成110、111、112,¥拆分成¥()、¥1、¥2,其中11()、111、¥()、¥1位数均为11位,112、¥2位数均为3位,11=w/3,s=w-2*(w/3),贝lju、v分别表示成如公式(7)、(8)所示:
[0016]u = U2*R2n+ui*Rn+uo (7)
[0017]V = V2*R2n+vi*Rn+vo (8)
[0018]乘积r进而可表示成如下公式:
[0019]r = U2*V2*R4n+ [ Ul*V2+U2*Vl ] *R3n+ [U1*V1+U0*V2+U2*V0 ] *R2n
[0020]+ [ (ui+uo) * (vi+vo) -ui*v1-uo*vo ] Rn+uo*vo (9)
[0021]即转换为8个部分积的计算以及若干次大整数加减运算。KKaratsuba算法基于递归实现,其核心为部分积的计算,而根据公式(9)可知,部分积在最终乘积rp指向的数组有位数重叠,例如UQ*V2、U2*VQ、U1*V1三个部分积在最终结果中位数是重叠的,若将结果直接存储在乘积rp指向的数组中,进行并行计算则会出现错误。可通过申请额外的内存空间,存储第一层部分积的计算结果,即 U0*V0、U1*V1、U2*V2、(U1+U0)*(V1+V。)、U0*V2、U2*V0、Ul*V2 以及U2*V1,以解决数据相关性问题,从而在递归第一层实现部分积的并行计算,且在递归计算部分积的第一层时采用0penMP(0pen Mult1-Processing,一种开源多核并行技术)并行编程实现其并行化,而更深层次的部分积调用已有的串行程序,待所有层次的部分积均计算完毕,再对第一层已经求得的部分积结果进行串行归并,从而得到最终结果。
[0022]本发明的技术方案包含以下方面:
[0023]I)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w-2*(w/3);
[0024]2)根据公式(9),在递归第一层,计算部分积110抑0、111抑1、112抑2、(111+11())*(>1+¥0)、uo*V2、U2*VQ、U1*V2以及U2*vi,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算法,且110抑0、111抑1、112抑2的计算结果分别存储在印指向数组的低2*11,中2*11位,以及高2*8位,(Ul+UQ)*(V1+VQ)、UQ*V2、U2*VQ、U1*V2以及U2*V1的计算结果由低到高连续存储在步骤I)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其中rp为指向最终存储乘数与被乘数乘积结果数组的指针,W为乘数与被乘数的位数,n=w/3,s = W-2*(W/3),数组tmp中存储策略如图2所示;
[0025]所述在递归算法第一层计算8个部分积UQ*VQ、U1*V1、U2*V2、(Ul+UQ)*(V1+VQ)、UQ*V2、U2*VQ、U1*V2以及U2*vi时,采用OpenMP并行编程sect1n并行策略进行并行化,开启8个计算线程并行计算这8个部分积,每个线程执行一个部分积的计算过程;3)由步骤2)所述得到的8个部分积分别存储在数组rp以及临时数组tmp中,根据公式(9)将存储在数组rp以及临时数组tmp中的部分积进行大整数加减归并运算,并将最终结果存储在数组rp中。
[0026]本发明的有益效果:本发明通过巧妙地将乘数与被乘数进行拆分,并通过运算技巧将计算乘积的公式转化为8个部分积的计算,通过申请临时数组以及相应的存储策略,解决并行计算时的数据相关性问题,通过8线程并行计算,显著提高算法效率。
[0027]与上述Tudor Jebelean所提出的并行化Karatsuba算法策略相比,本发明在算法第一层实现8线程并行计算,较好地适应于8核计算平台,且具有较强的数据表达能力。
【附图说明】
[0028]图1为本发明的Karatsuba算法并行策略的示意图;
[0029]图2为在计算8个部分积时临时数组tmp的存储策略示意图;
[°03°] 图3为串行Karatsuba算法与本发明并
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1