一、c6x的編譯的常用選項
(一)c6x的編譯程序為“cl6x.exe”使用的方法
Cl6x [options] [filenames]
Cl6x: 編譯程序
Options: 編譯選項
Filenames: C或匯編源文件
說明:
編譯選項是一個字母或者兩個字母,對大小寫不敏感。
編譯選項的前面需要有一個“-”符號。
一個字母的選項可以合并在一起。比如“-sgq”與“-s -g -q”相同。
兩個字母的選項如果第一個字母相同也可以合并在一起。比如“-mgt”與“-mg -mt”相同。
(二)有關優(yōu)化的選項
-mt:表示在程序中沒有使用alaising技術,這使得編譯器可以進行比較好的優(yōu)化。
-o3:對文件級別進行最強的優(yōu)化,一般在編譯時應該使用這個選項。但是在個別情況下使用這個選項優(yōu)化程序可能會出現(xiàn)錯誤(-o2有相同現(xiàn)象,- o0和-o1不會出現(xiàn)錯誤)。可能是在優(yōu)化循環(huán),組織流水線的時候發(fā)生錯誤。如果有這種現(xiàn)象出現(xiàn)可以同時使用-g選項,程序優(yōu)化就不會出現(xiàn)錯誤,但是優(yōu)化效果會下降。另外可以調整程序的表達方式,可能會避免編譯器發(fā)生錯誤。
-pm:在程序級別進行優(yōu)化?梢詫⑺晕募(lián)合在一起進行優(yōu)化,主要有去掉沒有被調用的函數(shù)、總是常數(shù)的變量以及沒有使用的函數(shù)返回值。建議由程序員自己進行這種優(yōu)化工作。使用這個選項在win98下編譯可能會出現(xiàn)找不到編譯程序的情況。
-ms0:不使用冗余循環(huán)進行優(yōu)化,減小程序的大小。一般情況下這個選項對程序大小的優(yōu)化作用不明顯。
-mh[n]:去掉流水線的epilog,減小程序的大小。這個選項的作用比較明顯。但是有可能出現(xiàn)讀取地址超出有效范圍的問題,所以要在數(shù)據(jù)段的開始和結尾處增加一些pading,或者在分配內存時保證數(shù)組的前面和后面一段范圍內都是有效的地址?蛇x的參數(shù)n給出這種pading的長度字節(jié)數(shù)。
(三)保留編譯和優(yōu)化信息的選項
-k:保留優(yōu)化后生成匯編語言文件。
-s:匯編語言文件中加入優(yōu)化信息,如果沒有則加入C語言源程序作為注釋。
-mw:在匯編語言文件加入軟件流水線信息。
(四)有關調試和剖析的選項
-g:允許符號調試,在“out”文件中包含符號信息和行號信息,可以在c語言級別進行調試和剖析。使用聯(lián)合使用-g、-mt和-o3可以保證能夠進行符號調試的情況下最大限度的優(yōu)化。
-mg:允許profile優(yōu)化后的程序。 在“out”文件中包含符號信息和很少的行號信息。允許在c語言的函數(shù)基本進行剖析。
如果聯(lián)合使用這兩個選項,-g選項可能被忽略,結果與只用-mg相同。
(五)其它類型
-mln:生成大內存模式的程序。
-ml0:缺省情況下將集合變量(數(shù)組和結構)作為far型。
-ml1:缺省情況下將全部函數(shù)作為far型
-ml2: 等于-ml0加-ml1
-ml3: 缺省情況下將全部數(shù)據(jù)和函數(shù)作為far型
(六)建議使用的編譯方式
Cl6x -gk -mt -o3 -mw -ss “filename”
方式1用于程序的調試,這種方式具有比較強的優(yōu)化能力,并且支持符號調試。在編譯的過程中不會發(fā)生錯誤。由于生成的“out”文件中包含了符號信息和行號信息,所以比較大。
Cl6x -k -mgt -o3 -mw -ss “filename”
方式2用于程序的剖析(profile),這種方式的優(yōu)化能力幾乎最強(絕大多數(shù)情況下與方式3相同),并且支持對程序進行profile。文件中只包含了符號信息和很少的行號信息,所以“out”文件比較小。
Cl6x -k -mt -o3 -mw -ss “filename”
方式3用于最終的發(fā)行版本程序,可以對程序進行最強的優(yōu)化,并且去掉了全部的符號和行號信息,所以“out”文件比較小。
由多個文件組成的程序應該編寫makefile,將編譯參數(shù)放在該文件中,并在其中說明使用的編譯器的版本號。
(七)連接參數(shù)
-h(huán)eap:指定堆的大小
-stack: 指定棧的大小
連接的各種選項應該統(tǒng)一放在“cmd”文件中
二、雙重循環(huán)和多重循環(huán)的優(yōu)化總結
雙重循環(huán)多重循環(huán)看起來比較復雜,但實際上多重循環(huán)優(yōu)化方法比較簡單,就在于一個字:“拆”,一旦完成這一步之后,多重循環(huán)就成為單層循環(huán),優(yōu)化就可以按照普通的單層循環(huán)來做了。
多重循環(huán)的特點是在優(yōu)化器優(yōu)化時只在最內層循環(huán)中形成一個pipeline,這樣循環(huán)語句就不能充分利用C6的軟件流水線,而且對于內部循環(huán)的次數(shù)較少的情況,消耗在prolog和eplog上的cycle數(shù)也是不可忽視的。針對這種狀況可以考慮將多重循環(huán)拆開形成一個單層循環(huán),可以拆外層循環(huán)也可以拆內層循環(huán),一般視具體情況而定。這樣就可以充分利用優(yōu)化器構成的Pipeline。如下例:
void fir2(const short input[], const short coefs[], short out[])
{
int i, j;
int sum = 0;
for (i = 0; i < 40; i++)
{
for (j = 0; j < 16; j++)
sum += coefs[j] * input[i + 15 - j];
out[i] = (sum





