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

技术编号:15044425 阅读:78 留言:0更新日期:2017-04-05 17:13
本发明专利技术公开了一种大整数乘法Karatsuba算法的并行实现方法,基于64位无符号长整型整数操作,通过巧妙的公式转换技巧,指针运算以及存储方式,以解决部分积存储与计算的相关性问题,通过OpenMP多线程编程,采用section任务分担策略将算法进行并行化,从而开启8个线程在递归程序的第一层并行求取8个部分积,每个section负责一个部分积的计算任务,待部分积均求取完毕后进行串行归并,从而并行化Karatsuba算法,提高算法效率。

【技术实现步骤摘要】

本专利技术涉及一种大整数乘法Karatsuba算法的并行实现方法,通过开启多个线程并行计算,提高计算机多核利用率,从而提高算法效率。
技术介绍
Karatsuba算法是当大整数数位较小时调用的重要底层大整数快速乘法算法,该算法应用非常广泛,其通过分治思想以及巧妙的运算技巧以加减运算代替部分乘法运算,降低了算法计算时间复杂度,然而该运算本身在运行时仍然具有较大空间开销和时间开销,尤其当数据达到一定规模时,其内存空间和计算时间的消耗将是巨大的。因此提高Karatsuba算法的性能尤为必要。Karatsuba算法作为重要的大整数底层乘法运算如果能够提高运行速度,整个计算的运行效率将会大大改善,在实际应用中也有着十分重要的作用。伴随着多核处理器和加速部件的普及,通过充分挖掘算法本身的并行度将算法并行化,高效地提升算法性能,已经成为一种行之有效的方法。目前Karatusba算法优化方面,TudorJebelean曾在9核paclib计算机中将算法进行3线程和9线程并行,其中基为229,与串行算法相比,3线程并行最高可达2.93倍加速,9线程最高可达7.98倍加速,该并行算法虽然有较好的性能加速,但性能平台依赖性大,数据表示能力受到限制。Karatsuba算法基于分治思想,将参与运算的乘数与被乘数进行拆分,通过运算技巧将部分乘法操作转换为加减操作,表述如下:假设乘数u、被乘数v均为2n位,拆分为两部分后分别为u1、u0和v1、v0,位数均为n,R为基,则u、v可分别表示成如(1)、(2)所示:u=u1*Rn+u0(1)v=v1*Rn+v0(2)则由公式(1)和(2)得:r=u*v=u1*v1*R2n+(u1*v0+u0*v1)Rn+u0*v0(3)由公式(3)可转化为如下公式:r=u1*v1*R2n+[u1*v1+u0*v0-(u1-u0)*(v1-v0)]Rn+u0*v0(4)基于公式(4),可将2n位的大整数乘法转换成3个n位的大整数乘法以及若干次加法和减法运算,减少单精度乘法的次数,而部分积也可采用相似的方法求解,从而提高算法执行效率。TudorJebelean所提出的并行化Karatusba算法策略虽然已经达到了很好的效果,但是其实现时基为229,数据表达能力受到限制,且受限于机器平台的核数为3或9时性能达到最优。
技术实现思路
本专利技术技术解决问题:克服现有技术的不足,提供一种大整数乘法Karatsuba算法的并行实现方法,实现基为264,将原始算法乘数与被乘数拆分为两部分改为根据计算资源拆分为相应数目的数据部分,再通过运算技巧将加减运算代替部分乘法运算以减少乘法运算次数,同时增加算法的并行度,实现了并行化。Karatsuba算法基于分治思想,将参与运算的乘数与被乘数的乘积运算拆分成3个部分积的计算,每个部分积的计算可采用相同的策略递归求取,而部分积的计算具有独立性。为了充分挖掘Karatusba算法的并行性,本专利技术基于64位无符号长整型数据操作,提供一种适用于通用多核平台的并行思路,即将原始算法乘数与被乘数拆分为两部分改为根据计算资源拆分为相应数目的数据部分,再通过运算技巧将加减运算代替部分乘法运算以减少乘法运算次数,同时增加算法的并行度,若运行平台核数较多时可通过结合在递归更深层次进行并行的方式,将算法并行化。基于本实验平台为8核平台,接下来的并行化方案阐述将基于此8核平台进行阐述。本专利技术实施实例通过解决部分积存储与计算的相关性,对Karatsuba递归实现算法采用运算技巧将原有乘数与被乘数的运算修改为8个部分积的运算,并在递归第一层进行并行,通过存储策略解决其计算时的数据相关性问题,从而保证此8个部分积计算时的独立性,通过并行编程技术实现此8个部分积的并行计算,而8个部分积更深层的递归计算仍调用已有串行算法求取,待所有部分积求取完毕,再对所得的8个部分积的结果进行串行归并。为方便阐述,设乘数u、被乘数v的位数均为w,基仍设为R,则u、v分别拆分成三个部分,u拆分成u0、u1、u2,v拆分成v0、v1、v2,其中u0、u1、v0、v1位数均为n位,u2、v2位数均为s位,n=w/3,s=w-2*(w/3),则u、v分别表示成如公式(7)、(8)所示:u=u2*R2n+u1*Rn+u0(7)v=v2*R2n+v1*Rn+v0(8)乘积r进而可表示成如下公式:r=u2*v2*R4n+[u1*v2+u2*v1]*R3n+[u1*v1+u0*v2+u2*v0]*R2n+[(u1+u0)*(v1+v0)-u1*v1-u0*v0]Rn+u0*v0(9)即转换为8个部分积的计算以及若干次大整数加减运算。KKaratsuba算法基于递归实现,其核心为部分积的计算,而根据公式(9)可知,部分积在最终乘积rp指向的数组有位数重叠,例如u0*v2、u2*v0、u1*v1三个部分积在最终结果中位数是重叠的,若将结果直接存储在乘积rp指向的数组中,进行并行计算则会出现错误。可通过申请额外的内存空间,存储第一层部分积的计算结果,即u0*v0、u1*v1、u2*v2、(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1,以解决数据相关性问题,从而在递归第一层实现部分积的并行计算,且在递归计算部分积的第一层时采用OpenMP(OpenMulti-Processing,一种开源多核并行技术)并行编程实现其并行化,而更深层次的部分积调用已有的串行程序,待所有层次的部分积均计算完毕,再对第一层已经求得的部分积结果进行串行归并,从而得到最终结果。本专利技术的技术方案包含以下方面:1)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w-2*(w/3);2)根据公式(9),在递归第一层,计算部分积u0*v0、u1*v1、u2*v2、(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算法,且u0*v0、u1*v1、u2*v2的计算结果分别存储在rp指向数组的低2*n,中2*n位,以及高2*s位,(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1的计算结果由低到高连续存储在步骤1)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其中rp为指向最终存储乘数与被乘数乘积结果数组的指针,w为乘数本文档来自技高网
...
一种大整数乘法Karatsuba算法的并行实现方法

【技术保护点】
一种大整数乘法Karatsuba算法的并行实现方法,其特征在于包括如下步骤:(1)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w‑2*(w/3);(2)根据公式(9)r=u2*v2*R4n+[u1*v2+u2*v1]*R3n+[u1*v1+u0*v2+u2*v0]*R2n+[(u1+u0)*(v1+v0)‑u1*v1‑u0*v0]Rn+u0*v0  (9)其中,u0、u1、u2分别为乘数u的低n位,中n位,高s位,v0、v1、v2被乘数v的低n位,中n位,高s位,n为位数,R为基;在递归算法第一层,计算部分积u0*v0、u1*v1、u2*v2、(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算法,u0*v0、u1*v1、u2*v2的计算结果分别存储在rp指向数组的低2*n,中2*n位,以及高2*s位,(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1的计算结果由低到高连续存储在步骤(1)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其中rp为最终存储乘数与被乘数乘积结果的数组指针,n=w/3;在递归算法第一层计算8个部分积u0*v0、u1*v1、u2*v2、(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1时,采用OpenMP并行编程section并行策略进行并行化,开启8个计算线程并行计算这8个部分积,每个线程执行一个部分积的计算过程;(3)由步骤(2)所述得到的8个部分积分别存储在数组rp以及临时数组tmp中,根据公式(9)将存储在数组rp以及临时数组tmp中的部分积进行大整数加减归并运算,并将最终结果存储在数组rp中。...

【技术特征摘要】
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+[u1*v2+u2*v1]*R3n+[u1*v1+u0*v2+u2*v0]*R2n+[(u1+u0)*(v1+v0)-u1*v1-u0*v0]Rn+u0*v0(9)
其中,u0、u1、u2分别为乘数u的低n位,中n位,高s位,v0、v1、v2被乘数v的
低n位,中n位,高s位,n为位数,R为基;
在递归算法第一层,计算部分积u0*v0、u1*v1、u2*v2、(u1+u0)*(v1+v0)、u0*v2、
u2*v0、u1*v2以及u2*v1,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算
法,u0*v0、u1*v1、u2*v2的计算结果分别存储在rp指向数组的低2*n,中2*n位,以
及高2*s位,(u1+u0)*(v1+v0)、u0*v2、u2*v0、u1*v2以及u2*v1的计算结果由低到高连
续存储在步骤(1)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其
中rp为最终存储乘数与被乘数乘积结果的数组指针,n=w/3...

【专利技术属性】
技术研发人员:蒋丽娟杜胜杨超许永超刘芳芳钟伟赵玉文申超
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1