何 康,黃 春,姜 浩,谷同祥,齊 進,劉 杰,3,4
(1.國防科技大學計算機學院,湖南 長沙 410073;2北京應用物理與計算數學研究所,北京 100000;3.國防科技大學并行與分布處理重點實驗室,湖南 長沙 410073;4.國防科技大學復雜系統軟件工程湖南省重點實驗室,湖南 長沙 410073)
近年來,高性能計算HPC(High Performance Computing)在國內外取得了高速發展,在科學研究、工程技術和軍事模擬等各個方面有著越來越廣泛的應用。
并行計算(Parallel Computing)是以高性能計算機為平臺,應用于科學與工程領域,使用多個中央處理單元或多臺計算機以協同工作方式解決大規模運算問題的計算模式[1]。并行計算可以加快計算速度,在更短的時間內解決相同的問題或者在相同的時間內解決更多的問題。隨著多核處理器和云計算系統的廣泛應用,并行已成為有效利用資源的首要手段。目前,國內外在高性能計算系統中最廣泛使用的并行編程接口是MPI(Message-Passing Interface)。
MPI是一種基于信息傳遞的并行編程技術,它定義了一組具有可移植性的編程接口,已成為國際上的一種并行程序標準[1]。MPICH(a high performance portable MPI implementation)是一種最重要的MPI實現。MPICH的開發與MPI規范的制定是同步進行的,每當MPI推出新版本,就會有相應的MPICH的實現版本,所以MPICH最能反映MPI的變化與發展。MPI_REDUCE是MPI中的歸約操作函數,該函數對通信子 (Communicator) 內所有進程上的數據進行歸約操作,并將計算結果保存至根進程中, 是在并行計算中經常使用的通信函數。
隨著信息化社會的飛速發展,人們對于信息處理的要求變得越來越高,計算的大規模、大尺度、長時程和高維數的特點變得越來越明顯。浮點計算的舍入誤差的累積效應,往往會導致不可信的計算結果,甚至使最終的結果失效。設計高精度的算法,是提高數值計算結果準確性和穩定性的有效途徑之一。
基于上述分析,本文基于MPICH提出了一種高精度的歸約函數MPI_ACCU_REDUCE,采用無誤差變換技術對數值計算的舍入誤差進行有效控制。該函數提供了3種高精度的歸約運算操作,提供更加豐富的計算的同時,能更進一步提高計算結果的準確性。
目前,絕大部分的計算機都支持IEEE-754(1985)[2]標準,該標準定義了二進制32位單精度(single)、64位雙精度(double)2種類型的浮點算術系統。浮點算術系統的采用使得舍入誤差不可避免,在這種超大規模的科學計算中,由于舍入誤差具有累積性,每次計算產生的極小誤差在累積起來之后,就會使計算結果失去有效性和準確性。所以,控制舍入誤差累積,提升數值算法精度成為了研究的重點。
對于如何有效地控制浮點運算中的舍入誤差,最有效的辦法就是提高浮點運算的工作精度。1991年,Goldberg[3]闡述了浮點數系統中舍入誤差、有效精度等問題對于計算機科研人員的重要性。2008年,IEEE組織考慮到舍入誤差累積的影響,對IEEE-754(1985)標準進行擴展,增加了四精度(quadruple,128 bit)浮點算術和十進制浮點算術(decimal arithmetic)等,形成了新的算術標準,簡稱IEEE-754(2008)[4],下文簡稱IEEE-754。根據實現層次的不同,高精度浮點運算的實現可以分為軟件和硬件2個層次[5]。軟件方法主要是從算法層面實現高精度運算,其靈活性要高于硬件方法。
一個標準的浮點計算模型[6]如式(1)所示:
aopb=fl(a°b)=
(a°b)(1+ε1)=(a°b)/(1+ε2),?a∈R
(1)
其中op∈ {加,減,乘,除},°∈ {+,-,×,÷},且|ε1|,|ε2|≤u。u為基本算術運算所使用的機器工作精度,又稱為單位舍入單元(unit round- off)。在IEEE-754浮點標準的單精度中μ近似等于10-8,雙精度中μ近似等于10-16。
該模型給出了浮點數基本運算的誤差界如式(2)所示:
|a°b-fl(a°b)|≤u|a°b|,
|a°b-fl(a°b)|≤u|fl(a°b)|
(2)
該過程就是由于計算機字長有限而導致計算產生舍入誤差的基本過程。此模型僅在沒有下溢情況時才成立。從模型中可以看出,n個浮點數的基本運算的向后誤差界限會隨著n的增加不斷增大。
為了進行誤差分析,本文引入2個誤差分析符號θn和γn,設n為正整數且nu<1,則有以下結論:
若εi≤u,ρi=±1,對i=1:n,且nu<1,有:
(3)
其中|θn|≤γn=nu/(1-nu)。
無誤差變換技術(Error-Free Transformation)是設計補償模式的高精度數值算法的基本思想。無誤差變換的思想是在二十世紀六七十年代由Kahan[7]和Dekker[8]提出的。
無誤差變換的思想如下所示:
設a,b是2個浮點數a,b∈F,且fl(a°b)∈F??芍獙τ诨镜倪\算,浮點數的誤差仍是一個浮點數,所以可以得到:
x=fl(a±b)?a±b=x+y,y∈F
(4)
x=fl(a·b)?a·b=x+y,y∈F
(5)
使用補償的方法對計算的結果進行改進,即使用一個巧妙設計的修正項來改善結果,這就是從浮點數(a,b)到浮點數(x,y)的無誤差變換。
算法1[8]FastTwoSum
輸入:a,b。
輸出:x,y。
步驟1x=a+b;
步驟2y=b-(x-a)
FastTwoSum是由Dekker[8]于1971年提出的,算法需要滿足|a|≥|b|的條件,共計3個浮點運算量。
算法2[9]TwoSum
輸入:a,b。
輸出:x,y。
步驟1x=a+b;
步驟2z=x-a;
步驟3y=(a-(x-z))+(b-z)。
TwoSum算法是由Knuth[9]提出的,需要6個浮點運算量。TwoSum不需要先驗條件,且在下溢發生時仍然有效。
算法3[8]Split
輸入:a。
輸出:x,y。
步驟1c=factor×a;%factor=2s+1
步驟2x=c-(c-a);
步驟3y=a-x。

