郭盼盼,陳夢(mèng)雪,梁祖達(dá),馬曉暢,許邦建
(1.鄭州大學(xué)計(jì)算機(jī)與人工智能學(xué)院,河南 鄭州 450066;2.國(guó)家超級(jí)計(jì)算鄭州中心(鄭州大學(xué)),河南 鄭州 450001;3.湖南大學(xué)電氣與信息工程學(xué)院,湖南 長(zhǎng)沙 410082;4.湖南大學(xué)信息科學(xué)與工程學(xué)院,湖南 長(zhǎng)沙 410082)
高性能計(jì)算在應(yīng)用領(lǐng)域、應(yīng)用規(guī)模及性能方面呈現(xiàn)快速發(fā)展態(tài)勢(shì),在人工智能、數(shù)字經(jīng)濟(jì)、航空航天、信息安全、生物醫(yī)療和氣象預(yù)報(bào)等領(lǐng)域應(yīng)用廣泛[1,2]。數(shù)值計(jì)算對(duì)于社會(huì)應(yīng)用和科學(xué)研究越來(lái)越重要。高度結(jié)構(gòu)化的數(shù)值計(jì)算可以通過(guò)向量運(yùn)算來(lái)提升性能。向量運(yùn)算不同于傳統(tǒng)的標(biāo)量運(yùn)算,需要提高系統(tǒng)結(jié)構(gòu)的并行性。單指令流多數(shù)據(jù)流SIMD(Single Instruction Multiple Data)技術(shù)適用于大量的高速或矩陣運(yùn)算,可以有效地提高系統(tǒng)的并行處理能力[3,4]。
數(shù)字信號(hào)處理器DSP(Digital Signal Processor)是通過(guò)數(shù)值計(jì)算來(lái)處理信號(hào)的理論和技術(shù)。目前,我國(guó)許多高校和科研機(jī)構(gòu)都在積極研究數(shù)字信號(hào)處理設(shè)備,其中國(guó)防科技大學(xué)的微電子處理器研究團(tuán)隊(duì)的成果較為突出,其先后研發(fā)了以FT-M7002為代表的系列國(guó)產(chǎn)高性能DSP芯片。與之對(duì)應(yīng),業(yè)界常用的主流高性能數(shù)字信號(hào)處理計(jì)算平臺(tái)是美國(guó)德州儀器公司(TI)推出的TMS320C6678。TMS320C6678平臺(tái)的處理器集成了8個(gè)C66x核,最高主頻可達(dá)1.25 GHz,定點(diǎn)運(yùn)算能力高達(dá)320 GMACS,浮點(diǎn)運(yùn)算能力達(dá)160 GFlops,在高性能數(shù)字信號(hào)處理計(jì)算應(yīng)用中具有極大的競(jìng)爭(zhēng)力和優(yōu)勢(shì)。FT-M7002采用超長(zhǎng)指令字結(jié)構(gòu)VLIW(Very Long Instruction Word)集成了2個(gè)DSP內(nèi)核和1個(gè)CPU核,主頻可達(dá)1 GHz,16位峰值性能可達(dá)200 GMACS,32位峰值性能可達(dá)200 GFlops,在對(duì)速度要求較高的浮點(diǎn)運(yùn)算中具有極大的優(yōu)勢(shì)[5 - 9]。本文研究了數(shù)字信號(hào)處理中常見(jiàn)的點(diǎn)積(Dot Product)算法在FT-M7002平臺(tái)上的優(yōu)化實(shí)現(xiàn)問(wèn)題。
點(diǎn)積算法是實(shí)現(xiàn)點(diǎn)乘運(yùn)算的方式之一,點(diǎn)乘是數(shù)值計(jì)算的基礎(chǔ)部分,在大規(guī)模線(xiàn)性代數(shù)計(jì)算中經(jīng)常被調(diào)用[10]。文獻(xiàn)[11]提出一個(gè)基于茫然傳輸(Oblivious Transfer)的高效安全點(diǎn)積協(xié)議,利用高效茫然傳輸擴(kuò)展技術(shù)大幅度降低計(jì)算開(kāi)銷(xiāo)。文獻(xiàn)[12]將內(nèi)向(對(duì)角)向量積和一個(gè)向量的元素之和一起用于推廣同一維數(shù)的不定數(shù)向量的標(biāo)量積。 文獻(xiàn)[13]介紹了具有隨機(jī)頂點(diǎn)向量的稀疏隨機(jī)點(diǎn)積圖,并研究了其三角形數(shù)量的漸近行為。文獻(xiàn)[14]采用高階寬算術(shù)邏輯單元,提高了點(diǎn)乘運(yùn)算的速度。但是,由于處理器體系結(jié)構(gòu)不同和優(yōu)化算法的差異性,上述算法并不適用于FT-M7002平臺(tái)。
本文面向國(guó)防科技大學(xué)自主研發(fā)的FT-M7002高性能處理器,對(duì)不同類(lèi)型的點(diǎn)積算法實(shí)現(xiàn)了優(yōu)化,并進(jìn)行了性能對(duì)比。研究?jī)?nèi)容主要包含以下幾個(gè)方面:(1)分析了FT-M7002體系結(jié)構(gòu)的特點(diǎn);(2)對(duì)不同類(lèi)型的點(diǎn)積算法進(jìn)行標(biāo)量實(shí)現(xiàn);(3)在FT-M7002平臺(tái)上對(duì)(2)中的點(diǎn)積算法進(jìn)行優(yōu)化,用到的優(yōu)化方法有數(shù)據(jù)處理、DMA雙通道傳輸、向量并行優(yōu)化和SVR(Scalar Vector Register)傳輸?shù)龋?4)對(duì)不同規(guī)模不同類(lèi)型點(diǎn)積算法的實(shí)驗(yàn)結(jié)果進(jìn)行了性能分析。
FT-M7002是國(guó)防科技大學(xué)自主研發(fā)的一款高性能DSP處理器芯片,主頻為1 GHz,功耗在30 W以下。該芯片包含1個(gè)CPU核和2個(gè)DSP內(nèi)核,采用雙向環(huán)形互連網(wǎng)絡(luò),全芯片構(gòu)成4個(gè)結(jié)點(diǎn)掛接在環(huán)形互連網(wǎng)絡(luò)上。DSP內(nèi)核擁有32 KB的一級(jí)數(shù)據(jù)緩存和512 KB的陣列存儲(chǔ)器AM(Array Memory),核外擁有32 GB大容量DDR存儲(chǔ)空間,針對(duì)矩陣乘、FFT等運(yùn)算密集型算法進(jìn)行了高度優(yōu)化,在進(jìn)行大量數(shù)據(jù)運(yùn)算時(shí)能很好地發(fā)揮其優(yōu)勢(shì)[15 - 18]。
如圖1所示,DSP內(nèi)核的寄存器長(zhǎng)達(dá)512位,基于超長(zhǎng)指令字結(jié)構(gòu),由取指單元、標(biāo)量處理單元SPU(Scalar Processing Unit)、標(biāo)向量共享寄存器SVR、向量處理單元VPU(Vector Processing Unit)、陣列存儲(chǔ)器AM和直接存儲(chǔ)訪(fǎng)問(wèn)DMA(Direct Memory Access)等組成。其中,取指單元通過(guò)控制指令流控來(lái)完成指令獲取操作。SPU包括指令流控、標(biāo)量執(zhí)行單元SPE(Scalar Processing Element)、標(biāo)量存儲(chǔ)器SM(Scalar Memory)等。指令流控單元用于程序流控制,包括分支、中斷/異常控制等。標(biāo)量執(zhí)行單元SPE接收由指令派發(fā)部件派發(fā)的標(biāo)量運(yùn)算類(lèi)指令,并在其對(duì)應(yīng)的功能運(yùn)算單元執(zhí)行接收的指令。標(biāo)量存儲(chǔ)器SM主要實(shí)現(xiàn)標(biāo)量數(shù)據(jù)訪(fǎng)存。SVR可以實(shí)現(xiàn)SPE和VPU之間的數(shù)據(jù)傳輸。VPU由16個(gè)同構(gòu)的向量執(zhí)行單元VPE(Vector Processing Element)的運(yùn)算陣列以及混洗/歸約部件組成。AM支持DMA和2條向量存儲(chǔ)指令的并行訪(fǎng)問(wèn)操作,實(shí)現(xiàn)16路的向量數(shù)據(jù)訪(fǎng)問(wèn),為VPU提供高內(nèi)存訪(fǎng)問(wèn)帶寬。DMA接收SPU配置的傳輸參數(shù),啟動(dòng)對(duì)特定存儲(chǔ)資源的訪(fǎng)問(wèn),讀操作過(guò)程和寫(xiě)操作過(guò)程的數(shù)據(jù)傳輸通過(guò)DMA通道實(shí)現(xiàn)[19,20]。
Figure 1 Architecture of FT-M7002 DSP kernel圖1 FT-M7002 DSP內(nèi)核體系結(jié)構(gòu)
點(diǎn)積,又稱(chēng)數(shù)量積,可以用來(lái)實(shí)現(xiàn)點(diǎn)乘算法,是歐幾里得空間的標(biāo)準(zhǔn)內(nèi)積,指實(shí)數(shù)集R上的2個(gè)向量對(duì)應(yīng)相乘再相加求和之后返回一個(gè)實(shí)數(shù)值的二元運(yùn)算[21]。運(yùn)算法則如下:設(shè)向量A=[A1,A2,…,An]和B=[B1,B2,…,Bn],那么這2個(gè)向量的點(diǎn)積定義為:A·B=A1B1+A2B2+…+AnBn。
2個(gè)元素類(lèi)型為float類(lèi)型的輸入數(shù)組的點(diǎn)積實(shí)現(xiàn)如算法1所示。
算法1DSPF_sp_dotprod_cn
輸入:float *x,float *y,intn。
輸出:floatsum。
步驟1sum=0;
步驟2 for(inti=0;i 步驟3sum+=x[i]*y[i];} 2個(gè)元素類(lèi)型為short類(lèi)型的輸入數(shù)組的點(diǎn)積實(shí)現(xiàn)如算法2所示。 算法2DSP_dotprod_cn 輸入:short *x,short *y,intn。 輸出:intsum。 步驟1sum=0; 步驟2 for(inti=0;i 步驟3sum+=x[i]*y[i];} 2個(gè)復(fù)數(shù)的乘法法則如下:設(shè)A=x+yi,B=m+ni(x,y,m和n均屬于實(shí)數(shù)集R)是任意2個(gè)復(fù)數(shù),那么它們的乘積A·B=(x+yi)(m+ni)=(xm-yn)+(xn+ym)i。以此類(lèi)推,2個(gè)向量的復(fù)數(shù)點(diǎn)積,運(yùn)算后實(shí)部和虛部分開(kāi)存放。 2個(gè)元素類(lèi)型為float類(lèi)型的輸入數(shù)組的復(fù)數(shù)點(diǎn)積實(shí)現(xiàn)如算法3所示。 算法3DSPF_sp_dotp_cplx_cn 輸入:float *x,float *y,intn/2。 輸出:floatreal,floatimag。 步驟1floatreal=0,imag=0; 步驟2 for(inti=0;i 步驟3real+=(x[2*i] *y[2*i]-x[2*i+1] *y[2*i+1]); 步驟4imag+=(x[2*i] *y[2*i+1]+x[2*i+1] *y[2*i]);} 面向FT-M7002平臺(tái),點(diǎn)積算法的優(yōu)化需要經(jīng)過(guò)以下步驟:首先,需要對(duì)數(shù)據(jù)進(jìn)行處理;其次,向量操作在向量空間AM中執(zhí)行,需要先把數(shù)據(jù)從標(biāo)量空間傳輸?shù)较蛄靠臻g;再次,對(duì)核心計(jì)算進(jìn)行向量并行優(yōu)化;最后,將數(shù)據(jù)再?gòu)南蛄靠臻g傳輸?shù)綐?biāo)量空間,返回結(jié)果值。在以上步驟中,涉及到的優(yōu)化有以下幾個(gè)方面: (1)數(shù)據(jù)處理; (2)DMA雙通道傳輸; (3)向量并行優(yōu)化; (4)SVR傳輸。 由于向量處理單元有16個(gè)同構(gòu)運(yùn)算單元VPE,進(jìn)行向量運(yùn)算時(shí)這16個(gè)VPE一起參與運(yùn)算,并且執(zhí)行相同的操作,所以在運(yùn)算之前需要判斷連續(xù)的16個(gè)數(shù)據(jù)是否線(xiàn)性相關(guān),能否進(jìn)行相同的處理。一般向量操作只針對(duì)16的整數(shù)倍數(shù)據(jù)進(jìn)行處理,不夠16的尾部數(shù)據(jù)主要有以下3種處理方法: (1)填0補(bǔ)全。用0將不夠16的尾部數(shù)據(jù)補(bǔ)夠16;或者將不夠16的尾部數(shù)據(jù)所在的向量空間其它位置初始化為0。 (2)關(guān)閉部分運(yùn)算單元VPE。向量處理單元為VPE0~VPE15,可以通過(guò)mov_to_vlr()接口控制開(kāi)啟或關(guān)閉,1表示VPEx為開(kāi)啟狀態(tài),0表示VPEx為關(guān)閉狀態(tài)(x的取值為0~15)。VPEx在關(guān)閉狀態(tài)下不再執(zhí)行相關(guān)指令操作,直到VPEx再次被打開(kāi)。 (3)數(shù)據(jù)作廢。即放棄不夠16的尾部數(shù)據(jù),但這可能會(huì)影響函數(shù)結(jié)果的正確性。 經(jīng)實(shí)驗(yàn)判斷,方法3會(huì)使結(jié)果不正確,方法2反復(fù)打開(kāi)或關(guān)閉VPE很費(fèi)時(shí)間。方法1中用0將不夠16的部尾數(shù)據(jù)補(bǔ)夠16是在標(biāo)量空間中進(jìn)行的,相比較而言,向量空間初始化為0所用的時(shí)間周期更少、效果更好。 在FT-M7002平臺(tái)中,DMA作為單核數(shù)據(jù)傳輸?shù)臉屑~,可以通過(guò)配置其傳輸參數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)搬移。數(shù)據(jù)傳輸包括讀操作過(guò)程和寫(xiě)操作過(guò)程。完成1次DMA數(shù)據(jù)搬移需要經(jīng)歷DMA參數(shù)配置、DMA啟動(dòng)搬移數(shù)據(jù)和DMA結(jié)束確認(rèn)3個(gè)過(guò)程。 DMA數(shù)據(jù)傳輸模式包括點(diǎn)對(duì)點(diǎn)傳輸、分段數(shù)據(jù)傳輸、廣播數(shù)據(jù)傳輸、核外主機(jī)數(shù)據(jù)訪(fǎng)問(wèn)和ET(Emulation Test)調(diào)試請(qǐng)求。DMA事務(wù)支持多種不同的啟動(dòng)方式,包括寫(xiě)事件置位寄存器ESR(Event Set Register)啟動(dòng)、同步事件啟動(dòng)、參數(shù)鏈接啟動(dòng)、通道鏈接啟動(dòng)和幀同步傳輸啟動(dòng)。DMA傳輸結(jié)束確認(rèn)有2種方式:(1)通過(guò)DMA產(chǎn)生傳輸完成中斷;(2)檢測(cè)傳輸完成標(biāo)識(shí)寄存器。 點(diǎn)對(duì)點(diǎn)傳輸是指DSP內(nèi)核通過(guò)DMA發(fā)起核內(nèi)、核外存儲(chǔ)資源之間的數(shù)據(jù)交換。傳輸源和目的中一個(gè)是DSP內(nèi)核內(nèi)存儲(chǔ)資源,另一個(gè)是核外存儲(chǔ)資源。這些點(diǎn)到點(diǎn)傳輸允許按行進(jìn)行同步,也可以按數(shù)據(jù)塊進(jìn)行同步。 在本文點(diǎn)積算法優(yōu)化實(shí)現(xiàn)中,DMA數(shù)據(jù)傳輸模式是點(diǎn)對(duì)點(diǎn)傳輸,DMA啟動(dòng)方式是寫(xiě)ESR啟動(dòng),DMA傳輸結(jié)束確認(rèn)方式是檢測(cè)傳輸完成標(biāo)識(shí)寄存器CIPR(Complete Identity Processing Register)。實(shí)現(xiàn)1次DMA傳輸搬移2個(gè)數(shù)組的數(shù)據(jù),需要對(duì)第1個(gè)參數(shù)的通道鏈接進(jìn)行配置,這樣第1個(gè)數(shù)組傳輸完畢后,可以立刻轉(zhuǎn)向下一個(gè)邏輯通道對(duì)第2個(gè)數(shù)組進(jìn)行傳輸,這里稱(chēng)為DMA雙通道傳輸。DMA傳輸結(jié)束確認(rèn)后,只需要檢測(cè)1次傳輸完成標(biāo)識(shí)寄存器,節(jié)省了時(shí)間成本。 4.2.1 DMA參數(shù)配置 在啟動(dòng)DMA之前,需要對(duì)DMA的傳輸參數(shù)和全局寄存器進(jìn)行配置。如圖2所示,DMA參數(shù)配置由8個(gè)字構(gòu)成,每個(gè)字32位。其中,傳輸控制字1和傳輸控制字2中的參數(shù)域用來(lái)控制傳輸模式;源地址表示源數(shù)據(jù)塊首地址的低32位;源單元計(jì)數(shù)為數(shù)據(jù)塊中每個(gè)數(shù)據(jù)行中的數(shù)據(jù)單元字?jǐn)?shù);源幀計(jì)數(shù)表示源數(shù)據(jù)塊中包含的數(shù)據(jù)幀數(shù)目,值為0時(shí)表示1個(gè)幀,值為1時(shí)表示2個(gè)幀,依次類(lèi)推;目的地址表示目的數(shù)據(jù)塊首地址的低32位;目的單元計(jì)數(shù)表示目的數(shù)據(jù)塊中每個(gè)數(shù)據(jù)行中的數(shù)據(jù)單元字?jǐn)?shù);目的幀計(jì)數(shù)表示目的數(shù)據(jù)塊中包含的數(shù)據(jù)幀數(shù)目[22],值為0時(shí)表示1個(gè)幀,值為1時(shí)表示2個(gè)幀,依次類(lèi)推;源幀索引為源數(shù)據(jù)塊中2個(gè)數(shù)據(jù)幀之間的地址偏移量;目的幀索引為目的數(shù)據(jù)塊中2個(gè)數(shù)據(jù)幀之間的地址偏移量;塊索引表示2個(gè)數(shù)據(jù)塊之間的地址偏移量;參數(shù)鏈接地址表示連接參數(shù)地址的低16位。 Figure 2 DMA parameters圖2 DMA參數(shù) DMA有16個(gè)邏輯通道,每個(gè)通道都有一個(gè)與之關(guān)聯(lián)的事件,用于觸發(fā)相應(yīng)通道的傳輸。為使用DMA雙通道傳輸,需要在第1個(gè)傳輸參數(shù)中配置其傳輸控制字1參數(shù)中的“傳輸結(jié)束中斷使能(TCINT)”值為1,“傳輸結(jié)束中斷碼(TCC)”值為 7~15,同時(shí),還需置位“事件使能寄存器(EER)”。 TCINT位于傳輸控制字1中的第2位,1表示傳輸結(jié)束后產(chǎn)生中斷,0表示不產(chǎn)生。TCC位于傳輸控制字1中的第3~6位,取值在0000b~1111b。EER是事件控制相關(guān)的寄存器之一,有32位,0~15位為通道x(x為0~15)使能信號(hào),1為有效;16~31位保留。 4.2.2 DMA寫(xiě)ESR啟動(dòng) 配置好DMA參數(shù)之后執(zhí)行寫(xiě)ESR啟動(dòng)。DMA設(shè)置16個(gè)邏輯通道,每個(gè)邏輯通道對(duì)應(yīng)參數(shù)的一個(gè)入口。在DMA通道啟動(dòng)后,將參數(shù)讀出并提交給DMA通用通道處理,完成第1個(gè)數(shù)組的數(shù)據(jù)搬移。第1個(gè)數(shù)組傳輸結(jié)束后,通過(guò)4.1.1節(jié)中的參數(shù)配置,DMA會(huì)產(chǎn)生傳輸結(jié)束中斷碼TCC值對(duì)應(yīng)的中斷事件,從而啟動(dòng)對(duì)應(yīng)的邏輯通道7~15,立刻對(duì)第2個(gè)數(shù)組的數(shù)據(jù)進(jìn)行搬移。 4.2.3 DMA傳輸完成標(biāo)識(shí)檢測(cè) 由于是雙通道傳輸,沒(méi)有對(duì)DMA的第2個(gè)參數(shù)進(jìn)行通道鏈接配置,所以當(dāng)?shù)?個(gè)數(shù)組也傳輸完畢后,就可以檢測(cè)傳輸完成標(biāo)識(shí)寄存器,讀取CIPR寄存器,檢測(cè)CIPR相應(yīng)位,相應(yīng)位為1,表示傳輸結(jié)束。 待處理通道中斷標(biāo)志寄存器CIPR有32位,第0~15位表示結(jié)束碼x(x表示0~15)的點(diǎn)到點(diǎn)傳輸結(jié)束中斷標(biāo)志位,1表示中斷,0表示無(wú)中斷;第16~31位表示結(jié)束碼x(x表示16~31)的分段數(shù)據(jù)傳輸或者廣播結(jié)束中斷標(biāo)志位,1表示中斷,0表示無(wú)中斷。一般情況下,CIPR寄存器的值初始化成0xFFFFFFFF,然后再用“for(;!(*address&0x1);)”檢測(cè)DMA傳輸是否完成。 4.2.4 小結(jié) 如果要實(shí)現(xiàn)2個(gè)數(shù)據(jù)類(lèi)型為float的一維數(shù)組x和y的DMA雙通道傳輸,即將x和y2個(gè)標(biāo)量數(shù)組中的n個(gè)數(shù)據(jù)分別搬移到向量空間src1_v和src2_v中,由于數(shù)組的數(shù)據(jù)類(lèi)型為float,則需要的空間大小為4n。若接口名稱(chēng)定義為M7002_datatrans_link,則需要傳入6個(gè)參數(shù),即其DMA雙通道傳輸實(shí)現(xiàn)代碼為“M7002_datatrans_link(x,src1_v,4n,y,src2_v,4n)”。假設(shè)第1個(gè)數(shù)組x使用邏輯通道0進(jìn)行數(shù)據(jù)傳輸,第2個(gè)數(shù)組y使用邏輯通道7進(jìn)行數(shù)據(jù)傳輸,先啟動(dòng)邏輯通道0后啟動(dòng)邏輯通道7,則要在邏輯通道0上進(jìn)行通道鏈接配置,需要將其傳輸控制字1的TCINT參數(shù)域的值配置為1,TCC參數(shù)域的值配置為7,同時(shí)置位EER寄存器。由于是雙通道傳輸,邏輯通道7不需要進(jìn)行通道鏈接配置。最后,通過(guò)檢測(cè)CIPR寄存器的值來(lái)判斷DMA傳輸是否完成。 以此類(lèi)推,如果要實(shí)現(xiàn)1次DMA傳輸3個(gè)數(shù)組,即開(kāi)通3個(gè)邏輯通道,則需要對(duì)前2個(gè)通道進(jìn)行通道鏈接配置,這樣可以快速查找到下一個(gè)通道,對(duì)下一個(gè)數(shù)組進(jìn)行傳輸。 如果數(shù)據(jù)處理已完成并傳輸?shù)较蛄靠臻g之后,就可以進(jìn)行核心計(jì)算了,向量運(yùn)算1次可以計(jì)算16個(gè)數(shù)據(jù),主要用到下列向量并行優(yōu)化。 4.3.1 取數(shù) 進(jìn)行計(jì)算之前,要先把數(shù)據(jù)從向量空間讀取到向量計(jì)算單元中,每次讀取16個(gè)??梢杂谩?++”自增來(lái)讀取,也可以用FT-M7002平臺(tái)提供的向量C接口“vec_ld()”讀取,具體使用哪種方法視情況而定。 一般情況下,使用“*++”讀取數(shù)據(jù)比使用“vec_ld()”所用周期數(shù)要少,但“*++”只能讀取連續(xù)的16個(gè)數(shù),數(shù)據(jù)類(lèi)型還要保持一致。本文的float類(lèi)型點(diǎn)積(算法1和算法3)使用“vec_ld()”讀取數(shù),short類(lèi)型點(diǎn)積(算法2)使用“*++”讀取數(shù)。 4.3.2 點(diǎn)積核心計(jì)算 算法1和算法3使用向量點(diǎn)積乘后加vec_dotp()函數(shù)進(jìn)行優(yōu)化;算法2使用復(fù)數(shù)點(diǎn)積乘后加進(jìn)行優(yōu)化,實(shí)部乘法使用vec_fcreal32()函數(shù),虛部乘法使用vec_fcimag32()函數(shù)。下面分別對(duì)這3個(gè)算法進(jìn)行核心計(jì)算的優(yōu)化。 對(duì)算法1的核心計(jì)算優(yōu)化后代碼如下所示: for(inti=0;i tempx0=vec_ldm2(i,src1_v); tempy0=vec_ldm2(i,src2_v); tempz0=vec_dotp(tempx0,tempy0); tempz1=vec_add(tempz0,tempz1); } 其中,向量空間src1_v和src2_v為float類(lèi)型;向量運(yùn)算單元tempx0和tempy0為double類(lèi)型,tempz0和tempz1為float類(lèi)型。使用模二取vec_ldm2()1次循環(huán)可以取出32個(gè)float類(lèi)型的數(shù)據(jù),減少了循環(huán)次數(shù)。由于類(lèi)型1個(gè)float數(shù)據(jù)占32位,1個(gè)double類(lèi)型數(shù)據(jù)占64位。使用點(diǎn)積函數(shù)vec_dotp()時(shí),tempx0的高32位乘以tempy0高32位的乘積加上tempx0的低32位乘以tempy0低32位的乘積,將和保存至tempz0中。最后再將點(diǎn)積之后的結(jié)果累加到tempz1中。 對(duì)算法2的核心計(jì)算優(yōu)化后代碼如下所示: for(inti=0;i tempz0=vec_dotp(*src1_v++,*src2_v++); tempz1=vec_add(tempz0,tempz1); } 其中,向量空間src1_v和src2_v為short類(lèi)型,F(xiàn)T-M7002平臺(tái)中short類(lèi)型為打包在32位操作數(shù)中的2個(gè)16位整數(shù),所以使用“*++”取數(shù)1次可以計(jì)算32個(gè)short類(lèi)型的數(shù)據(jù),使循環(huán)次數(shù)減半。由于和算法1的數(shù)據(jù)類(lèi)型不一樣,tempz0和tempz1為int類(lèi)型,使用點(diǎn)積函數(shù)vec_dotp()時(shí),src1_v的高16位乘以src2_v高16位的乘積加上src1_v的低16乘以src2_v低16位的乘積,將和保存至tempz0中。最后再將點(diǎn)積之后的結(jié)果累加到tempz1中。 算法3的數(shù)據(jù)類(lèi)型和算法1的一樣,取數(shù)方式也一樣,只是使用的點(diǎn)積函數(shù)不一樣。對(duì)算法3的核心計(jì)算優(yōu)化后代碼如下所示: for(i=0;i tempx0=vec_ldm2(i,src1_v); tempy0=vec_ldm2(i,src2_v); temp_real=vec_fcreal32(tempx0,tempy0); temp_imag=vec_fcimag32(tempx0,tempy0); sum_real=vec_add(temp_real,sum_real); sum_imag=vec_add(temp_imag,sum_imag); } 其中,向量空間src1_v和src2_v為float類(lèi)型;向量運(yùn)算單元tempx0和tempy0為double類(lèi)型,分別存放32個(gè)float類(lèi)型的x和y數(shù)組數(shù)據(jù);向量運(yùn)算單元temp_real和temp_imag為float類(lèi)型,分別存放點(diǎn)積后的實(shí)部和虛部結(jié)果;向量運(yùn)算單元sum_real和sum_imag為float類(lèi)型,分別存放點(diǎn)積后的實(shí)部和虛部累加結(jié)果。復(fù)數(shù)實(shí)部乘法計(jì)算使用復(fù)數(shù)點(diǎn)積函數(shù)vec_fcreal32()時(shí),tempx0的高32位乘以tempy0的高32位,tempx0的低32位乘以tempy0的低32位,2個(gè)乘法結(jié)果相減后實(shí)部結(jié)果賦值給temp_real。復(fù)數(shù)虛部乘法計(jì)算使用復(fù)數(shù)點(diǎn)積函數(shù)vec_fcreal32()時(shí),tempx0的高32位乘以tempy0的高32位,tempx0的低32位乘以tempy0的低32位,2個(gè)乘法結(jié)果相減后虛部結(jié)果賦值給temp_imag。最后再分別將點(diǎn)積之后的結(jié)果累加到sum_real和sum_imag中。 4.3.3 向量歸約 向量歸約可以通過(guò)某種操作方式將多個(gè)向量運(yùn)算單元中的數(shù)據(jù)歸到一個(gè)或多個(gè)向量運(yùn)算單元,方式有取最大值、取最小值、加法和SIMD加法,目前FT-M7002平臺(tái)只支持int類(lèi)型。算法2使用了歸約函數(shù)vec_reduc16()中的加法,用法為“tempz2=vec_reduc16(tempz1,0,0)”,tempz1存放核心計(jì)算點(diǎn)積之后累加起來(lái)的結(jié)果,在其16個(gè)VPE里面,使用向量歸約之后,結(jié)果累加到了tempz2的第1個(gè)VPE中,這樣只需要輸出一個(gè)結(jié)果,大大縮短了時(shí)間周期。 在向量運(yùn)算單元計(jì)算完成之后,還需要把數(shù)據(jù)傳輸出來(lái),返回給主函數(shù)。由于點(diǎn)積核心計(jì)算完成之后,結(jié)果存放在一個(gè)向量運(yùn)算單元的1個(gè)或16個(gè)VPE中,只需要把它們傳輸出來(lái)即可,如果還使用DMA傳輸,又要經(jīng)歷DMA參數(shù)配置、DMA啟動(dòng)和DMA傳輸完成確認(rèn),這樣很費(fèi)時(shí)間。為快速傳輸少量數(shù)據(jù),F(xiàn)T-M7002提供了SVR傳輸接口,可以把數(shù)據(jù)從向量運(yùn)算單元直接傳輸?shù)綐?biāo)量中。 數(shù)據(jù)的類(lèi)型不同,使用的接口也稍有不同。在算法1優(yōu)化中,數(shù)據(jù)類(lèi)型為float類(lèi)型,先使用“mov_to_svr_v16sf(tempz1)”,將向量運(yùn)算單元tempz1里的16個(gè)數(shù)據(jù)搬移至SVR中;然后再使用“result[X]=mov_from_svrX_sf()”函數(shù)(X表示0~15),將SVR里的16個(gè)數(shù)據(jù)搬移到result數(shù)組中。算法2的優(yōu)化中,點(diǎn)積之后進(jìn)行了向量歸約,在4.3.3節(jié)中,使用“mov_to_svr_v16si(tempz2)”將點(diǎn)積之后的結(jié)果tempz1中的16個(gè)數(shù)據(jù)歸約到了tempz2中的第1個(gè)VPE中,數(shù)據(jù)類(lèi)型為int,將向量運(yùn)算單元tempz2中的數(shù)據(jù)搬移至SVR中,然后使用“sum=mov_from_svr0()”將第1個(gè)數(shù)據(jù)從SVR中傳輸出來(lái)。算法3的優(yōu)化和算法1使用的SVR傳輸類(lèi)似,這里不再贅述。 以算法2的優(yōu)化為例,核心計(jì)算優(yōu)化后代碼如下所示: intsum;//存放最終返回值 vector signed inttempz0,tempz1,tempz2; tempz1=vec_movi((int)0);//初始化0 vector signed short *src1_v=(vector signed short *)0x040000000;//申請(qǐng)向量空間 vector signed short *src2_v=(vector signed short *)0x040002000; //尾部數(shù)據(jù)向量空間初始化0 vec_st(vec_movi((short)0),0,src1_v+n/32); vec_st(vec_movi((short)0),0,src2_v+n/32); //DMA雙通道傳輸 M7002_datatrans_link(x,src1_v,n*2,y,src2_v,n*2); for(inti=0;i tempz0=vec_dotp(*src1_v++,*src2_v++); tempz1=vec_add(tempz0,tempz1); }//點(diǎn)積核心計(jì)算 tempz2=vec_reduc16(tempz1,0,0);//向量歸約 mov_to_svr_v16si(tempz2);//SVR傳輸 sum=mov_from_svr0(); 本文實(shí)驗(yàn)數(shù)據(jù)均來(lái)源于TI官網(wǎng)dsplib庫(kù)中的數(shù)據(jù)。對(duì)其中不同類(lèi)型的點(diǎn)積算法,float類(lèi)型的數(shù)組是通過(guò)函數(shù)“UTIL_fillRandSP()”隨機(jī)生成(-10,10)的小數(shù),short類(lèi)型的數(shù)組來(lái)源于dsplib庫(kù)給定的數(shù)據(jù)。改變輸入數(shù)組的規(guī)模n(n=128,256,512,1 024),分別在FT-M7002和TI的開(kāi)發(fā)板上進(jìn)行實(shí)驗(yàn),根據(jù)開(kāi)發(fā)程序統(tǒng)計(jì)DSP運(yùn)行周期數(shù)。本節(jié)主要從實(shí)驗(yàn)環(huán)境、正確性分析和性能分析3個(gè)方面對(duì)實(shí)驗(yàn)進(jìn)行分析。 本文的實(shí)驗(yàn)環(huán)境有2個(gè):一個(gè)是FT平臺(tái)及其對(duì)應(yīng)的開(kāi)發(fā)板M7002;另一個(gè)是TI平臺(tái)及其對(duì)應(yīng)的開(kāi)發(fā)板TMS320C6678。具體實(shí)驗(yàn)環(huán)境參數(shù)如表1所示。 Figure 3 Performance comparison after FT-M7002 optimization and before FT-M7002 optimization圖3 FT-M7002優(yōu)化后與FT-M7002優(yōu)化前的性能對(duì)比 Table 1 Parameters of experimental environment表1 實(shí)驗(yàn)環(huán)境參數(shù) 在FT-M7002平臺(tái)上,分別返回優(yōu)化前后的結(jié)果,將2個(gè)結(jié)果相減取絕對(duì)值,以千分之一為標(biāo)準(zhǔn),精確度小于千分之一則輸出“Result Successful”,否則輸出“Result Failure”。結(jié)果如表2所示,對(duì)于輸入不同規(guī)模不同類(lèi)型的數(shù)組,本文的點(diǎn)積算法均能輸出正確的結(jié)果。 Table 2 Result correctness analysis 本文對(duì)算法1、算法2和算法3在FT-M7002平臺(tái)上進(jìn)行不同類(lèi)型的點(diǎn)積算法的實(shí)現(xiàn)和優(yōu)化。由于主頻不同,F(xiàn)T-M7002平臺(tái)的周期數(shù)置換時(shí)間公式為:周期數(shù)*16/106,置換成ms;TI平臺(tái)的周期數(shù)置換時(shí)間公式為:周期數(shù)/106,置換成ms。調(diào)用定時(shí)器的計(jì)時(shí)函數(shù)分別記錄優(yōu)化前后的算法執(zhí)行時(shí)間,從以下2個(gè)方面對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行性能分析:(1)縱向?qū)Ρ?,即FT-M7002優(yōu)化前后的性能對(duì)比;(2)橫向?qū)Ρ?,即FT-M7002優(yōu)化后的性能與TI性能對(duì)比。 5.3.1 FT-M7002優(yōu)化后與其優(yōu)化前的性能對(duì)比 輸入不同類(lèi)型不同規(guī)模的數(shù)組,在FT-M7002平臺(tái)上進(jìn)行float類(lèi)型點(diǎn)積、short類(lèi)型點(diǎn)積和float類(lèi)型復(fù)數(shù)點(diǎn)積的實(shí)現(xiàn)與優(yōu)化,分別記為DSPF_sp_dotprod()函數(shù)、DSP_dotprod()函數(shù)和DSPF_sp_dotp_cplx()函數(shù)。以?xún)?yōu)化前后定時(shí)器的時(shí)間周期來(lái)計(jì)算其性能比。 Figure 4 Performance comparison between optimized FT-M7002 and TI圖4 FT-M7002優(yōu)化后的性能與TI的性能對(duì)比 測(cè)試結(jié)果如圖3所示,分別列出了不同類(lèi)型情況下,n為128,256,512和1 024時(shí)點(diǎn)積算法優(yōu)化后的性能比,以及3個(gè)函數(shù)的平均性能。相比于算法1、算法2、算法3,DSPF_sp_dotprod()、DSP_dotprod()、DSPF_sp_dotp_cplx()3個(gè)函數(shù)向量?jī)?yōu)化后的性能比分別為12.796 3~46.319 3, 13.666 7~54.049 0, 10.786 9~35.333 3,3個(gè)函數(shù)的平均性能比為12.416 6~45.233 8。可以看出,隨著規(guī)模n的不斷增大,性能比均不斷提高。 5.3.2 FT-M7002優(yōu)化后的性能與TI的性能對(duì)比 將FT-M7002 優(yōu)化后的性能與TI的性能進(jìn)行對(duì)比,測(cè)試結(jié)果如圖4所示,同樣地,分別求出了3個(gè)函數(shù)的性能比及其平均性能。相比于TI平臺(tái)的測(cè)試結(jié)果,DSPF_sp_dotprod()、DSP_dotprod()、DSPF_sp_dotp_cplx()3個(gè)函數(shù)在FT-M7002 平臺(tái)向量?jī)?yōu)化后的性能比分別為1.841 4~6.250 5, 0.905 6~3.171 0, 1.367 8~4.137 3,3個(gè)函數(shù)的平均性能比為1.371 6~4.519 6。 可以看到,輸入數(shù)據(jù)類(lèi)型為short、n為128時(shí),性能比才達(dá)到0.905 6,這是因?yàn)門(mén)I平臺(tái)的定點(diǎn)運(yùn)算能力峰值比FT-M7002 平臺(tái)的高,n比較小時(shí),F(xiàn)T-M7002 平臺(tái)中DMA傳輸時(shí)間占比較大。隨著規(guī)模n的不斷增大,性能比也在不斷提高。 針對(duì)FT-M7002 DSP內(nèi)核體系結(jié)構(gòu)的特點(diǎn),本文完成了對(duì)不同類(lèi)型不同規(guī)模大小的點(diǎn)積算法的優(yōu)化。本文結(jié)合FT-M7002平臺(tái)的特性,使用向量并行化、DMA雙通道傳輸和SVR傳輸?shù)葍?yōu)化方法,提高了程序的性能。實(shí)驗(yàn)結(jié)果表明,在FT-M7002平臺(tái)上,不同類(lèi)型的點(diǎn)積算法優(yōu)化后的性能與優(yōu)化前的平均性能比為12.416 6~45.233 8。同時(shí),本文還與TI平臺(tái)的TMS320C6678處理器進(jìn)行了實(shí)驗(yàn)對(duì)比,不同類(lèi)型的點(diǎn)積算法在FT-M7002平臺(tái)優(yōu)化后的性能與TI平臺(tái)的平均性能比為1.371 6~4.519 6。驗(yàn)證了本文所提出的點(diǎn)積算法優(yōu)化方法的有效性以及FT-M7002平臺(tái)的高性能計(jì)算優(yōu)勢(shì),后續(xù)將針對(duì)其他數(shù)學(xué)算法完善其在FT-M7002平臺(tái)上的實(shí)現(xiàn)與優(yōu)化。3.2 復(fù)數(shù)點(diǎn)積
4 面向FT-M7002平臺(tái)點(diǎn)積算法的優(yōu)化
4.1 數(shù)據(jù)處理
4.2 DMA雙通道傳輸
4.3 向量并行優(yōu)化
4.4 SVR傳輸
4.5 小結(jié)
5 實(shí)驗(yàn)與結(jié)果分析
5.1 實(shí)驗(yàn)環(huán)境
5.2 正確性分析
5.3 性能分析
6 結(jié)束語(yǔ)