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

文档序号:9887343阅读:来源:国知局
行Karatsuba算法运行结果对比柱状图。
【具体实施方式】
[0031 ]下面结合附图及具体实施步骤对本发明进行详细说明。
[0032]本发明公开一种基为264的大整数乘法Karatsuba算法的并行实现方法,基于64位无符号长整型整数操作,通过巧妙的公式转换技巧,指针运算以及存储方式,以解决部分积存储与计算的相关性问题,通过OpenMP多线程编程,采用sect1n任务分担策略将算法进行并行化,从而开启8个线程在递归程序的第一层并行求取8个部分积,每个sect1n负责一个部分积的计算任务,待部分积均求取完毕后进行串行归并,从而并行化Karatsuba算法,提高算法效率。
[0033]如图1所示,本发明具体实现如下:
[0034]I)申请长度为2*n+2的64位无符号长整型临时数组lcwab[2*n+2],其中令w为乘数和被乘数的位数,且w不一定整除3,n=w/3;
[0035]2)通过大整数加运算将乘数u低η位与中间η位相加得到uo+ui,并存储在步骤I)申请的临时数组I owab的低η+1位;
[0036]3)通过大整数加运算将被乘数V的低η位与中间η位相加得到vi+vq,并存储在步骤I)申请的临时数组的I owab数组的高η+1位;
[0037]4)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w-2*(w/3);
[0038]5)根据公式(9),在递归第一层,计算部分积11。抑。、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的计算结果由低到高连续存储在步骤4)申请的临时数组的1:11^1的2*11+2,11+8,11+8,11+8,11+8位,其中数组1:11^1存储策略如图2所示,参与运算的数据UQ、U1、U2分别为乘数u的低η位,中η位,高s位,vo、v1、V2被乘数v的低η位,中η位,高S位,可通过指针指向获取,UQ+U1以及V1+VQ由步骤I)、2)和步骤3)计算存储在数组1wab中,rp为指向最终存储乘数与被乘数乘积结果数组的指针,w为乘数与被乘数的位数,n=w/3,s=w_2*(w/3);
[0039]6)由步骤5)所述在递归算法第一层计算8个部分积UQ*VQ、U1*V1、U2*V2、(Ul+UQ)*(V1+丫0)、11()抑2、112抑()、111抑2以及112抑1时,采用(^611103并行编程86(31:;[011并行策略进行并行化,开启8个计算线程并行计算这8个部分积,每个线程执行一个部分积的计算过程,且计算结果根据步骤5)所述策略存储;
[0040]7)由步骤5)和步骤6)所述得到的8个部分积分别存储在数组rp以及临时数组tmp中,根据公式(9)将存储在数组rp以及临时数组tmp中的部分积进行大整数加减归并运算,并将最终结果存储在数组rp中;
[0041]测试结果如说明书附图中图3所示,测试平台为8核Intel Xeon 55系列处理器,CHJ主频为2.67GHz,以C语言为开发语言,Intel C++Compiler 11.I为编译器,并基于大整数运算开源库GMP5.1.3版本进行算法的正确性验证和效率测试,测试时并行Karatsuba算法为8线程,其中数据规模以64位无符号长整型数据为单位,程序运行时间单位为微秒,串行Karatsuba算法测试时间为调用大整数开源库GMP中实现库函数的运行时间。
[0042]本发明测试选取了10组大整数进行实验,每组数据为几百到上万数据单位的两个整数,为了使得实验具有一般性,所有数据均是由程序随机产生。
[0043]实验中使用本发明中提出的并行执行程序与串行Karatsuba算法在Intel的X86平台上进行实验和性能对比。
[0044]从图3中可以看出,本发明选取的10组大整数进行实验得到的加速性能图,不同数据规模下并行Karatsuba算法与串行Karatsuba算法的性能加速有所不同,其并行Karatsuba算法与串行Karatsuba算法的加速比平均可达到5.12,性能提升了很多。
[0045]提供以上实施例子仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。
[0046]提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。
【主权项】
1.一种大整数乘法Karatsuba算法的并行实现方法,其特征在于包括如下步骤: (1)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w-2*(w/3); (2)根据公式(9)r = U2*V2*R4n+ [ Ul* V2+U2*V1 ] *R3n+ [U1*V1+U0*V2+U2*V0 ] *R2n+ [ (Ul+UO)*( V1+V0)-Ul*V1-U0*V0]Rn+U0*V0 (9) 其中,UQ、U1、U2分别为乘数u的低n位,中η位,高s位,vo、v1、V2被乘数v的低η位,中η位,高S位,η为位数,R为基; 在递归算法第一层,计算部分积110抑0、111抑1、112抑2、(111+11())*(>1+¥())、UQ*V2、U2*VQ、Ul*V2以及U2*vi,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算法,uq*vq、ui*v1、112*V2的计算结果分别存储在rp指向数组的低2*n,中2*n位,以及高2*s位,(ui+uq)*(vi+vq)、uo*V2、U2*VQ、U1*V2以及U2*V1的计算结果由低到高连续存储在步骤(I)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其中rp为最终存储乘数与被乘数乘积结果的数组指针,n = w/3; 在递归算法第一层计算8个部分积110抑0、111抑1、112抑2、(111+11())*(>1+¥())、UQ*V2、U2*VQ、Ul*V2以及U2*vi时,采用OpenMP并行编程sect1n并行策略进行并行化,开启8个计算线程并行计算这8个部分积,每个线程执行一个部分积的计算过程; (3)由步骤(2)所述得到的8个部分积分别存储在数组rp以及临时数组tmp中,根据公式(9)将存储在数组rp以及临时数组tmp中的部分积进行大整数加减归并运算,并将最终结果存储在数组rp中。2.根据权利要求1所述的一种大整数乘法Karatsuba算法的并行实现方法,其特征在于:所述步骤⑵中UQ、Ul、U2和VQ、Vl、V2通过指针指向获取。3.根据权利要求1所述的一种大整数乘法Karatsuba算法的并行实现方法,其特征在于:所述步骤(2)中参与运算的uq+u1、vi+vq通过如下方式获取:申请长度为2*n+2的64位无符号长整型临时数组lowab[2*n+2],且w不一定整除3,n = w/3;通过大整数加运算将乘数u低η位与中间η位相加得至Ijuo+ui,并存储在申请的临时数组1wab的低η+1位;通过大整数加运算将被乘数V的低η位与中间η位相加得到vi+vq,并存储在申请的临时数组的1wab数组的高η+1位。
【专利摘要】本发明公开了一种大整数乘法Karatsuba算法的并行实现方法,基于64位无符号长整型整数操作,通过巧妙的公式转换技巧,指针运算以及存储方式,以解决部分积存储与计算的相关性问题,通过OpenMP多线程编程,采用section任务分担策略将算法进行并行化,从而开启8个线程在递归程序的第一层并行求取8个部分积,每个section负责一个部分积的计算任务,待部分积均求取完毕后进行串行归并,从而并行化Karatsuba算法,提高算法效率。
【IPC分类】G06F7/53
【公开号】CN105653239
【申请号】
【发明人】蒋丽娟, 杜胜, 杨超, 许永超, 刘芳芳, 钟伟, 赵玉文, 申超
【申请人】中国科学院软件研究所
【公开日】2016年6月8日
【申请日】2015年12月25日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1