发明名称 一种大整数乘法Karatsuba算法的并行实现方法
摘要 本发明公开了一种大整数乘法Karatsuba算法的并行实现方法,基于64位无符号长整型整数操作,通过巧妙的公式转换技巧,指针运算以及存储方式,以解决部分积存储与计算的相关性问题,通过OpenMP多线程编程,采用section任务分担策略将算法进行并行化,从而开启8个线程在递归程序的第一层并行求取8个部分积,每个section负责一个部分积的计算任务,待部分积均求取完毕后进行串行归并,从而并行化Karatsuba算法,提高算法效率。
申请公布号 CN105653239A 申请公布日期 2016.06.08
申请号 CN201510996000.6 申请日期 2015.12.25
申请人 中国科学院软件研究所 发明人 蒋丽娟;杜胜;杨超;许永超;刘芳芳;钟伟;赵玉文;申超
分类号 G06F7/53(2006.01)I 主分类号 G06F7/53(2006.01)I
代理机构 北京科迪生专利代理有限责任公司 11251 代理人 成金玉;孟卜娟
主权项 一种大整数乘法Karatsuba算法的并行实现方法,其特征在于包括如下步骤:(1)申请长度为N的64位无符号长整型临时数组tmp[N],数组长度N=3*w+s+2,其中w为乘数与被乘数的位数,其不一定被3整除,且s=w‑2*(w/3);(2)根据公式(9)r=u<sub>2</sub>*v<sub>2</sub>*R<sup>4n</sup>+[u<sub>1</sub>*v<sub>2</sub>+u<sub>2</sub>*v<sub>1</sub>]*R<sup>3n</sup>+[u<sub>1</sub>*v<sub>1</sub>+u<sub>0</sub>*v<sub>2</sub>+u<sub>2</sub>*v<sub>0</sub>]*R<sup>2n</sup>+[(u<sub>1</sub>+u<sub>0</sub>)*(v<sub>1</sub>+v<sub>0</sub>)‑u<sub>1</sub>*v<sub>1</sub>‑u<sub>0</sub>*v<sub>0</sub>]R<sub>n</sub>+u<sub>0</sub>*v<sub>0</sub>  (9)其中,u<sub>0</sub>、u<sub>1</sub>、u<sub>2</sub>分别为乘数u的低n位,中n位,高s位,v<sub>0</sub>、v<sub>1</sub>、v<sub>2</sub>被乘数v的低n位,中n位,高s位,n为位数,R为基;在递归算法第一层,计算部分积u<sub>0</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>1</sub>、u<sub>2</sub>*v<sub>2</sub>、(u<sub>1</sub>+u<sub>0</sub>)*(v<sub>1</sub>+v<sub>0</sub>)、u<sub>0</sub>*v<sub>2</sub>、u<sub>2</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>2</sub>以及u<sub>2</sub>*v<sub>1</sub>,且在求此8个部分积时,仍然调用原始串行递归Karatsuba算法,u<sub>0</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>1</sub>、u<sub>2</sub>*v<sub>2</sub>的计算结果分别存储在rp指向数组的低2*n,中2*n位,以及高2*s位,(u<sub>1</sub>+u<sub>0</sub>)*(v<sub>1</sub>+v<sub>0</sub>)、u<sub>0</sub>*v<sub>2</sub>、u<sub>2</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>2</sub>以及u<sub>2</sub>*v<sub>1</sub>的计算结果由低到高连续存储在步骤(1)申请的临时数组的tmp的2*n+2,n+s,n+s,n+s,n+s位,其中rp为最终存储乘数与被乘数乘积结果的数组指针,n=w/3;在递归算法第一层计算8个部分积u<sub>0</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>1</sub>、u<sub>2</sub>*v<sub>2</sub>、(u<sub>1</sub>+u<sub>0</sub>)*(v<sub>1</sub>+v<sub>0</sub>)、u<sub>0</sub>*v<sub>2</sub>、u<sub>2</sub>*v<sub>0</sub>、u<sub>1</sub>*v<sub>2</sub>以及u<sub>2</sub>*v<sub>1</sub>时,采用OpenMP并行编程section并行策略进行并行化,开启8个计算线程并行计算这8个部分积,每个线程执行一个部分积的计算过程;(3)由步骤(2)所述得到的8个部分积分别存储在数组rp以及临时数组tmp中,根据公式(9)将存储在数组rp以及临时数组tmp中的部分积进行大整数加减归并运算,并将最终结果存储在数组rp中。
地址 100190 北京市海淀区中关村南四街4号