




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
dsp工作階段:工作流程一般分為三個(gè)階段。階段一:直接依據(jù)需要用C語(yǔ)言實(shí)現(xiàn)功能。在實(shí)際的DSP應(yīng)用中,很多算法都是CC64Xprofile?clock工具測(cè)試程序運(yùn)行時(shí)間,假設(shè)不能滿(mǎn)足要求,則進(jìn)展其次階段。C64XC階段三:匯編級(jí)的優(yōu)化。將上一階段C程序中優(yōu)化效率較低的局部提出來(lái),用線然后匯編優(yōu)化器通過(guò)安排存放器和循環(huán)優(yōu)化將匯編語(yǔ)言程序轉(zhuǎn)化為利用流水線方式的高速并行匯編程序。下一階段的優(yōu)化。選用C編譯器供給的優(yōu)化選項(xiàng)在編譯器中供給了分為假設(shè)干等級(jí)和種類(lèi)的自動(dòng)優(yōu)化選項(xiàng),如下:-o:使能軟件流水和其他優(yōu)化方法-pm:使能程序級(jí)優(yōu)化-mt:使能編譯器假設(shè)程序中沒(méi)有數(shù)據(jù)存儲(chǔ)混淆,可進(jìn)一步優(yōu)化代碼。-mg:使能分析〔profile〕優(yōu)化代碼-ms:確保不產(chǎn)生冗余循環(huán),從而減小代碼尺寸-mh:允許投機(jī)執(zhí)行使能軟件流水循環(huán)重試,基于循環(huán)次數(shù)對(duì)循環(huán)試用多個(gè)方案,以便選擇最正確方案。依據(jù)實(shí)際編譯的程序,選擇適宜的優(yōu)化選項(xiàng),進(jìn)展源程序的優(yōu)化。減小存儲(chǔ)器相關(guān)性從而不能并行執(zhí)行。設(shè)計(jì)中常承受關(guān)鍵字constconst量或一個(gè)變量的存儲(chǔ)單元保持不變。因此,在代碼中參與關(guān)鍵字const,可以去除指令間的相關(guān)性。例如下面的程序:voidvecsum(short*sum,short*in1,short*in2,unsignedintN){inti;for(i=0;i<N;i++)sum[i]=in1[i]+in2[i];}2(a)sumin1、in2而in1in2sumconstconstvoidvecsum(short*sum,constshort*in1,constshort*in2,unsignedintN){inti;for(i=0;i<N;i++)sum[i]=in1[i]+in2[i];}2(b)const,消退了指令之間的相關(guān)使用內(nèi)聯(lián)函數(shù)〔intrinsics〕內(nèi)聯(lián)函數(shù)是C64X編譯器供給的特地函數(shù),它們與嵌入式的匯編指令是一一CCCunsignedintnorm(intsrc1){unsignedintsign,result=0;sign=src1&0×80000000;while(1){if(sign){if((src1=src1<<1)&sign)result+=1;elsereturnresult;}else{if((src1=src1<<1)|sign)returnresult;elseresult+=1;}}}該源程序代碼冗長(zhǎng),有較多的規(guī)律操作和推斷跳轉(zhuǎn),運(yùn)行效率低下。假設(shè)用內(nèi)result=_norm(src1),削減了代碼長(zhǎng)度,提高了運(yùn)行效率。因此C64Xshortint16bit加減法、比較、移位等操作。在設(shè)計(jì)時(shí),當(dāng)對(duì)連續(xù)的short型數(shù)據(jù)流操作時(shí),應(yīng)當(dāng)位的存放器,然后用內(nèi)部函數(shù)來(lái)對(duì)它們處理〔如_sub2〕,充分運(yùn)用雙16bit16bit盡量少進(jìn)展函數(shù)調(diào)用PC因此是一種利用空間換取時(shí)間的方法。盡量使用規(guī)律運(yùn)算代替乘除運(yùn)算來(lái)代替乘除運(yùn)算,這樣可以加快指令的運(yùn)行時(shí)間。軟件流水線技術(shù)的使用代循環(huán)并行執(zhí)行。在編譯代碼時(shí),可以選擇編譯器的-o2或-o3選項(xiàng),則編譯器將依據(jù)程序盡可能地安排軟件流水線。大地提高程序的運(yùn)行速度。但使用軟件流水線還有下面幾點(diǎn)限制:循環(huán)構(gòu)造不能包含代碼調(diào)用,但可以包含內(nèi)聯(lián)函數(shù)。循環(huán)計(jì)數(shù)器應(yīng)當(dāng)是遞減的。循環(huán)構(gòu)造中不要包含轉(zhuǎn)變循環(huán)計(jì)數(shù)器的代碼。個(gè)循環(huán)。增加流水線中的迭代指令。承受指令亂序技術(shù)程序中,有些指令的執(zhí)行挨次沒(méi)有嚴(yán)格的要求,可以作出一些位置上的調(diào)令的相關(guān)性,增加運(yùn)行時(shí)的并行性。合并成一個(gè)循環(huán),從而減小循環(huán)內(nèi)指令的相關(guān)性,增加指令運(yùn)行的并行性。但是要留意不要使循環(huán)過(guò)于簡(jiǎn)潔,以至不能進(jìn)展軟件流水線的優(yōu)化。CC6x的編譯器也供給了最正確化的指令,如在編譯時(shí)加-o3的參數(shù),它可以用軟件來(lái)分析我們的程序是否有可以改進(jìn)的地方,如此C以最有效率的方式重編排程序,來(lái)加快程序速度方法一把浮點(diǎn)運(yùn)算改成定點(diǎn)運(yùn)算式,所以必需改成定點(diǎn)運(yùn)算,而其修改后的執(zhí)行速度也會(huì)加快很多。我們承受Q-format規(guī)格來(lái)表示浮點(diǎn)運(yùn)算。以下將介紹其相關(guān)原理。定點(diǎn)DSP使用固定的小數(shù)點(diǎn)來(lái)表示小數(shù)部份的數(shù)字,這也造成了使用上的限制,而為了要分類(lèi)不同范圍的小數(shù)點(diǎn),我們必需使用Q-format的格式。不同的Q-format2Q15式,要留意在小數(shù)點(diǎn)后的每一位,表示下一位為前一位的二分之一,而MSB)則被指定成有號(hào)數(shù)(Signbit201(7FFFH10(8000HQ15范圍從-1到0.9999694(@1),因此我們可以藉由把小數(shù)點(diǎn)向右移位,來(lái)增加整3Q14-2.01.9999694(@2),然而范圍的增加卻犧牲了準(zhǔn)確度。方法二建立表格(table)AACCsin、cos、exp可以不必再做額外的計(jì)算動(dòng)做,以加速程序。方法三減短程序的長(zhǎng)度Debug原本程序在Debug的階段時(shí),就加了很多用來(lái)偵測(cè)錯(cuò)誤的部份,程序Debug完可以削減程序執(zhí)行時(shí)的時(shí)脈數(shù),加快程序的速度。去除計(jì)算時(shí)脈(clock)功能原本程序可以計(jì)算執(zhí)行程序所需的時(shí)脈數(shù),我們也可以把這些部份給去除,C6x方法四削減I/OAACPCAACC6xAAC1MBDSP缺乏。方法五削減子程序的呼叫(stack)方法六寫(xiě)匯編語(yǔ)言雖然由C言來(lái)取代。方法七利用平行處理的觀念C6x是一顆功能強(qiáng)大的處理器,它CPU的內(nèi)部供給了八個(gè)可以執(zhí)行不同指令動(dòng)作。最終還要知道:第三級(jí)優(yōu)化〔閱歷3216C還差不多c的,假設(shè)里面有很多中斷的話(huà),6000profilerdsppcprofile:profile9CC6xprofileprofile如下表:[8]字段意義CountInclusiveclockIncl-MaxclockExclusiveclockExcl-Maxclock利用這個(gè)profile多,是可以再改進(jìn)的,而針對(duì)它來(lái)作最正確化。匯編代碼級(jí)的優(yōu)化在經(jīng)過(guò)Cprofile譯,匯編優(yōu)化器從輸入的線性匯編代碼中,完成以下功能:查找可以平行執(zhí)行的CPU指令。在軟件流水線期間,處理流水線標(biāo)號(hào)。安排存放器的用法。安排功能單元。優(yōu)化中的問(wèn)題、在優(yōu)化過(guò)程中,總是要對(duì)程序進(jìn)展確定的改動(dòng),這樣常常會(huì)消滅一些問(wèn)題。優(yōu)化結(jié)果的驗(yàn)證、序列最好有幾組,數(shù)據(jù)最好有確定的長(zhǎng)度,這樣驗(yàn)證的更準(zhǔn)確。內(nèi)存泄漏的問(wèn)題、C64XDSP1MB,CPU因此,在程序設(shè)計(jì)中,應(yīng)盡量不用指針,同時(shí)留意進(jìn)展邊界檢測(cè)。程序設(shè)計(jì)的一些方法DSP能,滿(mǎn)足實(shí)際的設(shè)計(jì)要求。把程序和常常要用的數(shù)據(jù)放入片內(nèi)RAMRAMCPURAM時(shí)間。通過(guò)DMA技術(shù)搬移數(shù)據(jù)C64XRAM1MB,但是對(duì)于一些大型的圖像處理算法而DMA不需要的搬到片外,可以大大的提高程序的運(yùn)行速度。CACHEC64XDSPCACHE,就減小了實(shí)際的片內(nèi)可用空間,設(shè)計(jì)中需要留意。volatileconst優(yōu)化匯編代碼在實(shí)現(xiàn)匯編代碼功能后,優(yōu)化匯編代碼的方法包括:并置指令;重寫(xiě)或重組代碼以防止流水線保護(hù)延遲;獵取指令時(shí)最小化延遲。C利用c內(nèi)部函數(shù)計(jì)算各自乘積的和削減推斷轉(zhuǎn)換循環(huán)開(kāi)放軟件流水線方法指針運(yùn)算代替數(shù)組索引求余運(yùn)算,只要求是求2n方的余數(shù),均可使用位操作的方法來(lái)代替。使用增量和減量操作符使用復(fù)合賦值表達(dá)式提取公共的子表達(dá)式〔按數(shù)據(jù)類(lèi)型的長(zhǎng)度排序本地變量〕指向的值循環(huán)優(yōu)化充分分解小的循環(huán)外面循環(huán)計(jì)數(shù)器應(yīng)當(dāng)是遞減的。使用do…while循環(huán)編譯后生成的代碼的長(zhǎng)度短于while循環(huán)。開(kāi)放會(huì)影響矢量運(yùn)算優(yōu)化。Switchcaseswitchswitchswitchswitch選擇好的無(wú)限循環(huán):for跳轉(zhuǎn),比while(1)好CPU元中并行執(zhí)行的沒(méi)有依靠的代碼鏈。就有必要建立中間變量了函數(shù)優(yōu)化Inline不定義不使用的返回值削減函數(shù)調(diào)用參數(shù)全部函數(shù)都應(yīng)當(dāng)有原型定義盡可能使用常量(const)把本地函數(shù)聲明為靜態(tài)的(static)變量?jī)?yōu)化register變量:聲明局部變量的時(shí)候可以使用register會(huì)動(dòng)態(tài)變化,盡量避開(kāi)把一個(gè)變量地址傳遞給另一個(gè)函數(shù)同時(shí)聲明多個(gè)變量?jī)?yōu)于單獨(dú)聲明變量*********************************************************依據(jù)C6000的軟件編程流程,對(duì)Viterbi算法的編程及其優(yōu)化可分為三個(gè)階段來(lái)進(jìn)展。這三個(gè)階段分別為:開(kāi)發(fā)C代碼、優(yōu)化C代碼、編寫(xiě)線性匯編代碼。在代碼編寫(xiě)和優(yōu)化過(guò)要求,就不必連續(xù)進(jìn)展下面的階段。①開(kāi)發(fā)C代碼。這一階段完全是依據(jù)任務(wù)要求來(lái)完成算法的代碼編寫(xiě)工作。在C6000CCS〔CodeComposerStudio〕下進(jìn)展代碼的編譯和功能驗(yàn)證,然后可用CCS的調(diào)試工具〔如Profiler〕,利用在程序中設(shè)置斷點(diǎn)的方法可找出程序中耗時(shí)最多、最影響整體性能的代碼段。為改進(jìn)代碼性能,可進(jìn)入下一階段。如下是針對(duì)〔2,1,3〕碼的Viterbi算法代碼中完成算法功能的核心循環(huán),也是最耗時(shí)、最影響代碼整體性能的低效率段。for(c=0;c<unmber_of_input;c++)//對(duì)每一個(gè)輸入值,設(shè)number_of_input=24{for(j=0;j<number_of_states;j++)//對(duì)于每個(gè)狀態(tài)〔2,1,3〕狀態(tài)數(shù)為4{for(i=0;i<2;i++)//1,0{/*計(jì)算度量值*/branch_metric=hamm(conv_output[i],c,channel_data);/*比較累計(jì)度量保存其中最小,并且記錄其狀態(tài)路徑*/if(accum_err_metric[nextstate[j][1]>accum_err_metric[j][0]+branch_metric]{accum_err_metric[nextstate[j][i][1]=accum_err_metric[j][0]+branch_metri;state_history[nextstate[j][i]][sh_ptr]=j;}}*/endofi<2*/}/*endofj<number_of_states*/}/*endofc<number_of_input*/hanmm是計(jì)算當(dāng)前輸入值與網(wǎng)絡(luò)圖上的值相比較所返回的度量值。Inthamm(charoutput_vector,intx,charchannel_output[24]){chartarget_vector=0;inthamm=0;i=0;i=0;target_vector=(output_vector)^channel_output[x];for(i=1;i>=0;i--)hamm+=(target_vector>>i)&0x01;returnhamm;}在驗(yàn)證了算法代碼實(shí)現(xiàn)功能并以設(shè)置斷點(diǎn)的方法測(cè)試代碼的性能,這段循環(huán)運(yùn)行耗時(shí)〔時(shí)鐘周期〕1790。明顯,性能不能到達(dá)要求,就要進(jìn)入代碼優(yōu)化的其次階段了。②一般在代碼調(diào)試中,最影響性能的是其中的循環(huán)代碼段。而軟件流水是一種用于安排循環(huán)內(nèi)的指令運(yùn)行方式,盡可能充分利用CPU的功能單元等資源,使循環(huán)的屢次迭代能C6000C/C++編譯器里,承受軟件流水使編譯出來(lái)的程序代影響軟件流水的因素使其能夠被編譯器充分流水,這對(duì)大幅提高整個(gè)代碼的性能格外重要。Viterbi算法的循環(huán)代碼進(jìn)展如下調(diào)整;〔intrinsics替代簡(jiǎn)潔的CC6000編譯器供給了很多intrinsics,C代碼。Intrinsics是直接參與C6000匯編指令映射的內(nèi)聯(lián)函數(shù)。在這里使用了_extu(x,y,z)hamm代碼局部。盡管軟件流水循環(huán)可包含intrinsicshamm在循環(huán)中開(kāi)放實(shí)現(xiàn)。*由于編譯器僅對(duì)最內(nèi)部的循環(huán)執(zhí)行流水,所以為了提高性能應(yīng)盡可能制造一比較大的內(nèi)循環(huán)。在代碼中可以看到,在最內(nèi)循環(huán)是i的兩次循環(huán),僅對(duì)它進(jìn)展流水,對(duì)整個(gè)代碼的性能提高不大。所以一個(gè)想法是,將ij循環(huán)全部開(kāi)放,使編譯器直接面對(duì)最大的C循環(huán)以最大發(fā)揮軟件流水的作用。*另外,開(kāi)放循環(huán)后代碼中的變量假設(shè)可以確定其運(yùn)行中的值,就盡量以實(shí)值代入,這〔C62xxCPU中有32個(gè)存放器。在進(jìn)展上述調(diào)整后運(yùn)行代碼,進(jìn)展測(cè)試進(jìn)展,性能沒(méi)有太大改善;用編譯器反響表〔feedback〕進(jìn)展觀看覺(jué)察,循環(huán)并沒(méi)有發(fā)生流水。這是為什么呢?原來(lái)在開(kāi)放內(nèi)部循環(huán)后導(dǎo)致C循環(huán)內(nèi)代碼尺寸太大,需要的存放器數(shù)目大于C62XX的32個(gè)存放器,所以不能進(jìn)展軟件流水。為了解決這問(wèn)題,需要簡(jiǎn)化循環(huán)或?qū)⒀h(huán)拆成幾個(gè)小循環(huán)。在這里先將C就減小了每個(gè)循環(huán)中的代碼尺寸。限于篇幅這里只寫(xiě)出累計(jì)度量比較的循環(huán)代碼。/*完成累計(jì)度量比較的循環(huán)*/accum00=accum_err_metric[0];accum10=accum_err_metric[1];accum20=accum_err_metric[2];accum30=accum_err_metric[3];for(c=0;c<n;c++)//n=24{sh_ptr++;add1=accum10+branch_metric_array[c][1];add2=accum00+branch_metric_array[c][0];add3=accum10+branch_metric_array[c][0];add4=accum00+branch_metric_arrcy[c][1];add5=accum30+branch_metric_array[c][2];add6=accum20+branch_metric_array[c][3];add7=accum30+branch_metric_array[c][3];add8=accum20+branch_metric_array[c][2];if(add1>add2){accum00=add2;state_history[0][sh_ptr]=0;}else{accum00=add1;state_history[0][sh_ptr]=1;}if(add3>add4){accum20=add4;state_history[2][sh_ptr]=0;}else{accum20=add3;state_history[2][sh_ptr]=1;}if(add5>add6){accum30=add6;state_history[3][sh_ptr]=2;}else{accum30=add5;state_history[3][sh_ptr]=3;}if(add7>add8){accum10=add8;state_history[1][sh_ptr]=2;}else{accum10=add7;state_history[1][sh_ptr]=3;}}accum_err_metric[0]=accum00;accum_err_metic[1]=accum10;accum_err_metric[2]=accum20;accum_err_metric[3]=accum30;其中accum_err_metric[i]為狀態(tài)i的累計(jì)度量值,branch_metric_array[][]為計(jì)算得到的各時(shí)刻量值,原來(lái)代碼中的二維數(shù)碼mextstate[j][i]被以實(shí)值代入。另外在編程考慮時(shí)要留意一點(diǎn):程序中對(duì)數(shù)據(jù)的取命令〔load〕是格外耗時(shí)的,所以應(yīng)考慮盡量削減對(duì)數(shù)據(jù)數(shù)組的操作。在上面程序的改進(jìn)中,先從數(shù)組中取出要進(jìn)展循環(huán)處理的累計(jì)度量值,再使用accumXX及addX作為各次迭代的中間變量,在循環(huán)后將最終的結(jié)果放入數(shù)據(jù)。這樣就大大削減了對(duì)數(shù)組的操作,從而使優(yōu)化進(jìn)一步提高。*編譯器優(yōu)化選項(xiàng)的選擇。C6000C/C++編譯器供給了大量的編譯選項(xiàng),供用戶(hù)在編譯代碼優(yōu)化性能。選擇適合的選項(xiàng),能極大地提高優(yōu)化性能。在這里使用的優(yōu)化選項(xiàng)有:-03——循環(huán)開(kāi)放等等。-pm——在使用-o3選項(xiàng)進(jìn)展優(yōu)化時(shí)盡量聯(lián)合使用-pm選項(xiàng),-pm是程序級(jí)優(yōu)化,使優(yōu)化器訪問(wèn)整個(gè)程序,了解循環(huán)次數(shù)。-op1——使用了外部變量,但未使用外部函數(shù)調(diào)用。-g——使能符號(hào)調(diào)試和匯編源語(yǔ)句調(diào)試。另外,還有不少考慮因素和優(yōu)化調(diào)試方法,如消退存儲(chǔ)器相關(guān)性、對(duì)短字長(zhǎng)的數(shù)據(jù)使用寬離長(zhǎng)度的存儲(chǔ)器訪問(wèn)等。由于篇幅所限不能在這里一一列出,具體資料可參考TMS320C6000CodeComposerStudioManuals中的TMS320C6000OptimizingCCompilerUser”sGuide。測(cè)試結(jié)果:在經(jīng)過(guò)上述優(yōu)化后運(yùn)行耗時(shí)〔時(shí)鐘周期〕已降為406個(gè),代碼的性能大為提高,已經(jīng)滿(mǎn)足系統(tǒng)要求。③由上述可知,在程序中影響性能的主要代碼通常是循環(huán)。優(yōu)化一個(gè)循環(huán)較好的方法是抽出這個(gè)循環(huán),使之成為一個(gè)單獨(dú)文件,對(duì)其進(jìn)展重編寫(xiě)、重編譯和單獨(dú)運(yùn)行。為了C代碼段可以用線性匯編重編寫(xiě),使用匯編優(yōu)化器進(jìn)展優(yōu)化后效率是格外高的。假設(shè)代碼性能仍未滿(mǎn)足要求,則可進(jìn)展第三階段,將其抽出,全部編調(diào)用函數(shù)的格式如下:.global_KernelLoop;函數(shù)名定義前加__KernelLoop:.cprocchannel_data,branch_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療機(jī)構(gòu)設(shè)備更新項(xiàng)目可行性研究報(bào)告
- 七年級(jí)英語(yǔ)下冊(cè)閱讀理解知識(shí)點(diǎn)(大全)經(jīng)典
- 2025年粘結(jié)稀土永磁材料項(xiàng)目提案報(bào)告范稿
- 請(qǐng)關(guān)閉“三天可見(jiàn)”
- 超市入股合同范本
- 七年級(jí)上冊(cè)數(shù)學(xué)試題精心編輯初中數(shù)學(xué)中考知識(shí)點(diǎn)聚焦第二章實(shí)數(shù)
- 精神分裂癥日常護(hù)理注意事項(xiàng)
- 孩子被拒絕是人生的必修課
- 一年級(jí)閱讀理解知識(shí)點(diǎn)總結(jié)及經(jīng)典習(xí)題(含答案)經(jīng)典
- 中國(guó)金融外包市場(chǎng)深度評(píng)估及行業(yè)投資前景咨詢(xún)報(bào)告
- 2025年華潤(rùn)電力招聘筆試參考題庫(kù)含答案解析
- 建筑行業(yè)材料供應(yīng)應(yīng)急預(yù)案
- 電焊工安全培訓(xùn)(超詳)課件
- 2025蛇年中小學(xué)春節(jié)寒假安全教育課件模板
- 康復(fù)護(hù)士講課課件
- 2024年學(xué)校科研工作計(jì)劃(6篇)
- 學(xué)校食堂廚師崗位職責(zé)
- 如何做好4S管理
- 民航客艙應(yīng)急設(shè)備
- 化工總控工培訓(xùn)
- 山西電網(wǎng)新能源場(chǎng)站涉網(wǎng)試驗(yàn)流程使用說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論