算法4[8]TwoProd
輸入:a,b。
輸出:x,y。
步驟1x=a×b;
步驟2[a1,a2]=Split(a);
步驟3[b1,b2]=Split(b);
步驟4y=a2×b2-(((x-a1×b1)-a2×b1)-a1×b2)。
TwoProd算法是由Dekker[8]提出的,該算法首先通過Split算法將輸入的參數分成2部分再進行計算,需要17個浮點計算量。
當數值計算需要近似2倍工作精度時,double-double 數據格式是最有效、最常用的選擇。下面介紹double-double數據格式的數值算法,首先介紹double-double格式數的加法算法add_dd_dd,算法的輸入為2個double-double格式的數據a,b,其中ah和bh分別代表a和b的高位,al和bl分別代表a和b的低位,算法輸出為一個double-double格式的數據r,rh和rl分別代表r的高位和低位。
算法5[10]add_dd_dd
輸入:a=(ah,al),b=(bh,bl)。
輸出:r=(rh,rl)。
步驟1[sh,sl]=TwoSum(ah,bh);
步驟2[th,tl]=TwoSum(al,bl);
步驟3sl=sl+th;
步驟4[th,sl]=FastTwoSum(sh,sl);
步驟5tl=tl+sl;
步驟6[rh,rl]=FastTwoSum(th,tl)。
接下來介紹double-double格式數的乘法算法prod_dd_dd。與算法add_dd_dd類似,prod_dd_dd的輸入也為2個double-double格式的數據。
算法6[10]prod_dd_dd
輸入:a=(ah,al),b=(bh,bl)。
輸出:r=(rh,rl)。
步驟1[th,tl]=TwoProd(ah,bh);
步驟2tl=ah×bl+al×bh+tl;
步驟3[rh,rl]=FastTwoSum(th,tl)。
求和和求積運算是科學工程計算的基礎,隨著工程計算的規模越來越大,提高基本運算的準確性對于大規模工程運算具有非常重要的意義。本文以無誤差變換技術為基礎,提出了高精度的歸約函數MPI_ACCU_REDUCE,其包括求和、求積和求L2范數3種高精度歸約運算。
MPI_REDUCE是MPI中的歸約操作,對通信子(communicator)內所有進程上的數據進行歸約操作(比如求和、求極大值和邏輯與等),這個歸約操作即可以是MPI定義的操作,也可以是用戶自定義的操作[12]。
MPI_REDUCE函數定義為:
intMPI_REDUCE(void*sendbuf,void*recvbuf,intcount,MPI_Datatypedatatype,MPI_Opop,introot,MPI_Commcomm)
函數接口中的參數定義如表1所示。

