亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        HXDSP上雙精度矩陣向量乘運(yùn)算的實(shí)現(xiàn)與優(yōu)化

        2021-11-22 08:53:42廖曉群王佳儀張美春
        關(guān)鍵詞:指令優(yōu)化

        廖曉群,王佳儀,蘇 濤,李 敏,張美春

        (1.西安科技大學(xué) 通信與信息工程學(xué)院,陜西 西安 710054;2.西安電子科技大學(xué) 雷達(dá)信號處理國家重點(diǎn)實(shí)驗(yàn)室,陜西 西安 710071)

        1 概 述

        HXDSP1042是中國電子科技集團(tuán)第三十八研究所在BWDSP100單核DSP基礎(chǔ)上研制的首款高性能多核DSP產(chǎn)品,從芯片的硬件架構(gòu)到軟件開發(fā)平臺(tái),再到指令集系統(tǒng),都具有完全自主知識產(chǎn)權(quán)。它是一個(gè)32 位浮點(diǎn)數(shù)字信號處理器,工作主頻700 MHz,時(shí)鐘周期1.4 ns,運(yùn)算能力達(dá)每秒300 億次浮點(diǎn)運(yùn)算或每秒80 億次浮點(diǎn)乘法累加運(yùn)算[1]。HXDSP1042內(nèi)部集成2個(gè)新一代處理器內(nèi)核eC104+,該內(nèi)核是BWDSP100內(nèi)核eC104的增強(qiáng)和改進(jìn)版,其性能得到大幅提升,達(dá)到eC104的3倍,并且其應(yīng)用領(lǐng)域也由雷達(dá)、電子對抗進(jìn)一步擴(kuò)展到了通信、視頻圖像處理和高性能計(jì)算等[2]。眾多的應(yīng)用領(lǐng)域需要更大的計(jì)算帶寬以及更高的數(shù)據(jù)精度,相對于32位數(shù)據(jù)運(yùn)算來說,64位的數(shù)據(jù)計(jì)算可以支持更大的內(nèi)存以及可以運(yùn)行更大范圍的運(yùn)算。通過不斷的研究,目前編譯器HXDSP1042通過改進(jìn)軟件的方式對指令模板進(jìn)行優(yōu)化設(shè)計(jì),實(shí)現(xiàn)了64位數(shù)據(jù)的運(yùn)算,支持64 位數(shù)據(jù)類型的相關(guān)語法,滿足了高速實(shí)時(shí)信號處理的需求[3]。

        雙精度浮點(diǎn)矩陣運(yùn)算函數(shù)屬于矩陣類算法,是最基本的庫函數(shù),矩陣類算法是雷達(dá)信號處理的常用運(yùn)算,在自適應(yīng)波束形成、方向估計(jì)中矩陣運(yùn)算占有相當(dāng)大的比重,它的實(shí)現(xiàn)為上層函數(shù)與處理提供了強(qiáng)大的調(diào)用接口。這些函數(shù)的使用較為頻繁,經(jīng)編譯系統(tǒng)直接生成的代碼性能并不高,不能充分發(fā)揮DSP芯片自身的特點(diǎn),因此選用匯編語言完成庫函數(shù)的設(shè)計(jì),以保證硬件資源利用的最大化。直接從C版本的算法改寫成串行的匯編語言,并沒有結(jié)合DSP芯片的硬件特點(diǎn),存在一定的缺陷,若指令排布不合理,嚴(yán)重的還可能會(huì)發(fā)生Bank沖突。為了解決上述問題,有必要從匯編層面優(yōu)化其性能,提高矩陣乘向量的運(yùn)算效率。高性能的數(shù)據(jù)運(yùn)算,能夠保證信號處理過程的精度以及處理的速度。針對最新一代HXDSP1042平臺(tái)所搭載的函數(shù)庫實(shí)施并行優(yōu)化,不僅能提升相關(guān)應(yīng)用程序的運(yùn)算速度,充分發(fā)揮HXDSP1042的性能,同時(shí)對DSP國產(chǎn)化的實(shí)現(xiàn)也具有實(shí)際意義。

        針對DSP平臺(tái)對其配套的函數(shù)庫進(jìn)行優(yōu)化是比較重要的工作,在此之前就有很多研究人員基于HXDSP平臺(tái)進(jìn)行了一系列的優(yōu)化研究與設(shè)計(jì)。文獻(xiàn)[4]結(jié)合HXDSP1042的特殊指令和硬件邏輯,對中值濾波等圖像濾波函數(shù)進(jìn)行了優(yōu)化,最終使得在四簇流水模式下,所有函數(shù)的性能均提升了51倍以上。文獻(xiàn)[5]采用軟件流水等方式對圖像編碼器進(jìn)行優(yōu)化,通過對編碼器的代碼并行處理與優(yōu)化,使得基于TMS320C6678平臺(tái)的編碼速率由3.30幀/秒提升到159.98幀/秒。文獻(xiàn)[6]針對BWDSP100的硬件特點(diǎn),采用逆序循環(huán)與位反序?qū)ぶ返确绞匠浞职l(fā)揮IO帶寬,高性能實(shí)現(xiàn)了數(shù)字信號處理函數(shù)中的快速傅里葉變換算法,使得1 024點(diǎn)的FFT性能達(dá)到了ADI公司的ADSP-TS201系列的8倍。

        雙精度浮點(diǎn)數(shù)據(jù)運(yùn)算具有更大的計(jì)算帶寬以及更高的精確度,并且能夠處理更復(fù)雜的數(shù)據(jù)。文中主要借鑒已有的一些研究成果,基于循環(huán)展開、軟件流水、向量化和指令調(diào)度等常用優(yōu)化技術(shù),并結(jié)合HXDSP1042硬件體系結(jié)構(gòu)和指令集特點(diǎn),對64位數(shù)據(jù)類型的運(yùn)算函數(shù)庫中的矩陣與向量運(yùn)算進(jìn)行并行優(yōu)化與實(shí)現(xiàn)。實(shí)驗(yàn)結(jié)果表明,相比優(yōu)化前的串行算法結(jié)構(gòu),并行優(yōu)化后的函數(shù)加速比達(dá)到了11以上。

        2 研究背景

        2.1 HXDSP1042介紹

        HXDSP1042遵循兼容原則,保證“魂芯一號”(BWDSP100)程序運(yùn)行,內(nèi)部集成了2個(gè)新一代處理器內(nèi)核eC104+,如圖1所示,該內(nèi)核的硬件結(jié)構(gòu)在一代處理器BWDSP100的內(nèi)核eC104基礎(chǔ)上進(jìn)行了增強(qiáng)和優(yōu)化。

        圖1 eC104+的內(nèi)核架構(gòu)

        2.1.1 提升運(yùn)算性能

        HXDSP1042仍采用16發(fā)射VLIW和4路SIMD混合結(jié)構(gòu)的EfficiencyCore技術(shù)。核內(nèi)的執(zhí)行部件包含在4個(gè)執(zhí)行宏中,但執(zhí)行宏的功能在eC104的基礎(chǔ)上進(jìn)行了增強(qiáng),從而極大地提升了DSP的運(yùn)算性能。其中, MUL由原來的4個(gè)擴(kuò)展到了8個(gè),SHF由原來的2個(gè)擴(kuò)展到了4個(gè),并且通用寄存器也增加了一倍。具體內(nèi)容如表1所示。

        2.1.2 擴(kuò)展指令集

        所支持的指令操作由之前的600多條增長到了1 300多條,擴(kuò)展了謂詞指令,支持條件執(zhí)行,增加了面向圖像處理、通信的加速指令,大幅提升了指令執(zhí)行效率。

        表1 執(zhí)行宏中的執(zhí)行部件

        2.1.3 優(yōu)化存儲(chǔ)空間

        HXDSP1042在存儲(chǔ)空間劃分上有優(yōu)化,程序空間和數(shù)據(jù)空間在物理上分離,相對于BWDSP100的3個(gè)內(nèi)存塊,其內(nèi)存塊增加到6個(gè),每個(gè)內(nèi)存塊(block)的大小為256 K*32 bit。雙內(nèi)核共享256 K字指令存儲(chǔ)器(SRAM),提高了該DSP的多任務(wù)調(diào)度效率。

        2.1.4 流水線擴(kuò)展

        流水線擴(kuò)展到了13級。其中取指令占3級,指令緩沖占3級,指令譯碼占4級,取操作數(shù)占1級,指令執(zhí)行占1級,指令結(jié)果寫回占1級。影響指令執(zhí)行的因素中數(shù)據(jù)相關(guān)、數(shù)據(jù)bank 沖突、原子操作、訪問核外存儲(chǔ)資源引發(fā)的等待,均可引發(fā)指令流水的停頓,需要在算法優(yōu)化過程中避免。

        2.1.5 豐富的外設(shè)

        HXDSP1042集成6對高速SerDes接口,工作在x4模式,支持協(xié)議包括RapidIO(最多2對)、PCIe3.0(最多1對)及JESD204B(最多3對)等協(xié)議。由于支持JESD204B協(xié)議,“魂芯二號”DSP可實(shí)現(xiàn)與ADC/DAC器件的高速直接互聯(lián)。此外,“魂芯二號”DSP還集成有DDR3/4、Ethernet、UART、GPIO、I2C和并口等常用外設(shè),方便用戶使用。

        2.2 HXDSP1042 SIMD指令的特性分析

        HXDSP計(jì)算指令的通用格式如下:

        [Macro]Rm=Rn op Rs

        Macro是執(zhí)行宏的代號,op是操作,符號“‖”連接多個(gè)可并行指令,比如:xRm=Rn+Rs是Scalar指令,表示在X宏上執(zhí)行整數(shù)加法操作,xyztRm=Rn+Rs是SIMD指令,表示在{X,Y,Z,T}四個(gè)宏上同時(shí)執(zhí)行整數(shù)加法操作,等于xRm=Rn+Rs‖yRm=Rn+Rs‖zRm=Rn+Rs‖tRm=Rn+Rs。

        2.3 HXDSP1042 SIMD指令的特性分析

        HXDSP雖然采用了SIMD架構(gòu),但并沒有提供傳統(tǒng)意義上的長向量化部件,而是提供了很多向量化指令[7]。文中經(jīng)常用到的指令包括:64位浮點(diǎn)數(shù)據(jù)的乘法指令、加減法指令以及雙字尋址指令等。以下是常用指令的詳細(xì)說明。由于在HXDSP中只有32位寄存器,因此對于64位數(shù)據(jù)的存儲(chǔ)需要利用原有的32位寄存器分別存儲(chǔ)64位數(shù)據(jù)的高位和低位,64位浮點(diǎn)的加減法的實(shí)現(xiàn)需要四條微操作指令:

        {Macro}DFHACCk=DFHRm+1±DFHRn+1

        {Macro}DFLACCk=DFLRm±DFLRn

        {Macro}DFHRs+1=DFHACCk

        {Macro}DFLRs=DFLACCk

        其中,DFHACCk和DFLACCk在指令中存儲(chǔ)的是64位加減法的結(jié)果。HRm、LRm兩個(gè)寄存器分別存儲(chǔ)64位浮點(diǎn)數(shù)的高低32位,代表一個(gè)64位浮點(diǎn)數(shù),這兩個(gè)通用寄存器的索引號必須連續(xù)。存儲(chǔ)結(jié)果記為DFRs+1:s,Rs+1存儲(chǔ)64位浮點(diǎn)數(shù)的高32位,Rs存儲(chǔ)低32位。在計(jì)算時(shí)需要先算高位數(shù)再算低位數(shù),等高低位數(shù)都計(jì)算完成才可將結(jié)果保存至寄存器,并且以上4個(gè)微操作的ALU選擇“k”必須相同,才能完成一次64位浮點(diǎn)數(shù)減法,占一個(gè)ALU。對于double乘法的實(shí)現(xiàn),需要通過兩條指令組合進(jìn)行使用,有如下兩種方式:

        {Macro}QMACCH=DFRm+1:m*DFRn+1:n

        {Macro}DFRs+1:s=QMACCH

        或:

        {Macro}QMACCL=DFRm+1:m*DFRn+1:n

        {Macro}DFRs+1:s=QMACCL

        其中,QMACCH和QMACCL在指令中存儲(chǔ)的都是64位乘法的結(jié)果。該指令實(shí)現(xiàn)的功能為將寄存器Rm+1:m中存儲(chǔ)的64位浮點(diǎn)數(shù)與Rn+1:n中的64位浮點(diǎn)數(shù)相乘,結(jié)果存入Rs+1:s中。兩種方式實(shí)現(xiàn)的功能都是64位浮點(diǎn)數(shù)據(jù)的乘法,其中{Macro}表示指定某個(gè)或某些宏內(nèi)進(jìn)行運(yùn)算,如果{Macro}為空就表示四個(gè)宏上都進(jìn)行乘法運(yùn)算。

        3 基于HXDSP1042的優(yōu)化分析

        本節(jié)使用到的優(yōu)化方案,其著力點(diǎn)在于消除性能瓶頸,試圖通過多讀多寫的方式,盡可能讓所有功能部件參與運(yùn)算,鋪滿流水線,從而獲得函數(shù)執(zhí)行性能和效率的提升。

        3.1 特殊指令

        雙字尋址傳輸指令允許程序在1個(gè)時(shí)鐘周期內(nèi)讀取多個(gè)字,進(jìn)一步減少函數(shù)的訪存次數(shù),如:

        {X,Y,Z,T} Rs+1:s=[Un+=Um,Uk]

        [Un+=Um,Uk]={X,Y,Z,T}Rs+1:s

        第一條指令是讀訪存指令, Un是基地址,Uk是在Un地址基礎(chǔ)上的調(diào)整量,Um則是指令執(zhí)行后基地址Un的修正量。指令采用雙字節(jié)尋址,故指令1表示能夠一次性讀出[Un]和[Un+1]、[Un+2Uk]和[Un+2Uk+1]、[U0+2×2U2]和[U0+2×2U2+1]、[U0+3×2U2]和[U0+3×2U2+1]共8個(gè)地址的數(shù)據(jù),并將第這8個(gè)地址的數(shù)據(jù)依次送到4個(gè)宏的同名寄存器{X,Y,Z,T} Rs+1:s。第二條指令是寫存儲(chǔ)指令。由于Uk的大小不確定,如果某兩個(gè)或兩個(gè)以上的地址落在同一存儲(chǔ)器bank上,就會(huì)產(chǎn)生bank沖突,一旦產(chǎn)生bank沖突,必須使整個(gè)流水線停頓,直到所有的數(shù)據(jù)被正確的讀出或?qū)懭?,才能恢?fù)正常流水。

        移位器的使用:移位器的作用在于對源操作數(shù)進(jìn)行任意裁減、分解、移位和拼接等。濾波算法里涉及到一些求商的計(jì)算,可使用移位器來代替需要迭代的除法實(shí)現(xiàn)。比如,要計(jì)算單精度浮點(diǎn)數(shù)r4除以32的值,通常情況下為了保證浮點(diǎn)數(shù)據(jù)的精度,需要對除法計(jì)算進(jìn)行迭代,此時(shí)用算術(shù)移位器來做除法計(jì)算只需要一個(gè)微指令r4 ashift -5就可以實(shí)現(xiàn)。

        3.2 數(shù)據(jù)讀取操作并行技術(shù)

        BWDSP體系結(jié)構(gòu)中具有三個(gè)地址產(chǎn)生器(U,V,W),相互獨(dú)立工作,HXDSP104X內(nèi)核內(nèi)部數(shù)據(jù)總線一共有四條,為兩讀兩寫,同一時(shí)間最多只允許三條總線工作,也就是說一個(gè)時(shí)鐘周期內(nèi)最多進(jìn)兩組數(shù)。在矩陣與向量計(jì)算的循環(huán)體內(nèi)可使用r11:10=[u0+=8,1]‖r15:14=[v0+=8,1]‖[w0+=2,1]=r61:60并行指令實(shí)現(xiàn)兩讀一寫的操作,或者使用[u0+=8, 1]=r3:2‖[v0+=8, 1]=r1:0‖r5:4=[w0+=8, 1]實(shí)現(xiàn)兩寫一讀的操作,也就是支持同時(shí)3條讀寫指令,使得在一個(gè)指令行內(nèi)可讀取多個(gè)向量數(shù)據(jù),提升計(jì)算效率。

        HXDSP芯片指令并行的優(yōu)化指的是同一指令同時(shí)控制多個(gè)運(yùn)算單元執(zhí)行相同操作的優(yōu)化。SIMD架構(gòu)使得在一條指令中便可以操作多條數(shù)據(jù)流,各個(gè)運(yùn)算宏之間同種運(yùn)算部件進(jìn)行相同的操作可以用一條指令來控制,這樣就可以很好地兼顧運(yùn)算部件控制的靈活性和計(jì)算效率之間的矛盾。HXDSP1042內(nèi)一共有4個(gè)互相獨(dú)立的計(jì)算單元(4路SIMD),依次是簇X,Y,Z和T。每個(gè)計(jì)算簇內(nèi)都有ALU、MUL、SHF、SPU和寄存器組,這些器件可以對不同類型的數(shù)據(jù)進(jìn)行計(jì)算與操作。并且每個(gè)計(jì)算簇均有相應(yīng)的讀寫端口,端口通過芯片內(nèi)部讀寫數(shù)據(jù)總線與片上SRAM內(nèi)存連接,共形成了4條數(shù)據(jù)通道[8]。由于HXDSP芯片內(nèi)部具有以上特點(diǎn),因此在具體優(yōu)化運(yùn)算函數(shù)時(shí),要對算子進(jìn)行具體分析,使其充分利用硬件資源單元。使用單條指令在4個(gè)運(yùn)算邏輯單元操作不同通道的數(shù)據(jù),從而實(shí)現(xiàn)算子在HXDSP內(nèi)部的細(xì)粒度并行計(jì)算。

        3.3 零開銷循環(huán)機(jī)制

        程序中的條件分支是影響程序性能的一個(gè)重要原因,普通的“if”循環(huán)判斷指令在ECS的環(huán)境中需要占10個(gè)時(shí)鐘周期的時(shí)間,這使得有循環(huán)操作算法的運(yùn)算總開銷大大增加。而使用零開銷循環(huán)指令,相對于普通的“if”指令而言只需占用1個(gè)時(shí)鐘周期,降低了循環(huán)總開銷,零開銷循環(huán)的作用就相當(dāng)于自動(dòng)計(jì)數(shù)裝置,一旦索引值達(dá)到循環(huán)體限定的數(shù)字就會(huì)自動(dòng)跳出[9]。HXDSP1042中的指令集提供了LCx(x=0,1,2,3)指令專用與零開銷循環(huán),指令形式為“if LCx B loop”,表示若LCx為真則跳轉(zhuǎn)至名為“l(fā)oop”的分支處。

        3.4 循環(huán)展開與軟件流水技術(shù)

        基于循環(huán)展開的優(yōu)化指的是在一次循環(huán)中展開多次相同的循環(huán)的優(yōu)化,基于軟件流水的優(yōu)化指的是將所述多次相同的循環(huán)并行交叉執(zhí)行。循環(huán)展開是一種算法實(shí)現(xiàn)級的優(yōu)化,通過將循環(huán)體代碼重復(fù)多次來實(shí)現(xiàn),這也是一種向量化的思想。循環(huán)展開通過將迭代間的并行轉(zhuǎn)化為迭代內(nèi)的并行,讓循環(huán)體內(nèi)部的運(yùn)行周期盡可能減少。當(dāng)使用到的數(shù)據(jù)之間不相關(guān)時(shí),這些指令的流水線是可以并行起來執(zhí)行的[10-12]。

        在庫函數(shù)中,通常程序中的循環(huán)占用了較大的時(shí)間比,因此匯編程序的優(yōu)化主要是對循環(huán)的優(yōu)化。循環(huán)展開是通過增加每次迭代元素的數(shù)量,來減少循環(huán)的迭代次數(shù)。同時(shí)流水線技術(shù)可以讓多條指令線重疊起來,并行執(zhí)行,以此提高程序并行度[13]。

        3.5 指令調(diào)度

        HXDSP采用可讀性強(qiáng)的匯編指令,VLIW(超長指令字)架構(gòu)使得單周期內(nèi)可并行執(zhí)行16條指令,同時(shí)應(yīng)用程序分支預(yù)測機(jī)制減少了分支程序在流水線中的開銷。為了避免流水線的空轉(zhuǎn),對于不存在相關(guān)依賴或沖突的指令可以組合拼成一個(gè)指令行,提高指令并行度[14]。指令調(diào)度即從程序中識別出指令級可并行的成分,并利用這些可并行性合理安排指令的執(zhí)行順序,已達(dá)到最大限度發(fā)揮目標(biāo)機(jī)所提供的處理能力的目的。目前該編譯器還未實(shí)現(xiàn)自動(dòng)化識別,需要進(jìn)行手動(dòng)指令調(diào)度來盡可能地提升硬件利用率[15]。

        4 雙精度浮點(diǎn)矩陣與向量運(yùn)算函數(shù)的優(yōu)化實(shí)現(xiàn)

        4.1 雙精度浮點(diǎn)矩陣與向量運(yùn)算函數(shù)

        為了滿足一些對高精度浮點(diǎn)運(yùn)算的科學(xué)計(jì)算的需求,函數(shù)庫中最常用的單精度浮點(diǎn)基本運(yùn)算都有與之對應(yīng)的雙精度浮點(diǎn)數(shù)據(jù)的運(yùn)算。對于32位浮點(diǎn)類型數(shù)據(jù)只能保證6位7位有效數(shù)字,不能滿足一些更高精度的數(shù)據(jù)運(yùn)算,而64位的浮點(diǎn)雙精度數(shù)據(jù)類型能夠保證15位、16位的有效數(shù)字,滿足大多數(shù)浮點(diǎn)數(shù)據(jù)運(yùn)算的要求[16]。 “xmulv”表示double型實(shí)數(shù)矩陣乘以double型向量。對于矩陣和向量之間的操作,主要是乘法以及累加計(jì)算的操作,但是在實(shí)際結(jié)合硬件架構(gòu)進(jìn)行匯編優(yōu)化時(shí),需要考慮的因素眾多,不僅要滿足理論運(yùn)行時(shí)間,還要達(dá)到精度的技術(shù)指標(biāo)。設(shè)A=(aij)是一個(gè)m×s的矩陣,B=(bi)是一個(gè)s×1的向量,則矩陣乘以向量(xmulv)的通用公式定義為:

        ci=ai1b1+ai2b2+…+aisbs,i=1,2,…,m

        (1)

        展開后可表示為:

        (2)

        4.2 矩陣向量乘運(yùn)算的優(yōu)化實(shí)現(xiàn)

        文中實(shí)驗(yàn)的軟件平臺(tái)為“魂芯”系列處理器的統(tǒng)一軟件開發(fā)平臺(tái)ECS,所使用的軟件版本為ECS2.0,使用的指令集為BW32v2最新版指令集。HXDSP1042處理器的工作頻率為700 MHz,所以一個(gè)時(shí)鐘周期為1.4 ns。文中的工作將以矩陣乘以向量運(yùn)算函數(shù)(xmulv)為例進(jìn)行闡述。

        4.2.1 算法實(shí)施層的優(yōu)化

        矩陣乘以向量(xmulv)算法實(shí)現(xiàn)的偽代碼如下:

        算法1:xmulv函數(shù)的偽代碼。

        輸入:矩陣pa,向量pb

        輸出:pc=pa*pb

        (1)function xmulv(pa, pb, pc)

        (2)for row=0→a-1 do

        (3)pc[i]=0

        (4)for col=0→b-1 do

        (5)pc[i]+=pa[i*b+k] * pb[k]

        (6)end for

        (7)end for

        將未經(jīng)優(yōu)化的原始算法記為算法1,這部分的矩陣乘向量函數(shù)的實(shí)現(xiàn)是串行的,沒有發(fā)揮出HXDSP的底層架構(gòu)優(yōu)勢,因此需要結(jié)合具體的硬件架構(gòu)和指令特點(diǎn)來對算法的實(shí)現(xiàn)進(jìn)行優(yōu)化。在進(jìn)行細(xì)粒度并行優(yōu)化前,先對其進(jìn)行算法實(shí)施層的優(yōu)化:將兩層for循環(huán)用3.3節(jié)介紹的零開銷循環(huán)進(jìn)行改寫。對于向量運(yùn)算,只需要一層循環(huán),對于矩陣運(yùn)算則至少需要兩層循環(huán)來實(shí)現(xiàn)。矩陣(M×N)乘向量(N×1)的運(yùn)算,外層需要M次循環(huán)迭代,內(nèi)層需要N次循環(huán)迭代,串行運(yùn)算時(shí)共需要M×N×10個(gè)時(shí)鐘周期。將普通的“if”判斷換成零開銷循環(huán)判斷,所占用的運(yùn)行時(shí)鐘周期可以至少降到M×N個(gè),顯著降低了循環(huán)總開銷,得到了算法2。64位數(shù)據(jù)的矩陣乘以向量函數(shù),具體實(shí)現(xiàn)時(shí)共有兩層循環(huán),內(nèi)層循環(huán)實(shí)現(xiàn)矩陣的行與向量的乘累加結(jié)果,外層循環(huán)控制行的移位操作,其匯編形式核心代碼循環(huán)展開之前的形式如下:

        算法2 :矩陣乘向量運(yùn)算串行計(jì)算。

        輸入:64位數(shù)據(jù)的矩陣,64位數(shù)據(jù)的向量

        輸出:矩陣乘以向量的結(jié)果

        (1)_xmulv_rowloop://外層循環(huán)

        (2)_xmulv_maccloop: //內(nèi)層循環(huán)

        (3)xr11:10=[u0+=8,1] //取矩陣的值(每次取一個(gè)值)

        (4)xr15:14=[v0+=8,1] //取向量的值(每次取一個(gè)值)

        (5)xQMACCH=DFR11:10*DFR15:14 //相乘

        (6)xDFR31:30=QMACCH

        (7)xDFHACC0=DFHR41+DFHR31 //將結(jié)果存至累加器

        (8)xDFLACC0=DFLR40+DFLR30

        (9)xDFHR41=DFHACC0 //存儲(chǔ)高位值

        (10)xDFLR40=DFLACC0 //存儲(chǔ)低位值

        (11).code_align 16

        (12)if lc0 b _xmulv_maccloop

        (13)_xmulv_maccexit:

        (14)[w0+=2,1]=xr41:40 //存儲(chǔ)結(jié)果值到寄存器w0

        (15).code_align 16

        (16)if lc2 b _xmulv_rowloop

        在這種未進(jìn)行循環(huán)展開的形式下,一個(gè)矩陣乘向量的計(jì)算總共需要做M×N×2次訪存和乘累加的計(jì)算操作,M×N次內(nèi)層循環(huán)判斷,M次外層循環(huán)判斷。對于64位數(shù)據(jù)的運(yùn)算指令本身就比32位計(jì)算要復(fù)雜,這使得函數(shù)運(yùn)算所需的理論運(yùn)行時(shí)間太大,達(dá)不到庫函數(shù)的技術(shù)指標(biāo)。

        HXDSP芯片內(nèi)部包含4個(gè)執(zhí)行宏,每個(gè)執(zhí)行宏包含64字的通用寄存器組,通用寄存器組內(nèi)又分為A面寄存器和B面寄存器,所以每個(gè)宏內(nèi)有128個(gè)通用寄存器,四個(gè)宏的運(yùn)算可以并行。并且,在HXDSP的內(nèi)核eC104+中,內(nèi)和數(shù)據(jù)總線有2條讀總線和2條寫總線,總線提供的數(shù)據(jù)字寬為3個(gè)64 bit,最多可同時(shí)利用其中的3條總線實(shí)現(xiàn)傳輸,即同時(shí)最多支持兩讀一寫或者兩寫一讀的讀寫模式。在具體實(shí)現(xiàn)時(shí),可以同時(shí)讀取4個(gè)矩陣中的雙精度浮點(diǎn)實(shí)數(shù)和4個(gè)向量中的數(shù)進(jìn)行計(jì)算。循環(huán)內(nèi)部的乘法和累加循環(huán)計(jì)算需要按照3.4節(jié)的方法將循環(huán)進(jìn)行展開,具體的方式如下:

        上述代碼執(zhí)行時(shí),每次從矩陣和向量中分別取出一個(gè)數(shù)進(jìn)行相乘累加運(yùn)算,只利用了eC104+內(nèi)核中的一個(gè)執(zhí)行宏X,沒有充分利用核內(nèi)的數(shù)據(jù)總線和運(yùn)算資源??紤]SIMD指令與雙字尋址方法,可以從4個(gè)宏中同時(shí)讀取數(shù)據(jù)。每次循環(huán)完成4個(gè)輸入元素的運(yùn)算,雙字傳輸方式使得每次都能從各個(gè)執(zhí)行宏中讀取1個(gè)64位的數(shù)據(jù),即64 bit×4=256 bit,占滿一條讀總線。向量數(shù)據(jù)的訪存占用另一條讀總線與之并行,這使得訪存操作次數(shù)由原來的M×N減少到了M×N×2/8。同時(shí),結(jié)合循環(huán)展開的優(yōu)化技術(shù),可優(yōu)化循環(huán)體中的讀取、處理和存儲(chǔ)操作,將循環(huán)過程中不相關(guān)的數(shù)據(jù)通過循環(huán)展開并行執(zhí)行,減少循環(huán)過程中的運(yùn)行時(shí)間。這使得內(nèi)層循環(huán)次數(shù)減少到了1/4。得到優(yōu)化后的核心代碼例子如下:

        算法3:矩陣乘向量運(yùn)算并行優(yōu)化。

        輸入:64位數(shù)據(jù)的矩陣,64位數(shù)據(jù)的向量

        輸出:矩陣乘以向量的結(jié)果

        (1)_xmulv_rowloop:

        (2)_xmulv_maccloop:

        (3)r11:10=[u0+=8,1]‖r15:14=[v0+=8,1] /*同時(shí)取矩陣與向量的值(每個(gè)指令行可取4個(gè)64bit的值)*/

        (4)QMACCH=DFR11:10*DFR15:14 //4個(gè)值的乘法同時(shí)計(jì)算

        (5)DFHACC0=DFHR41+DFHR31‖DFR31:30=QMACCH

        (6)DFLACC0=DFLR40+DFLR30‖DFHR41=DFHACC0

        (7)DFLR40=DFLACC0

        (8).code_align 16

        (9)if lc0 b _xmulv_maccloop

        (10)_xmulv_maccexit:

        (11)[w0+=2,1]=r41:40 //存儲(chǔ)結(jié)果值到寄存器w0

        (12).code_align 16

        (13)if lc2 b _xmulv_rowloop

        在實(shí)現(xiàn)過程中,充分考慮軟件流水技術(shù),通過重組循環(huán)來減少指令間的延遲,設(shè)法使得不同循環(huán)體之間的指令能夠并行執(zhí)行,從而使得循環(huán)數(shù)目成倍減少。此時(shí),得到了算法3,算法3相對于算法2的平均性能提升了1.5倍。接下來就是按照3.5節(jié)介紹的指令重排技術(shù)讓指令盡可能地并行執(zhí)行,減少運(yùn)行時(shí)間,得到算法4,相對于算法3的實(shí)現(xiàn)性能平均提升了1.4倍。算法2、3、4的性能比較如圖2所示。

        圖2 算法2~算法4的性能比較

        此時(shí),用自動(dòng)化測試平臺(tái)對優(yōu)化后的算法效率進(jìn)行測試發(fā)現(xiàn)算法的性能并未達(dá)到技術(shù)指標(biāo),并且輸入的矩陣規(guī)格越大所耗費(fèi)的運(yùn)行時(shí)間越多。因此為了減少運(yùn)行時(shí)間,提高運(yùn)行效率,需要對軟件流水的排布作進(jìn)一步的優(yōu)化。

        4.2.2 流水排布的優(yōu)化

        一般的64位矩陣運(yùn)算中循環(huán)體軟件流水示意圖如圖3所示。

        圖3 通用的64位矩陣計(jì)算軟件流水示意圖

        對于雙精度浮點(diǎn)的矩陣乘向量函數(shù),在HXDSP中的存儲(chǔ)與計(jì)算都是將其高位和低位分別存儲(chǔ)在32位寄存器中,因此在算法處理過程中所花費(fèi)的時(shí)鐘周期相對單精度數(shù)據(jù)計(jì)算要多。在進(jìn)入循環(huán)核心期之前,數(shù)據(jù)讀取和準(zhǔn)備操作占用了相當(dāng)大一部分運(yùn)行時(shí)間。因此,若每次循環(huán)都要從循環(huán)起始期開始執(zhí)行,在跳出循環(huán)核心期的時(shí)候會(huì)有一部分循環(huán)體是已啟動(dòng)但并未執(zhí)行操作。當(dāng)運(yùn)算的矩陣規(guī)模較大時(shí),這些循環(huán)體已啟動(dòng)但并未執(zhí)行操作的數(shù)據(jù)就會(huì)造成取數(shù)冗余,會(huì)大大增加函數(shù)整體的運(yùn)行時(shí)間。為了讓整個(gè)運(yùn)算充分地并行執(zhí)行,提升數(shù)據(jù)量大時(shí)的計(jì)算效率并避免讀取冗余的數(shù)據(jù),需要對預(yù)設(shè)的軟件流水排版進(jìn)行調(diào)整,讓每一次循環(huán)取出的數(shù)據(jù)都能被完全執(zhí)行。解決方法就是讓循環(huán)核心期的每一次零開銷循環(huán)判斷跳轉(zhuǎn)到特定的位置,在該位置將之前循環(huán)起始期所取出的全部數(shù)據(jù)計(jì)算完,然后再跳轉(zhuǎn)至矩陣中下一行需要計(jì)算的數(shù)據(jù)。

        下面給出匯編算法主體循環(huán)部分中的一個(gè)cycle進(jìn)行具體說明:

        .code_align 16

        if nlc0 b _xmulv_maccexit2‖DFLR40=DFLACC0

        r21:20=[u0+=8,1]‖r25:24=[v0+=8,1]

        ‖QMACCL=DFR23:22*DFR27:26

        ‖DFR35:34=QMACCH

        ‖DFHACC3=DFHR47+DFHR37

        ‖DFLACC2=DFLR44+DFLR34

        ‖DFHR43=DFHACC1

        主循環(huán)中每次循環(huán)可處理4個(gè)64位數(shù)據(jù)的取值、運(yùn)算和累加。BWDSP1042算法編寫只有A面寄存器時(shí)支持16個(gè)slot,當(dāng)一個(gè)cycle中存在A、B面寄存器傳輸時(shí),最多只支持14個(gè)slot,這就使得算法編寫有時(shí)陷入瓶頸,編寫時(shí)應(yīng)盡量避免這種情況。上述這段代碼中,第一段代碼共占用3個(gè)slot,其中跳轉(zhuǎn)指令占用了2個(gè)slot;第二段代碼共占用了7個(gè)slot,共占用了8個(gè)MUL,8個(gè)ALU,所以ALU和MUL的利用率為100%。主循環(huán)體中的每段代碼執(zhí)行完成之后,都會(huì)跳轉(zhuǎn)至對應(yīng)的位置即“Loop_exit n”處,目的是為了將之前讀取的數(shù)計(jì)算完。

        調(diào)整后的循環(huán)排布主要有兩部分做了調(diào)整:第一部分是循環(huán)結(jié)尾部分,不再使用統(tǒng)一的結(jié)尾方式。而是讓每個(gè)從循環(huán)體內(nèi)跳出的分支都有一個(gè)單獨(dú)的結(jié)構(gòu)去將之前取出的數(shù)完全計(jì)算完,不至于造成取數(shù)冗余。計(jì)算的同時(shí)再并行上矩陣運(yùn)算的下一行的循環(huán)起始與核心期,使得每個(gè)指令行都是充分地并行執(zhí)行??梢钥闯觯瑢ο乱恍杏?jì)算的處理部分是相同的,這樣做的目的是為了方便計(jì)算完下一行的數(shù)之后重新跳轉(zhuǎn)至“Loop”處,接著計(jì)算剩余的數(shù)。

        第二部分是循環(huán)次數(shù)的調(diào)整。由于Loop循環(huán)體內(nèi)的每個(gè)指令行執(zhí)行完都會(huì)跳轉(zhuǎn)至不同的分支指令,因此需要對零開銷循環(huán)次數(shù)lcx根據(jù)具體的方案進(jìn)行調(diào)整。對于文中所實(shí)現(xiàn)的矩陣乘運(yùn)算函數(shù),循環(huán)起始期用了10拍取出了10×4個(gè)數(shù)(每一拍取出4個(gè)64位的數(shù)),核心期用了10拍取出了10×4個(gè)數(shù)。因此內(nèi)層循環(huán)lc0初始值為n/4-10,經(jīng)過下一行計(jì)算時(shí)lc0被賦值為n/4-20。將該思想應(yīng)用到算法中后得到算法5。

        在以上優(yōu)化的基礎(chǔ)上,再對匯編代碼的并行性進(jìn)一步挖掘,再次利用3.5節(jié)的指令調(diào)度技術(shù)將算法再次優(yōu)化。在64位運(yùn)算中,對于累加計(jì)算,需要提前設(shè)定幾個(gè)寄存器作為累加器來存儲(chǔ)每回累加計(jì)算的結(jié)果。這些累加器的初始化以及對于零開銷循環(huán)次數(shù)lc0、lc1的設(shè)置可以通過指令調(diào)度將其與其他不相關(guān)的指令行并行來避免單獨(dú)占用一個(gè)運(yùn)行周期。此時(shí),得到算法6。算法5和算法6的性能比較如圖4所示。

        圖4 算法5和算法6的性能比較

        4.3 64位矩陣與向量運(yùn)算優(yōu)化前后性能對比

        表2是具體的對矩陣乘向量函數(shù)(xmulv)進(jìn)行優(yōu)化前后的性能對比。其中cycles為時(shí)鐘周期的單位,表中結(jié)果數(shù)據(jù)為使用算法優(yōu)化前后在HXDSP1042處理器上執(zhí)行不同數(shù)據(jù)規(guī)模程序時(shí)的具體時(shí)鐘周期數(shù)。

        由表2可得,算法xmulv相對于優(yōu)化前的初始算法平均性能提升了大概14.96倍。實(shí)驗(yàn)結(jié)果表明,VLIW DSP處理器下文中的優(yōu)化方法充分利用處理器強(qiáng)大的計(jì)算能力和資源優(yōu)勢,可使得64位的矩陣函數(shù)的運(yùn)算時(shí)鐘周期明顯減少,可顯著提升該函數(shù)在VLIW DSP上的執(zhí)行性能。

        表2 矩陣乘向量函數(shù)(xmulv)優(yōu)化前后的對比

        5 結(jié)束語

        針對HXDSP1042芯片體系結(jié)構(gòu)特點(diǎn),文中對其軟件系統(tǒng)所配套的64位運(yùn)算函數(shù),通過利用數(shù)據(jù)讀取操作并行、零開銷循環(huán)、循環(huán)展開與軟件流水、指令調(diào)度等方法進(jìn)行優(yōu)化,實(shí)現(xiàn)了相關(guān)函數(shù)匯編代碼。實(shí)驗(yàn)結(jié)果表明,在充分挖掘其并行性下,雙精度浮點(diǎn)型矩陣乘以向量函數(shù)的加速比能達(dá)到11以上,證明匯編函數(shù)的優(yōu)化效果可以提升函數(shù)在HXDSP上的計(jì)算性能。該并行性優(yōu)化方法對該系列的DSP上的函數(shù)基本適用,其中優(yōu)化后的循環(huán)展開與軟件流水排布對類似的矩陣運(yùn)算都具有參考意義。在下一步工作中,將對雙精度浮點(diǎn)運(yùn)算函數(shù)的操作指令進(jìn)行改進(jìn),以進(jìn)一步完善與優(yōu)化雙精度庫函數(shù)的計(jì)算效率,使其滿足大量需要高精度浮點(diǎn)運(yùn)算的計(jì)算需求,提高工作效率。

        猜你喜歡
        指令優(yōu)化
        聽我指令:大催眠術(shù)
        超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
        民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
        關(guān)于優(yōu)化消防安全告知承諾的一些思考
        一道優(yōu)化題的幾何解法
        由“形”啟“數(shù)”優(yōu)化運(yùn)算——以2021年解析幾何高考題為例
        ARINC661顯控指令快速驗(yàn)證方法
        LED照明產(chǎn)品歐盟ErP指令要求解讀
        電子測試(2018年18期)2018-11-14 02:30:34
        殺毒軟件中指令虛擬機(jī)的脆弱性分析
        基于低碳物流的公路運(yùn)輸優(yōu)化
        国产在线观看91一区二区三区| 国产成人精品免费视频大全| 久久久国产视频久久久| 国产无套一区二区三区久久| 久久精品国产亚洲av麻豆图片| 波多野结衣中文字幕久久| 99精品久久久中文字幕| 午夜麻豆视频在线观看| 亚洲精品无码久久久久y| 欧美黑人又粗又硬xxxxx喷水| 精品一精品国产一级毛片| 中文字幕丰满人妻有码专区| 日本精品一区二区高清| 久久久久久久久蜜桃| 国产成人精品午夜福利免费APP| 日韩十八禁在线观看视频| 99久久国产精品网站| 人妻夜夜爽天天爽一区| 欧洲亚洲视频免费| 久久99国产精品久久99密桃| 人妻丰满熟妇aⅴ无码| 精品久久久久久久久久中文字幕| 欧美精品aaa久久久影院| 久久国产精品免费一区二区三区| 三个男吃我奶头一边一个视频| 中文字幕日本最新乱码视频| 国产亚洲欧美另类久久久| 久久亚洲免费精品视频| 久久久国产打桩机| 亚洲国产一区二区在线| 狼人综合干伊人网在线观看| 丰满人妻久久中文字幕| 日韩成人大屁股内射喷水| 日韩成人精品日本亚洲| 91熟女av一区二区在线| 亚洲精品无码久久久久去q| 国产伦精品一区二区三区视| 久久天堂精品一区专区av| 一本到在线观看视频| 亚洲色欲久久久久综合网| 久久精品国产精品亚洲艾|