專利名稱:一種復數(shù)矩陣的優(yōu)化方法
技術領域:
本發(fā)明屬于計算機程序優(yōu)化方法技術領域,具體涉及中函數(shù)優(yōu)化設計復數(shù)矩陣函數(shù)的優(yōu)化方法。
背景技術:
隨著大規(guī)模數(shù)學計算在科學、工程、金融等領域的廣泛應用,常用數(shù)學庫基礎線性代數(shù)程序集(BLAS)已成為各種系統(tǒng)軟件必需的矩陣運算工具。另外,對高性能計算進行評價的重要測試線性系統(tǒng)軟件包(LINPACK)正是基于基礎線性代數(shù)程序(BLAS)庫進行測試,因此,在不同平臺上對基礎線性代數(shù)程序(BLAS)庫的優(yōu)化是非常重要的。龍芯3A是中國科學院計算技術研究所研制的首款國產(chǎn)四核高性能處理器,采用65nm工藝制造,最高工作主頻為IGHz,該芯片內(nèi)集成了四個64位的四發(fā)射超標量GS464高性能處理器核,每個處理 器核包含64KB的一級數(shù)據(jù)緩存(cache)和64KB指令緩存,芯片內(nèi)集成四核共享的4MB 二級Cache,采用128位接口的交叉開關網(wǎng)絡(AXI )。其浮點性能的好壞與BLAS庫的性能密切相關。而BLAS庫中約一半的函數(shù)是復數(shù)浮點運算函數(shù),因此,對復數(shù)矩陣運算進行優(yōu)化十分必要。以往的類似優(yōu)化都是針對通用矩陣或特定的其他處理器平臺進行優(yōu)化?;A線性代數(shù)程序(BLAS)庫本身并沒有為復數(shù)設計單獨的數(shù)據(jù)結構來完成庫函數(shù)的運算,導致針對復數(shù)的運算規(guī)模較大,整體效率較低,從而運行開銷較大。
發(fā)明內(nèi)容
本發(fā)明的目的是提出一種復數(shù)矩陣的優(yōu)化方法,以克服已有通用的整塊進行計算和固定分塊大小的計算方法在龍芯上運行時整體效率較低而導致運行開銷大的問題。本發(fā)明在龍芯上的復數(shù)矩陣的優(yōu)化方法,其特征在于操作步驟如下第一步利用展開粒度公式KaKb/ (KA+KB)=m/n計算最優(yōu)取數(shù)比,其中Ka和KB分別為矩陣A和矩陣B的展開粒度,m/n為最優(yōu)運算取數(shù)比,令兩個矩陣展開粒度的乘積除以兩個矩陣的展開粒度之和所得的值與最優(yōu)取數(shù)比相同,在龍芯上調(diào)整兩個矩陣的展開粒度KA和KB,使得在循環(huán)結構中保證矩陣A和矩陣B的運算取數(shù)比m : n為2 : 1,則所得的展開粒度即為在運算中一次循環(huán)需要展開的運算次數(shù);第二步在矩陣運算時,對于矩陣內(nèi)數(shù)據(jù)大于500的大規(guī)模矩陣計算,對每一分塊進行運算時在循環(huán)中采用4X4的展開,每個展開的運算對應龍芯的一個發(fā)射槽,通過發(fā)射槽發(fā)射運算指令給龍芯運算器進行乘加運算;根據(jù)矩陣分塊公式24X (nb)2 ( NK,其中NK為龍芯的一級數(shù)據(jù)緩存(cache)的大小,將矩陣分塊大小nb選取為一個小于52并使得24乘以矩陣分塊大小nb的平方(nb) 2小于龍芯處理器一級數(shù)據(jù)緩存64千字節(jié)(kb)的最大的值,得到在龍芯上最優(yōu)的理想矩陣分塊大小;第三步對于在復數(shù)矩陣運算中出現(xiàn)的普通復數(shù)乘加運算,利用復數(shù)經(jīng)典算法中兩個復數(shù)之間的乘法算法,設第一復數(shù)為A=x+yi,第二復數(shù)為B=m+ni,第三復數(shù)為C=p+qi,計算第一復數(shù)A乘以第二復數(shù)B后再加第三復數(shù)C的值,將此值賦給第三復數(shù)作為第三復數(shù)的新值,算法流程如下計算第一復數(shù)A的實部X乘以第二復數(shù)B的實部m的值為第一實數(shù)e (e — xXm),計算第一復數(shù)A的虛部y乘以第二復數(shù)B的虛部n的值為第二實數(shù)f(f-yXn),計算第三復數(shù)C的實部p加第一實數(shù)e后減去第二實數(shù)f的值,并將此值付給第三復數(shù)C的實部p(p — p+e-f),計算第一復數(shù)A的實部X加第一復數(shù)A的虛部y的值為第三實數(shù)k (k — x+y),計算第二復數(shù)B的實部m加第二復數(shù)B的虛部n的值為第四實數(shù)t(t — m+n),計算第三復數(shù)C的虛部q加第三實數(shù)k乘以第四實數(shù)t的積再減去第一實數(shù)e和第二實數(shù)f的值,并將此值付給第三實數(shù)k的虛部q(q — q+kXt-e-f),則得到第三復數(shù)C的新值,通過龍芯發(fā)射槽傳給運算器參與分塊矩陣的運算。由于現(xiàn)有技術采取的是直接將矩陣全部帶入進行計算,或利用通用的固定分塊方法進行計算,若在龍芯上用現(xiàn)有技術進行優(yōu)化運算,就會產(chǎn)生問題規(guī)模較大、整體效率較低而導致運行開銷大的問題。而本發(fā)明的復數(shù)矩陣的優(yōu)化方法,是針對龍芯3A的四發(fā)射體系結構和特定的一級數(shù)據(jù)緩存大小進行的優(yōu)化,通過計算特定的展開粒度,對復數(shù)矩陣進行四乘四循環(huán)展開,特定大小分塊,并對復數(shù)矩陣運算中的普通復數(shù)乘加運算利用復數(shù)經(jīng)典算法減小了運行規(guī)模,進而使得復數(shù)矩陣乘法運算在龍芯3A上的計算性能提高了大約50%,而由于在BLAS庫中約一半的函數(shù)是復數(shù)矩陣浮點運算函數(shù),因此采用本發(fā)明復數(shù)矩 陣的優(yōu)化方法可使BLAS庫在龍芯3A上的運算速度達到原來的2. 5倍以上。提高了整體運算效率。
圖I是在龍芯上改變使用不同分塊大小后常用數(shù)學庫基礎線性代數(shù)程序集(BLAS)中一個名為zGEMM的廣義矩陣相乘的函數(shù)的性能測試比較的矩陣分塊性能圖。圖2為采用本發(fā)明復數(shù)矩陣的優(yōu)化方法在龍芯處理器上的優(yōu)化效果仿真圖。
具體實施例方式實施例I :本發(fā)明在龍芯上的復數(shù)矩陣的優(yōu)化方法實施例的具體操作步驟如下I、循環(huán)展開和指令調(diào)度常用數(shù)學庫基礎線性代數(shù)程序集(BLAS)中的三級BLAS的循環(huán)展開一般指的是矩陣分塊后,塊狀矩陣做乘法運算時的展開粒度,側重考慮循環(huán)展開和指令調(diào)度之間的關系。由于龍芯四發(fā)射的特性每個周期發(fā)射一條取數(shù)指令,兩條浮點指令,一條定點指令,為了盡可能縮短程序運行的周期,就要在循環(huán)結構中保證運算取數(shù)比為2 :1,設兩個矩陣第一矩陣A和第二矩陣B的展開粒度分別為KA和KB,指令調(diào)度時就需要滿足KA KB/ (KA+KB) =2,且KA和KB為小于矩陣分塊大小的正整數(shù)。在該范圍內(nèi)很容易窮舉出只有(4,4)和(3,6 )組合,在展開度相差不大的情況下,可讀性更強、訪存一致性更好的四乘四展開就是最優(yōu)的選擇。2、矩陣分塊大規(guī)模計算時,為了有效減少龍芯處理器的一級數(shù)據(jù)緩存Cache的失效,會使用矩陣分塊技術,對矩陣進行合理分塊,分塊大小對浮點運算性能的影響很大,實驗表明,每次參與運算的矩陣塊大小保證在龍芯一級數(shù)據(jù)緩存Cache以內(nèi)為最優(yōu)。設矩陣分塊大小為nb,zGEMM在塊內(nèi)實現(xiàn)的是兩個矩陣分塊大小nbXnb的乘法,另外由于每次還要保存一個中間累加的結果,故參與運算的數(shù)據(jù)大小為3X8XnbXnb=24XnbXnb個字節(jié)bytes,龍芯處理器的一級數(shù)據(jù)緩存cache大小為64KB,為了保證不會產(chǎn)生容量失效,需要保證24XnbXnb不大于64K,同時由于4路組相聯(lián)映射本身會有自沖突失效的可能性,nb的選取應該比計算得到的值要小。此外若矩陣分塊大小nb太小的話,浮點性能峰值會很低,因為過多的分塊會造成訪存次數(shù)的增多和分支轉移預測成功率的下降,不能充分發(fā)揮多級浮點指令流水線的性能,龍芯處理器上zGEMM優(yōu)化用的是四乘四循環(huán)展開,當24nbXnb<64K且nb為4倍數(shù)時nb=52,所以實際應用中矩陣分塊大小nb選擇的是一個小于52且足夠大的值。圖I是在龍芯上改變使用不同分塊大小后常用數(shù)學庫基礎線性代數(shù)程序集(BLAS)中一個廣義矩陣相乘的函數(shù)zGEMM的性能測試比較的矩陣分塊性能圖。由圖I可見最上面的曲線48表示矩陣分塊大小nb =48時的運算速度,此時的性能最高,然后依次次是矩陣分塊大小為56和40的表示運算速度的曲線,矩陣分塊大小為36時的運算速度的曲線在最下面,表示其性能最差。由圖I中的曲線說明了矩陣分塊大小為48是zGEMM—個比較好的分塊大小,這和理論分析的結果比較吻合。在優(yōu)化方法一定的情況下,它在訪存次數(shù)過多和容量失效之間尋找到了一個有效的平衡點。利用數(shù)據(jù)存儲的連續(xù)性和局部性對矩陣乘法中的矩陣進行合理劃分與合并,減少龍芯一級數(shù)據(jù)緩存cache訪問次數(shù),降低了計算的規(guī)模,從而大幅提高了 BLAS庫復數(shù)運算在龍芯3A上的運算效率。3、運算訪存比三級BLAS優(yōu)化過程中也需要充分考慮運算訪存比的影響,在使用循環(huán)展開、指令調(diào)度和矩陣分塊后,矩陣分塊大小nbXnb的基本塊實現(xiàn)時,每一輪內(nèi)循環(huán)完成對結果矩陣C的4X4矩陣塊的更新,4X4小矩陣塊更新過程中涉及到的訪存量分別為Ma=4Xnb,Mb=4Xnb, Mc=4X4X2, Mabc=8Xnb+32 ;涉及到的運算量為使用乘加指令后I=16Xnb次乘加,龍芯處理器每個周期cycle可以同時發(fā)射一條訪存指令,兩條浮點指令,因此不考慮其它因素時,每一輪更新的4X4小矩陣塊的訪存的周期數(shù)為Mabc,浮點操作的周期數(shù)為1/2,理論上的效率可以達到Mabc/(I/2)=l+4/nb,由此可見分塊過大的話也會降低運算訪存比,分塊大小要使得運算訪存比適中。利用數(shù)據(jù)的局部性對復數(shù)運算進行上層合并以減少訪龍芯一級數(shù)據(jù)緩存cache次數(shù),進而大大提高了復數(shù)乘法運算在龍芯3A上的計算性倉泛。4、復數(shù)乘法優(yōu)化由于矩陣分塊的存在,zGEMM完成規(guī)模為N方陣運算時,要進行個分塊矩陣
nb
乘法和4^丨個分塊矩陣加法的操作,也就是說塊內(nèi)實現(xiàn)的是規(guī)模為矩陣分塊大小nb的4乘4加的矩陣運算。三級BLAS函數(shù)完成矩陣和矩陣的運算,數(shù)據(jù)的運算量是0(n3)量級。在處理大規(guī)模矩陣計算時CPU時鐘周期更多消耗在浮點計算中,故屬于浮點計算密集型函數(shù),它性能提升的空間很大,如何更高效地開發(fā)處理器浮點運算潛能,是該類函數(shù)的優(yōu)化目標。三級BLAS復數(shù)運算函數(shù)由于運算量非常大,一般是實數(shù)運算函數(shù)的4倍,為了避免更多的訪存失效,BLAS會對輸入的復數(shù)矩陣進行實部和虛部的分離,然后再調(diào)用同類型的實數(shù)運算函數(shù)來完成分離后矩陣間的運算,最后再將計算結果整合在一起。復數(shù)分離后的實部和虛部矩陣是連續(xù)存儲的,利用數(shù)據(jù)的局部性可以對復數(shù)運算進行上層合并從而減少訪cache次數(shù),這樣運算取數(shù)比從2 :1可以增加到2. 4 :1,理論上有一定性能的提升。然而實測發(fā)現(xiàn),對于三級BLAS,僅僅通過改變運算訪存比性能提升空間還是有限的(僅為5%左右),優(yōu)化需要從運算本身考慮。復數(shù)經(jīng)典算法是針對兩個復數(shù)之間的乘法,設復數(shù)A=x+yi, B=m+ni, C=p+qi,計算新的C的值為AXB+C,計算X乘以m的值e (e — xXm),計算y乘以n的值f (f — yXn),計算P加e后減f的值,并將此值付給p (P — P+e-f),計算X加y的值k (k — x+y),計算m加n的值t (t — m+n),計算q力卩k乘以t的積再減去e減去f的值,并將此值付給q(q — q+kXt-e-f),則得到新的C的值。這種算法可以將4乘4加個浮點操作轉化成3乘7加。由于BLAS矩陣分塊的特性,可以考慮將該算法用在塊狀矩陣的運算中,這樣塊內(nèi)4X(nb) 3+4X (nb) 2個浮點運算就轉化為3X (nb)3+7X (nb) 2個,不考慮訪cache的影響,當3X (nb)3+7X (nb)2〈4X (nb)3+4X (nb)2即nb>3時,整體運算規(guī)模就會減小從而性 能會有一定的提升,由于算法的改變,在分塊大小不變的前提下,理論上性能提升比應該為,lb ~3 XlOO O(I)
4 X nh + 4由公式(I)可見,矩陣分塊大小nb值越大,性能提升越多,且比值接近25%。當nb=48時提升比例接近23%時,其中每次計算會使用4X (nb)2個臨時存儲空間,該存儲區(qū)可以在下一個分塊時被循環(huán)反復使用,所以其空間開銷可以忽略不計。5、應用效果及應用推廣圖2為采用本發(fā)明復數(shù)矩陣的優(yōu)化方法在龍芯處理器上的優(yōu)化效果仿真圖。以常用數(shù)學庫基礎線性代數(shù)程序集(BLAS)中一個名為zGEMM的廣義矩陣相乘的函數(shù)為例,圖2中下面的曲線A是原來的zGEMM函數(shù)在龍芯上運行的運行速度,性能在700Mflops到SOOMflops之間,圖2中中間的曲線B是通過使用乘加指令、循環(huán)展開、矩陣分塊、指令調(diào)度、寄存器輪轉和數(shù)據(jù)預取等優(yōu)化技術在龍芯處理器上得到的浮點吞吐率,zGEMM性能保持在1200Mflops到1300Mflops之間。圖2中上面的曲線C是在中間的曲線B的基礎上使用復數(shù)乘法優(yōu)化和改變矩陣分塊大小得到的運算速度,GEMM性能保持在1900MflopS到2100Mflops之間,它將中間的優(yōu)化曲線B的浮點吞吐率提升了大約50%,是原zGEMM函數(shù)運算速度的2. 6倍以上。本發(fā)明復數(shù)矩陣的優(yōu)化方法,是針對龍芯3A的四發(fā)射體系結構和特定的一級數(shù)據(jù)緩存大小進行的優(yōu)化,由于計算了在龍芯體系結構下特定的展開粒度,對復數(shù)矩陣進行四乘四循環(huán)展開和針對龍芯的特定大小分塊,將矩陣分塊大小nb選取為一個小于52并使得24乘以矩陣分塊大小nb的平方(nb) 2小于龍芯處理器一級數(shù)據(jù)緩存64千字節(jié)(kb)的最大的值,得到在龍芯上最優(yōu)的理想矩陣分塊大??;并利用了數(shù)據(jù)存儲的連續(xù)性和局部性對矩陣乘法中的矩陣進行合理劃分與合并,來減少龍芯的一級數(shù)據(jù)緩存cache訪問次數(shù);對復數(shù)矩陣運算中的普通復數(shù)乘加運算利用了復數(shù)經(jīng)典算法中兩個復數(shù)之間的乘法算法,從而減小了運行規(guī)模,使得復數(shù)矩陣乘法運算在龍芯3A上的計算性能提高了大約50%,可使BLAS庫在龍芯3A上的運算速度達到原來的2. 5倍以上。
權利要求
1.一種在龍芯上的復數(shù)矩陣的優(yōu)化方法,其特征在于操作步驟如下 第一步利用展開粒度公式KaKb/ (KA+KB)=m/n計算最優(yōu)取數(shù)比,其中Ka和KB分別為矩陣A和矩陣B的展開粒度,m/n為最優(yōu)運算取數(shù)比,令兩個矩陣展開粒度的乘積除以兩個矩陣的展開粒度之和所得的值與最優(yōu)取數(shù)比相同,在龍芯上調(diào)整兩個矩陣的展開粒度KA和KB,使得在循環(huán)結構中保證矩陣A和矩陣B的運算取數(shù)比m : n為2 : 1,則所得的展開粒度即為在運算中一次循環(huán)需要展開的運算次數(shù); 第二步在矩陣運算時,對于矩陣內(nèi)數(shù)據(jù)大于500的大規(guī)模矩陣計算,對每一分塊進行運算時在循環(huán)中采用4X4的展開,每個展開的運算對應龍芯的一個發(fā)射槽,通過發(fā)射槽發(fā)射運算指令給龍芯運算器進行乘加運算;根據(jù)矩陣分塊公式24X (nb)2 ( NK,其中NK為龍芯的一級數(shù)據(jù)緩存cache的大小,將矩陣分塊大小nb選取為一個小于52并使得24乘以矩陣分塊大小nb的平方(nb) 2小于龍芯處理器一級數(shù)據(jù)緩存64千字節(jié)的最大的值,得到在龍芯上最優(yōu)的理想矩陣分塊大小; 第三步對于在復數(shù)矩陣運算中出現(xiàn)的普通復數(shù)乘加運算,利用復數(shù)經(jīng)典算法中兩個復數(shù)之間的乘法算法,設第一復數(shù)為A=x+yi,第二復數(shù)為B=m+ni,第三復數(shù)為C=p+qi,計算第一復數(shù)A乘以第二復數(shù)B后再加第三復數(shù)C的值,將此值賦給第三復數(shù)作為第三復數(shù)的新值,算法流程如下計算第一復數(shù)A的實部X乘以第二復數(shù)B的實部m的值為第一實數(shù)e — xXm,計算第一復數(shù)A的虛部y乘以第二復數(shù)B的虛部n的值為第二實數(shù)f — yXn,計算第三復數(shù)C的實部p加第一實數(shù)e后減去第二實數(shù)f的值,并將此值付給第三復數(shù)C的實部p — p+e-f,計算第一復數(shù)A的實部X加第一復數(shù)A的虛部y的值為第三實數(shù)k — x+y,計算第二復數(shù)B的實部m加第二復數(shù)B的虛部n的值為第四實數(shù)t — m+n,計算第三復數(shù)C的虛部q加第三實數(shù)k乘以第四實數(shù)t的積再減去第一實數(shù)e和第二實數(shù)f 的值,并將此值付給第三實數(shù)k的虛部q — q+kXt-e-f,則得到第三復數(shù)C的新值,通過龍芯發(fā)射槽傳給運算器參與分塊矩陣的運算。
全文摘要
本發(fā)明公開了一種復數(shù)矩陣的優(yōu)化方法,特征是先計算在龍芯體系結構下特定的展開粒度,對復數(shù)矩陣進行四乘四循環(huán)展開,將矩陣分塊大小nb選取為一個小于52并使得24乘以矩陣分塊大小nb的平方小于龍芯處理器一級數(shù)據(jù)緩存64千字節(jié)的最大的值,得到在龍芯上最優(yōu)的理想矩陣分塊大??;并利用數(shù)據(jù)存儲的連續(xù)性和局部性對矩陣乘法中的矩陣進行合理劃分與合并,減少龍芯的一級數(shù)據(jù)緩存訪問次數(shù);對復數(shù)矩陣運算中的普通復數(shù)乘加運算利用復數(shù)經(jīng)典算法中兩個復數(shù)之間的乘法算法,從而減小了運行規(guī)模,使得復數(shù)矩陣乘法運算在龍芯3A上的計算性能提高了大約50%,可使BLAS庫在龍芯3A上的運算速度達到原來的2.5倍以上。
文檔編號G06F17/16GK102722472SQ20121016748
公開日2012年10月10日 申請日期2012年5月28日 優(yōu)先權日2012年5月28日
發(fā)明者吳淅, 楊陽朝, 陳強, 顧乃杰 申請人:中國科學技術大學