一种基于gmp的大整数加法和减法多核并行化实现方法

文档序号:8380715阅读:547来源:国知局
一种基于gmp的大整数加法和减法多核并行化实现方法
【技术领域】
[0001]本发明涉及针对GMP(TheGNU Multiple Precis1n Arithmetic Library,GNU多重精度运算库)库中加法和减法串行算法的多核并行化实现方法。
【背景技术】
[0002]为了解决大数运算的问题,世界各国的软件开发人员和研宄学者都进行了很多的研宄和实践。近年来,越来越多的开发人员开始重视软件工程的作用,为了减少重复劳动,提高软件的质量和代码复用,许多优秀的大数运算库随之出现。GMP大数库是GNU项目的一部分,诞生于1991年。作为一个任意精度的大整数运算库,它包括了任意精度的带符号整数、有理数、浮点数的各种基本运算操作。它是一个c语言的库,但是官方提供了 c++的包装类,主要的应用方向是密码学、网络安全、代数系统、计算科学等。GMP库的运行速度非常快的,它的官方网站上称自己为地球上最快的大数库,但是GMP库所提供的只是数学运算功能,并没有密码学相关的高级功能。另外,GMP库目前只实现各种运算的串行算法,对于多核平台并不适用。目前还没有人在多核平台上做相关的并行工作。
[0003]大整数加法和减法运算的基本思想与手工运算进行两数相加或者相减的过程完全一致,就是从两个数的最低位开始,按位逐位进行相加或者相减操作,运算过程中需考虑进位和借位的问题。再者,整数可以是负数,若二整数符号相同则为加法运算,相异则实为减法运算,若是减法运算还需比较二数的绝对值大小,以确定最终结果的符号及减数与被减数的安排顺序。加法和减法算法中逐位进行相加或者相减操作使算法本身存在很大的数据相关性的问题。

【发明内容】