Table 1 Parameter definition of MPI_REDUCE
MPI_REDUCE將組內每個進程輸入緩沖區中的數據按op操作組合起來,并將其結果返回到序列號為root的進程的輸出緩沖區中。輸入緩沖區由參數sendbuf、count和datatype定義,輸出緩沖區由參數recvbuf、count和datatype定義。兩者的元素數目和類型都相同。所有組成員都用同樣的參數count、datatype、op、root和comm來調用此例程,因此所有進程都提供長度相同、元素類型相同的輸入和輸出緩沖區。每個進程可能提供一個元素或一系列元素,組合操作針對每個元素進行。
MPI中已經定義好了一些操作,它們為函數MPI_REDUCE和其他的相關函數提供調用。這些操作對應相應的op。例如:MPI_SUM求和操作,MPI_PROD求積操作等。MPI中也提供了一種用戶自定義操作的方式:通過MPI_Op_create()函數將用戶自定義的操作和自定義的操作符綁定在一起,實現類似的調用。
MPI_Op_create函數定義如下:
intMPI_Op_create(MPI_User_function *function,intcommute,MPI_Op *op)
其中,function為用戶自定義的函數,必須具備4個參數:invec、inoutvec、len和datatype。其中invec和inoutvec分別表示將要被歸約的數據所在的緩沖區的首地址,len表示將要歸約的元素個數,datatype
表示歸約對象的數據類型。
雖然MPI中已經定義好了一些簡單的操作,然而在大規模計算中,這些操作運算結果的精度無法得到有效的保障。基于此,本文提出了具有高精度的歸約函數MPI_ACCU_REDUCE,其包含求和、求積和求L2范數3種高精度的歸約運算,提高了歸約計算的精度。
MPI_ACCU_REDUCE函數定義為:
doubleMPI_ACCU_REDUCE(void *sendbuf,void *recvbuf,intcount,intoptype,introot,MPI_Commcomm)
函數接口中的參數定義如表2所示。

Table 2 Parameter definition of MPI_ACCU_REDUCE
用戶在調用MPI_ACCU_REDUCE進行高精度歸約時,根據計算需求輸入相應的參數,MPI_ACCU_REDUCE函數會根據不同的歸約操作符調用不同的高精度運算操作,并將計算結果發送到根進程的接收消息緩沖區中。
3.3.1 高精度求和運算MPI_DDSUM
本文在第2節中介紹了基于無誤差變換技術實現的double-double格式數據的加法算法add_dd_dd。MPI_DDSUM操作便是以算法add_dd_dd為基礎實現的。
MPI_DDSUM的流程圖如圖1所示。

