一種基于gmp的大整數(shù)加法和減法多核并行化實(shí)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及針對GMP(TheGNU Multiple Precis1n Arithmetic Library,GNU多重精度運(yùn)算庫)庫中加法和減法串行算法的多核并行化實(shí)現(xiàn)方法。
【背景技術(shù)】
[0002]為了解決大數(shù)運(yùn)算的問題,世界各國的軟件開發(fā)人員和研宄學(xué)者都進(jìn)行了很多的研宄和實(shí)踐。近年來,越來越多的開發(fā)人員開始重視軟件工程的作用,為了減少重復(fù)勞動,提高軟件的質(zhì)量和代碼復(fù)用,許多優(yōu)秀的大數(shù)運(yùn)算庫隨之出現(xiàn)。GMP大數(shù)庫是GNU項目的一部分,誕生于1991年。作為一個任意精度的大整數(shù)運(yùn)算庫,它包括了任意精度的帶符號整數(shù)、有理數(shù)、浮點(diǎn)數(shù)的各種基本運(yùn)算操作。它是一個c語言的庫,但是官方提供了 c++的包裝類,主要的應(yīng)用方向是密碼學(xué)、網(wǎng)絡(luò)安全、代數(shù)系統(tǒng)、計算科學(xué)等。GMP庫的運(yùn)行速度非??斓?,它的官方網(wǎng)站上稱自己為地球上最快的大數(shù)庫,但是GMP庫所提供的只是數(shù)學(xué)運(yùn)算功能,并沒有密碼學(xué)相關(guān)的高級功能。另外,GMP庫目前只實(shí)現(xiàn)各種運(yùn)算的串行算法,對于多核平臺并不適用。目前還沒有人在多核平臺上做相關(guān)的并行工作。
[0003]大整數(shù)加法和減法運(yùn)算的基本思想與手工運(yùn)算進(jìn)行兩數(shù)相加或者相減的過程完全一致,就是從兩個數(shù)的最低位開始,按位逐位進(jìn)行相加或者相減操作,運(yùn)算過程中需考慮進(jìn)位和借位的問題。再者,整數(shù)可以是負(fù)數(shù),若二整數(shù)符號相同則為加法運(yùn)算,相異則實(shí)為減法運(yùn)算,若是減法運(yùn)算還需比較二數(shù)的絕對值大小,以確定最終結(jié)果的符號及減數(shù)與被減數(shù)的安排順序。加法和減法算法中逐位進(jìn)行相加或者相減操作使算法本身存在很大的數(shù)據(jù)相關(guān)性的問題。
【發(fā)明內(nèi)容】
[0004]本發(fā)明技術(shù)解決問題:克服現(xiàn)有技術(shù)的不足,提供一種基于GMP的大整數(shù)加法和減法多核并行化實(shí)現(xiàn)方法,借助多核平臺,通過充分利用多核條件提高運(yùn)行速度。
[0005]本發(fā)明技術(shù)解決方案:一種基于GMP的大整數(shù)加法和減法多核并行化實(shí)現(xiàn)方法,涉及兩個關(guān)鍵技術(shù)問題,分別是數(shù)據(jù)相關(guān)性和負(fù)載均衡。首先借助于臨時數(shù)組來解決加法或減法操作產(chǎn)生的進(jìn)位或借位帶來的數(shù)據(jù)相關(guān)性問題,然后采用將迭代循環(huán)for中的運(yùn)算進(jìn)行任務(wù)劃分,使用OpenMP多線程編程的動態(tài)調(diào)度策略,多線程并行求取各區(qū)域的計算任務(wù)的策略解決負(fù)載不均衡問題。本發(fā)明并行策略主要分為兩個過程來實(shí)現(xiàn),分別為通過多線程并行執(zhí)行“區(qū)域加法或減法”操作并存儲進(jìn)位和單線程對進(jìn)位值進(jìn)行統(tǒng)一操作兩個過程。對于多線程并行執(zhí)行“區(qū)域加法或減法”操作過程,基于OpenMP多線程編程實(shí)現(xiàn),使用動態(tài)調(diào)度策略,多線程并行求取各區(qū)域的計算任務(wù);對于利用單線程對進(jìn)位值進(jìn)行統(tǒng)一操作的過程,在遍歷臨時數(shù)組時,當(dāng)遇值為I時,本發(fā)明利用加法運(yùn)算的特殊性,從下一個區(qū)域開始到結(jié)果的最高位整個區(qū)域進(jìn)行加I操作,直到進(jìn)位不為I為止。本發(fā)明能借助多核平臺,通過充分利用多核條件提高運(yùn)行速度,在實(shí)際應(yīng)用中有著十分重要的作用。
[0006]本發(fā)明具體實(shí)現(xiàn)步驟如下:
[0007](I)獲取程序運(yùn)行系統(tǒng)目前可用線程數(shù);
[0008](2)根據(jù)步驟(I)中得到的可用線程數(shù)分配和初始化用于存儲區(qū)域進(jìn)位的臨時數(shù)組,其元素個數(shù)為N ;
[0009](3)根據(jù)步驟(I)中得到的可用線程數(shù)將需要進(jìn)行按位逐位相加操作的任務(wù)進(jìn)行區(qū)域劃分,區(qū)域中的區(qū)域任務(wù)的個數(shù)與臨時數(shù)組的個數(shù)一一對應(yīng),大于等于可用線程數(shù);
[0010](4)基于OpenMP (共享存儲并行編程)多線程編程技術(shù),使用動態(tài)調(diào)度策略,多線程并行求取各區(qū)域的計算任務(wù),率先執(zhí)行完任務(wù)的線程接著從由區(qū)域任務(wù)形成的任務(wù)池中領(lǐng)取一個區(qū)域任務(wù),各線程在求取區(qū)域任務(wù)時需判斷當(dāng)前區(qū)域任務(wù)是不是最后一個區(qū)域任務(wù),如果是最后一個區(qū)域任務(wù)需要根據(jù)具體情況調(diào)用串行加法算法,否則可以直接調(diào)用串行加法算法計算當(dāng)前區(qū)域任務(wù),然后將最后的進(jìn)位值保存到步驟(2)臨時數(shù)組中相應(yīng)的元素中,將結(jié)果存儲在結(jié)果的相應(yīng)位置;
[0011](5)對步驟(4)中已更新的臨時數(shù)組中每個區(qū)域的進(jìn)位結(jié)果進(jìn)行統(tǒng)一操作;具體過程:遍歷臨時數(shù)組中除臨時數(shù)組N-1的每一個值,如果進(jìn)位值為零,則繼續(xù)遍歷下一個,如果值為非零,則對步驟(4)得到的結(jié)果中從下一個區(qū)域結(jié)果開始到結(jié)果的最高位的整個區(qū)域進(jìn)行加I操作,且當(dāng)加I過程中新的臨時進(jìn)位不為I時,跳出此次遍歷過程;遍歷完除臨時數(shù)組N-1的每一個值后更新最高位的進(jìn)位情況。
[0012]所述步驟(2)中臨時數(shù)組的大小與區(qū)域任務(wù)的個數(shù)相等,但是與線程數(shù)并不一定相等,當(dāng)與線程數(shù)相等時,即一個線程對應(yīng)一個區(qū)域任務(wù),其實(shí)現(xiàn)過程與OpenMP技術(shù)中的靜態(tài)調(diào)度方式一樣,但區(qū)域任務(wù)號與線程號不一定按靜態(tài)調(diào)度的方式對應(yīng);另外,臨時數(shù)組O號元素的值對應(yīng)第O號任務(wù)的進(jìn)位情況,臨時數(shù)組I號元素的值對應(yīng)第I號任務(wù)的進(jìn)位情況,臨時數(shù)組2號元素的值對應(yīng)第2號任務(wù)的進(jìn)位情況,臨時數(shù)組N-1號元素的值對應(yīng)第N-1號任務(wù)的進(jìn)位情況,N為權(quán)利要求1中步驟(2)中臨時數(shù)組的大小。
[0013]所述步驟(3)中的區(qū)域任務(wù)在實(shí)現(xiàn)時,利用線程數(shù)對任務(wù)進(jìn)行區(qū)域劃分,得到的區(qū)域任務(wù)的大小不相同,大整數(shù)最高位對應(yīng)的區(qū)域任務(wù)中的相加運(yùn)算操作與其他區(qū)域任務(wù)中的相加運(yùn)算操作個數(shù)是不同的,需要進(jìn)行特殊處理;
[0014]所述的特殊處理的是把這個大整數(shù)最高位對應(yīng)的區(qū)域任務(wù)這個特殊區(qū)域任務(wù)與除特殊任務(wù)之外其他區(qū)域任務(wù)等同對待,但是每次在做前都要根據(jù)區(qū)域任務(wù)對應(yīng)的區(qū)域任務(wù)號判斷當(dāng)前線程執(zhí)行的區(qū)域是不是特殊區(qū)域任務(wù),這種方式具有if語句帶給程序的性能影響;其二是把這個特殊區(qū)域任務(wù)不作為并行區(qū)域的內(nèi)容,單獨(dú)進(jìn)行計算,即多線程并行執(zhí)行除特殊區(qū)域任務(wù)之外的其他區(qū)域任務(wù),再單線程執(zhí)行特殊區(qū)域。
[0015]所述步驟(5)中臨時數(shù)組中N-1中的值不需要進(jìn)行遍歷操作,其存儲的是大整數(shù)所有數(shù)位中最后的進(jìn)位結(jié)果,它只需對步驟(5)之后的結(jié)果進(jìn)行“或”操作,得到整個運(yùn)算中最后的進(jìn)位值或者借位值。
[0016]所述步驟(3)根據(jù)線程數(shù)將需要進(jìn)行按位逐位相加操作的任務(wù)進(jìn)行區(qū)域劃分,具體的過程:
[0017](I)根據(jù)程序運(yùn)行系統(tǒng)目前可用線程數(shù)m和需要進(jìn)行按位逐位相加操作的個數(shù)η求出每個區(qū)域任務(wù)的大小和特殊區(qū)域任務(wù)的大??;
[0018](2)聲明并初始化循環(huán)變量為0,設(shè)置循環(huán)變量的值為O到N-1,每次迭代完成循環(huán)變量乘以步驟(I)中的區(qū)域任務(wù)的大小,其得到的值即為每個區(qū)域任務(wù)的開始,完成區(qū)域劃分。
[0019]所述步驟(4)中動態(tài)調(diào)度策略在實(shí)現(xiàn)時指定size (即OpenMP動態(tài)調(diào)度任務(wù)大小參數(shù))也可以不指定size,當(dāng)不指定size時即默認(rèn)每次將一個區(qū)域任務(wù)交給每一個線程。
[0020]大整數(shù)(規(guī)模從上萬位的十進(jìn)制位到上億位的十進(jìn)制位)的加減法算法是大整數(shù)數(shù)值運(yùn)算中最基本也是最簡單的算法,其執(zhí)行時間復(fù)雜度為0(n),它是其他運(yùn)算的基礎(chǔ)內(nèi)容,經(jīng)過并行優(yōu)化后大整數(shù)的加減法可以很快速地進(jìn)行,而且也可以加快其他運(yùn)算操作的計算性能。
[0021]與串行的加法運(yùn)算相比,本發(fā)明的多核并行實(shí)現(xiàn)方法實(shí)際計算操作并沒有太大區(qū)另IJ,唯一不同的是將運(yùn)算分成兩個過程,便于多個線程并行執(zhí)行。對兩個大整數(shù)u和V的訪問次數(shù)沒有發(fā)生變化但順序具有隨機(jī)性,但是對用于存儲結(jié)果的數(shù)組的寫入操作會根據(jù)臨時數(shù)組中的有相應(yīng)的增加,然而由于臨時數(shù)組的大小跟線程數(shù)相等,所以臨時數(shù)組相對于兩個大整數(shù)來說只是一個相當(dāng)小的數(shù)組,所以對存儲結(jié)果的數(shù)組的寫入操作的增加操