主权项 |
一种大整数乘法Comba算法基于OpenMP的并行实现方法,其特征在于包括如下步骤:(1)申请三个长度为rn的64位无符号长整型数组,分别由指针lpl,hpl,cl指向,即数组lpl[rn],cl[rn]以及hpl[rn],其中rn=un+vn,un和vn可能不等,un和vn分别为乘数和被乘数的位数;(2)循环计算乘积的中间结果,缓存在步骤(1)申请的三个数组中,其中中间结果的每一位根据公式<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><mrow><mo>(</mo><mi>lpl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>,</mo><mi>cl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>,</mo><mi>hpl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>)</mo></mrow><mo>=</mo><munder><mi>Σ</mi><mrow><mi>iu</mi><mo>+</mo><mi>iv</mi><mo>=</mo><mi>ir</mi></mrow></munder><msub><mi>up</mi><mi>iu</mi></msub><mo>*</mo><msub><mi>vp</mi><mi>iv</mi></msub><mrow><mo>(</mo><mn>0</mn><mo>≤</mo><mi>ir</mi><mo><</mo><mi>rn</mi><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000710511970000011.GIF" wi="1000" he="115" /></maths>计算,lpl[ir],cl[ir]和hpl[ir]分别存储中间结果第ir位的低64位,中间64位以及高64位,其中up<sub>iu</sub>和vp<sub>iv</sub>分别表示乘数u的第iu位和被乘数v第iv位;(3)获取程序运行系统目前可用线程数;(4)由步骤(2)所述<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mrow><mo>(</mo><mi>lpl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>,</mo><mi>cl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>,</mo><mi>hpl</mi><mo>[</mo><mi>ir</mi><mo>]</mo><mo>)</mo></mrow><mo>=</mo><munder><mi>Σ</mi><mrow><mi>iu</mi><mo>+</mo><mi>iv</mi><mo>=</mo><mi>ir</mi></mrow></munder><msub><mi>up</mi><mi>iu</mi></msub><mo>*</mo><mi>v</mi><msub><mi>p</mi><mi>iv</mi></msub><mrow><mo>(</mo><mn>0</mn><mo>≤</mo><mi>ir</mi><mo><</mo><mi>rn</mi><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000710511970000012.GIF" wi="1004" he="112" /></maths>的循环计算过程采用OpenMP的for任务分担策略进行并行化,将中间结果的数位计算任务采用动态调度策略分配给可用线程数个计算线程并行计算,并将线程计算所得中间结果对应存储在步骤(1)所申请的数组lpl[rn],cl[rn]以及hpl[rn]中;(5)对步骤(4)所得lpl[rn],cl[rn]以及hpl[rn]三个数组中存储的中间结果通过串行进位将最终结果存入rp[rn]数组中,其中rp[rn]为存储最终乘积的数组。 |