Figure 1 Flow chart of MPI_DDSUM圖1 MPI_DDSUM流程圖
MPI_DDSUM可以實現對一組double-double數據的高精度求和,通過算法add_dd_dd實現了自定義函數ddsum,使用用戶自定義歸約操作函數MPI_Op_create將ddsum函數和歸約操作符DDSUM聯系起來,這樣定義的操作DDSUM可以像MPI預定義的歸約操作一樣應用于各種MPI的歸約函數中。
MPI_DDSUM同樣可實現一組double數據的求和。用戶可以通過MPI_ACCU_REDUCE靜態庫提供的getDoubleDoubleNum函數將輸入的double格式的數據轉換成double-double數據。
MPI_DDSUM算法的核心實現如下所示:
…
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Type_contiguous(2,MPI_DOUBLE,&ctype);
MPI_Type_commit(&ctype);
MPI_Op_create((MPI_User_function*)ddsum,1,&DDSUM);
MPI_REDUCE(in,inout,count,ctype,DDSUM,root,comm);
MPI_Op_free(&DDSUM);
其中自定義函數ddsum()的核心實現為:
for(i=0;i< *len;i++)
{
temp=add_dd_dd(*inout,*in);
*inout=temp;
in++;
inout++;
}
自定義函數ddsum的主體是算法add_dd_dd。該算法每進行一次加法計算都要進行一次歸一化處理,即FastTwoSum操作。歸一化處理的目的是保證double-double數的高位和低位嚴格滿足一定的關系,本文對ddsum函數進行改進,提出了統一歸一化處理的算法CompDDsum。該算法在最后統一進行歸一化處理,然后補償回原結果。
接下來對統一歸一化處理的double-double數據加法算法CompDDsum進行介紹,算法的輸入是一組double-double格式的數據xi(i=1,…,n),xi.hi和xi.lo分別代表數據的高位和低位。
算法7CompDDsum
輸入:一組double-double格式的數據xi(i=1,…,n),xi=(xi.hi,xi.lo)。
輸出:res。
步驟1 fori=1:n
步驟2xi+1=TwoSum(xi.hi,xx+1.hi);
步驟3ri+1=ri+xi.lo+xi+1.lo;
步驟4 end
步驟5temp_res=rn+xn.lo;
步驟6[h,l]=FastTwoSum(xn.hi.temp_res);
步驟7res=h+l。
在自定義函數CompDDsum的基礎上實現了更加高效的MPI_CompDDsum操作。比起原始的MPI_DDSUM操作,MPI_CompDDsum在計算的最后統一進行歸一化處理,降低了計算成本的同時,幾乎沒有降低計算精度。
其中自定義函數CompDDsum的核心實現為:
for(i=0;i< *len;i++)
{
temp=two_sum(inout→hi,in→hi);
r[i] +=inout.lo+in.lo;
inout→hi=temp.hi;
in++;
inout++;
}
r[*len-1] +=inout[*len-1].lo;
inout[*len-1].lo=r[*len-1];
3.3.2 高精度求積運算MPI_DDPROD
本小節在雙精度乘法算法prod_dd_dd的基礎上實現了高精度求積操作MPI_DDPROD,并比較了普通乘法算法與高精度乘法算法prod_dd_dd的誤差界。
算法8Prod
輸入:一組double格式的數據ai(i=1,…,n)。
輸出:res。
步驟1x1=a1;
步驟2 fori=2:n
步驟3xi=xi-1×a1;
步驟4 end
步驟5res=xn。
普通的乘法運算需要n-1個浮點運算量,我們對其誤差界進行分析,其中res代表算法的輸出結果,a1a2…an為輸入數據的精確乘積,eps代表機器精度,該算法誤差界為:
|a1a2…an-res|≤γn-1|res|≤
基于算法prod_dd_dd提出了計算一組double-double數據乘積的高精度算法DDProd,算法的輸入是一組double-double格式的數據 ,ai(i=1,…,n),ai.hi和ai.lo分別代表數據的高位和低位。
算法9DDProd
輸入:一組double-double格式的數據ai(i,…,n),ai=(ai.hi,ai.lo)。
輸出:res。
步驟1 fori=2:n
步驟2ai+1=prod_dd_dd(ai,ai+1);
步驟3 end
步驟4res=an.hi+an.lo。
算法DDprod需要 25n-24 個浮點計算量。


假設在IEEE-754 標準的雙精度格式下,此時機器精度eps=2-53,若輸入數據長度n滿足n<249,則可以獲得一個完整準確的舍入結果,即算法DDprod會比算法Prod具有更高的精度。
MPI_DDPROD操作通過算法DDprod實現了用戶自定義函數ddprod,通MPI_Op_create函數將ddprod函數和DDPROD操作符聯系起來,實現了對數據的高精度求積操作。
高精度的MPI_DDPROD運算具有廣泛的應用,可用來計算三角形矩陣的行列式和求浮點數的冪等。
3.3.3 高精度求L2范數操作MPI_NORM