[0004]本发明技术解决问题:克服现有技术的不足,提供一种基于GMP的大整数加法和减法多核并行化实现方法,借助多核平台,通过充分利用多核条件提高运行速度。
[0005]本发明技术解决方案:一种基于GMP的大整数加法和减法多核并行化实现方法,涉及两个关键技术问题,分别是数据相关性和负载均衡。首先借助于临时数组来解决加法或减法操作产生的进位或借位带来的数据相关性问题,然后采用将迭代循环for中的运算进行任务划分,使用OpenMP多线程编程的动态调度策略,多线程并行求取各区域的计算任务的策略解决负载不均衡问题。本发明并行策略主要分为两个过程来实现,分别为通过多线程并行执行“区域加法或减法”操作并存储进位和单线程对进位值进行统一操作两个过程。对于多线程并行执行“区域加法或减法”操作过程,基于OpenMP多线程编程实现,使用动态调度策略,多线程并行求取各区域的计算任务;对于利用单线程对进位值进行统一操作的过程,在遍历临时数组时,当遇值为I时,本发明利用加法运算的特殊性,从下一个区域开始到结果的最高位整个区域进行加I操作,直到进位不为I为止。本发明能借助多核平台,通过充分利用多核条件提高运行速度,在实际应用中有着十分重要的作用。
[0006]本发明具体实现步骤如下:
[0007](I)获取程序运行系统目前可用线程数;
[0008](2)根据步骤(I)中得到的可用线程数分配和初始化用于存储区域进位的临时数组,其元素个数为N ;
[0009](3)根据步骤(I)中得到的可用线程数将需要进行按位逐位相加操作的任务进行区域划分,区域中的区域任务的个数与临时数组的个数一一对应,大于等于可用线程数;
[0010](4)基于OpenMP (共享存储并行编程)多线程编程技术,使用动态调度策略,多线程并行求取各区域的计算任务,率先执行完任务的线程接着从由区域任务形成的任务池中领取一个区域任务,各线程在求取区域任务时需判断当前区域任务是不是最后一个区域任务,如果是最后一个区域任务需要根据具体情况调用串行加法算法,否则可以直接调用串行加法算法计算当前区域任务,然后将最后的进位值保存到步骤(2)临时数组中相应的元素中,将结果存储在结果的相应位置;
[0011](5)对步骤(4)中已更新的临时数组中每个区域的进位结果进行统一操作;具体过程:遍历临时数组中除临时数组N-1的每一个值,如果进位值为零,则继续遍历下一个,如果值为非零,则对步骤(4)得到的结果中从下一个区域结果开始到结果的最高位的整个区域进行加I操作,且当加I过程中新的临时进位不为I时,跳出此次遍历过程;遍历完除临时数组N-1的每一个值后更新最高位的进位情况。
[0012]所述步骤(2)中临时数组的大小与区域任务的个数相等,但是与线程数并不一定相等,当与线程数相等时,即一个线程对应一个区域任务,其实现过程与OpenMP技术中的静态调度方式一样,但区域任务号与线程号不一定按静态调度的方式对应;另外,临时数组O号元素的值对应第O号任务的进位情况,临时数组I号元素的值对应第I号任务的进位情况,临时数组2号元素的值对应第2号任务的进位情况,临时数组N-1号元素的值对应第N-1号任务的进位情况,N为权利要求1中步骤(2)中临时数组的大小。
[0013]所述步骤(3)中的区域任务在实现时,利用线程数对任务进行区域划分,得到的区域任务的大小不相同,大整数最高位对应的区域任务中的相加运算操作与其他区域任务中的相加运算操作个数是不同的,需要进行特殊处理;
[0014]所述的特殊处理的是把这个大整数最高位对应的区域任务这个特殊区域任务与除特殊任务之外其他区域任务等同对待,但是每次在做前都要根据区域任务对应的区域任务号判断当前线程执行的区域是不是特殊区域任务,这种方式具有if语句带给程序的性能影响;其二是把这个特殊区域任务不作为并行区域的内容,单独进行计算,即多线程并行执行除特殊区域任务之外的其他区域任务,再单线程执行特殊区域。
[0015]所述步骤(5)中临时数组中N-1中的值不需要进行遍历操作,其存储的是大整数所有数位中最后的进位结果,它只需对步骤(5)之后的结果进行“或”操作,得到整个运算中最后的进位值或者借位值。
[0016]所述步骤(3)根据线程数将需要进行按位逐位相加操作的任务进行区域划分,具体的过程:
[0017](I)根据程序运行系统目前可用线程数m和需要进行按位逐位相加操作的个数η求出每个区域任务的大小和特殊区域任务的大小;
[0018](2)声明并初始化循环变量为0,设置循环变量的值为O到N-1,每次迭代完成循环变量乘以步骤(I)中的区域任务的大小,其得到的值即为每个区域任务的开始,完成区域划分。
[0019]所述步骤(4)中动态调度策略在实现时指定size (即OpenMP动态调度任务大小参数)也可以不指定size,当不指定size时即默认每次将一个区域任务交给每一个线程。
[0020]大整数(规模从上万位的十进制位到上亿位的十进制位)的加减法算法是大整数数值运算中最基本也是最简单的算法,其执行时间复杂度为0(n),它是其他运算的基础内容,经过并行优化后大整数的加减法可以很快速地进行,而且也可以加快其他运算操作的计算性能。
[0021]与串行的加法运算相比,本发明的多核并行实现方法实际计算操作并没有太大区另IJ,唯一不同的是将运算分成两个过程,便于多个线程并行执行。对两个大整数u和V的访问次数没有发生变化但顺序具有随机性,但是对用于存储结果的数组的写入操作会根据临时数组中的有相应的增加,然而由于临时数组的大小跟线程数相等,所以临时数组相对于两个大整数来说只是一个相当小的数组,所以对存储结果的数组的写入操作的增加操
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1