算法10CommonNorm
輸入:一組double格式的數據xi(i=1,…,n)。
輸出:res。
步驟1 fori=1:n
步驟2acc=acc+xi*xi;
步驟3 end
步驟4res=sqrt(acc)。
接下來介紹帶有補償方案的高精度的求L2范數算法ComNorm()。其中S和P均為double-double格式的數據,sh和ph分別代表s和p的高位,sl和pl分別代表s和p的低位,最終輸出的結果res為double格式數據。
算法11ComNorm
輸入:一組double格式的數據xi(i=1,…,n)。
輸出:res。
步驟1S=[sh,sl]=[0,0];
步驟2 fori=1:n
步驟3[ph,pl]=TwoProd(xi,xi);
步驟4[sh,sl]=add_dd_dd(sh,sl,ph,pl);
步驟5 end
步驟6res=sqrt(sh+sl)。
同理,本文通過MPI_Op_create函數實現了用戶自定義的歸約操作MPI_NORM,實現了高精度的求L2范數函數,豐富了MPI的歸約操作。
本文中的所有數值實驗都是在 IEEE-754(2008)標準雙精度下進行的,計算使用數據均為病態浮點數。其中3種高精度的歸約操作均在MPICH下使用C語言實現,數值圖表則是使用Matlab生成的。選用多精度浮點運算庫MPFR作為比較的基準。
實驗均在Ubuntu 16.04系統中進行,gcc版本為4.7,MPICH的版本為使用MPI-3標準的MPICH 3.3.2。
在測試MPI_DDSUM時,本文選擇多精度浮點運算庫MPFR中的加法來作為判斷精度是否提升的標準。通過比較MPI_DDSUM和MPI_SUM在不同病態數據量n情況下的相對誤差,判斷計算結果的準確性。相對誤差的計算方式為|res-sum|/|sum|,其中res代表算法的輸出結果,sum為精確的加法和,選取MPFR加法的計算結果作為精確的加法和sum。
ReproBLAS的求和用例中提供了一種產生正弦波數據的方式,生成的數據在進行加法運算時具有顯著的病態性,本文使用正弦波數據作為測試數據。其數據生成方式為:
sin(2 *M_PI* (rank/((double)size)-0.5))
其中,rank為進程號,size為進程總數,M_PI是C語言中標準庫定義的宏。
由圖2可以看出,MPI_SUM在病態數據量n=103時,其與MPFR加法求和結果的相對誤差已經大于1,即此時MPI_SUM的結果已經失去了準確性。而隨著病態數據量n的增大,MPI_DDSUM算法的相對誤差穩定在10-15~10-10,較小的相對誤差表明MPI_DDSUM的計算結果具有更好的準確性。由此可以得出,相比MPI_SUM求和,MPI_DDSUM求和運算提高了計算結果的準確性。

Figure 2 Relative error comparison between MPI_SUM and MPI_DDSUM under different n圖2 不同病態數據量n的情況下MPI_SUM與MPI_DDSUM相對誤差對比
本小節選擇高精度的求L2范數算法MPI_NORM與常規的求L2范數算法CommonNorm進行比較,使用多精度浮點運算庫MPFR實現精確的求L2范數的算法MPFRNorm并作為比較的標準。通過比較在不同病態數據量n下CommonNorm和MPI_NORM的相對誤差,判斷其結果的準確性。相對誤差的計算方式為|res-norm|/|norm|,其中,res代表算法的輸出結果,norm為精確的L2范數和,本文選取MPFRNorm算法的計算結果作為精確的范數和norm。
Graillat等[13]提出了一種生成多種類型隨機浮點數的方法,其大致思想為針對輸入的指數值,分別生成了值域上均勻分布的指數值和有效值,然后根據這個指數值和有效值產生浮點數值。
Graillat等[13]提供的方法可以生成多種不同特點的浮點數據,本文選擇范數逐漸向上溢出的向量和一組值極小的向量這2種類型的數據分別進行測試。
先使用一組值極小的向量進行測試,所得結果如圖3所示。

Figure 3 Relative error comparison when testing with extremely small vectors圖3 使用值極小的向量進行測試時的相對誤差比較
再使用范數逐漸向上溢出的向量進行測試,此時若求得的相對誤差大于1,則使其等于1,所得結果如圖4所示。

Figure 4 Relative error comparison when testing with vector for which the norm gradually underflows圖4 使用范數逐漸上溢的向量進行測試時的相對誤差比較
由圖3可知,當使用值極小的一組向量進行測試時,此時MPI_NORM算法的相對誤差小于CommonNorm的相對誤差,且兩者的相對誤差都小于10-12,表明此時2種算法的結果均具有準確性。隨著病態數據量n的增大,MPI_NORM和CommonNorm的相對誤差都在增大,由圖3可知,CommonNorm算法相對誤差上升的速度大于MPI_NORM算法的。
如圖4所示,當使用范數值逐漸上溢的向量進行測試時,由于此時必定發生上溢,數據極度病態,CommonNorm算法的相對誤差始終大于或等于1,表明此時該算法的結果已經失效。而隨著n的增大,MPI_NORM算法的相對誤差緩慢上升,處于10-15~10-10,表明此時MPI_NORM計算的結果仍保持準確性。由此可以得出,相比于常規的CommonNorm算法,MPI_NORM算法提高了計算精度。
本小節將對高精度歸約函數MPI_ACCU_REDUCE的性能進行測試。在不同進程規模的情況下,分別測試MPI_ACCU_REDUCE中的加法操作MPI_DDSUM和乘法操作MPI_DDPROD的運行時間,并與MPI_REDUCE的加法和乘法操作的運行時間進行比較。以MPI_REDUCE中的MPI_SUM和MPI_PROD操作的計算時間作為基準,分別求得加法和乘法計算時間開銷的比值,結果如圖5所示。

Figure 5 Calculation time ratio of the summation and quadrature algorithms under different process numbers圖5 不同進程數下的求和和求積算法的計算時間比
由圖5可知,當進程數比較小時,MPI_ACCU_REDUCE中加法操作MPI_DDSUM的計算時間是MPI_REDUCE中的加法操作MPI_SUM計算時間的103~104倍左右,乘法操作MPI_DDPROD的計算時間是MPI_PROD的104~105倍;然而隨著進程數的增加,加法和乘法時間開銷的比率均逐漸下降,最終穩定在10左右。第3節中對不同算法所需的浮點計算量進行了分析,比起普通的求積和求和操作,高精度的DDSUM和DDPROD操作需要更多的浮點計算量,高精度的求和和求積操作所需的浮點計算量比普通的求和求積操作多10倍左右。算法帶來高精度的同時也降低了計算性能,所以本文算法目前更加適用于一些對精度要求更高的場合,同時精度和速度的差異也是在將來的工作中需要改進的地方。
MPI_ACCU_REDUCE性能較低是由于該函數中的高精度運算操作需要更多的浮點運算量,同時還需要調用MPI_Op_create函數新建操作符和數據類型,所以相對于MPI_REDUCE,MPI_ACCU_REDUCE會花費更多的時間。
本文第3節對MPI_DDSUM的核心實現進行了改進,提出了統一歸一化處理的CompDDsum。以MPI_SUM計算時間為基準,對核心實現為CompDDsum的MPI_CompDDsum和核心實現為ddsum的MPI_DDSUM進行性能比較測試,分別計算兩者在相同進程數下計算時間與MPI_SUM計算時間的比率,結果如圖6所示。

Figure 6 Comparison of calculation time between MPI_DDSUM and MPI_CompDDsum under different process numbers圖6 不同進程數下MPI_DDSUM與MPI_CompDDsum計算時間對比
由圖6可知,當進程數比較小時,MPI_DDSUM和MPI_CompDDsum的計算時間均是MPI_SUM計算時間的103~104倍左右;隨著進程數的增加,MPI_DDSUM與MPI_SUM計算時間的比率逐漸穩定在10倍左右,而MPI_CompDDsum與MPI_SUM計算時間的比率逐漸穩定在7倍左右。所以,只需要改變歸一化處理方式,在最后統一進行歸一化處理,便可以在幾乎不降低精度的情況下,使計算速度有明顯的提高,這同時也表明本文算法還有一定的改進空間。
精度提升的同時,帶來了性能的下降,所以本文高精度歸約操作更適用于一些對計算速度要求較低,而對計算精度有更高要求的場景。這同樣表明,在接下來的工作中,應該想辦法對高精度的算法進行優化,使其在提高計算精度的同時,性能方面也得到很好的保障。
隨著科學計算的大規模、高維數、大尺度和長時程的特性變得越來越明顯,高精度的計算方式在未來的并行計算領域變得越來越重要。本文基于無誤差變換技術的補償算法,改進了MPICH的歸約函數MPI_REDUCE,實現了高精度的歸約函數MPI_ACCU_REDUCE,提出了3種高精度的歸約計算操作,包括求和、求積和計算L2范數。數值實驗結果表明,高精度歸約函數MPI_ACCU_REDUCE有效提高了歸約計算的精度,保證了計算結果的準確性。
高精度算法雖然帶來了計算精度的提升,然而需要更多的浮點計算量,這使得算法需要更多的計算成本。這就給我們帶來了一個新的挑戰——如何在計算精度和計算速度之間達到均衡,在不增加計算成本的情況下實現更加優秀的計算精度,這也是未來工作的主要內容。