• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于TI C6000系列DSP的C/C++程序優化技術

    基于TI C6000系列DSP的C/C++程序優化技術

    作者: 時間:2009-06-16 來源:網絡 收藏

    3.2.3 內聯函數
    通過下面的方法改進C語言,可使編譯出的代碼性能顯著提高:
    (1)使用intrinsics(內聯函數)替代復雜的C/C++代碼;
    (2)使用字(Word)訪問存放在32位寄存器的高16位和低16位字段的數據;
    (3)使用雙字訪問存放在64位寄存器的32位數據(僅指C64xx/C67XX)。
    編譯器提供了許多內聯函數,它們直接對應著C62X/C64X/C67X指令可快速C代碼。這些內聯函數不易用C/C++語言實現其功能。內聯函數用前下劃線“_”特別標示,其使用方法與調用函數一樣。例如C語言的飽和加法只能寫為需要多周期的函數:


    這段復雜的代碼可以用_sadd()內聯函數實現,它是一個單周期的C6x指令。
    result=_sadd(a,b);
    要提高數據處理率,應使一條Load/Store指令能訪問多個數據。有與內聯函數相關的指令,例如_add2(),_mpyhl(),_mpylh()等,這些操作數以16位數據形式存儲在32位寄存器的高位部分和低位部分。當需要對一連串短型數據進行操作時,可使用字1次訪問2個短型數據,然后使用C6000相應指令來處理數據。相似的在C64x或C67x中,有時需要執行64位的LDDW來訪問兩個32位數據,4個16位數據,甚至8個8位數據。
    3.2.4 循環展開
    循環展開是改進性能的另一種,即把小循環的迭代展開,以讓循環的每次迭代出現在代碼中。這種方法可增加并行執行的指令數。當每次迭代操作沒有充分利用C6000結構的所有資源時,可使用循環展開提高性能。
    有3種使循環展開的方法:
    (1)編譯器自動執行循環展開;
    (2)在中使用UNROLL偽指令建議編譯器做循環展開;
    (3)用戶自己在C/C++代碼中展開。
    3.3 匯編
    在對C/C++代碼使用了所有的C/C++優化手段之后,如果仍然不滿意代碼的性能,就可以寫線性匯編程序,然后用匯編優化器進行優化,生成高性能的代碼。
    3.3.1 寫線性匯編
    使用C6000的剖析工具(Profiling Tools)可以找到代碼中最耗費時間的部分,就是這部分需要用線性匯編重寫。線性匯編代碼與匯編源代碼相似,但是,線性匯編代碼中沒有指令延遲和寄存器使用信息。這樣做的目的是由匯編優化器來為自己設定這些信息。
    寫線性匯編代碼時,需要知道:匯編優化器偽指令、影響匯編優化器行為的選項、TMS320C6000指令、線性匯編源語句語法、指定寄存器或寄存器組、指定功能單元、源代碼注釋等。
    3.3.2 匯編優化器優化
    匯編優化器的任務主要有:
    (1)編排指令,最大限度的利用C6000的并行能力;
    (2)確保指令滿足C6000的延遲要求(Latency Requirements);
    (3)為源代碼分配寄存器。


    4 結 語
    C6000 C/c++代碼優化比傳統的代碼優化要方便的多,但要真正發揮其芯片的工作效率還是需要一定的經驗和技巧。這不僅要求開發人員熟悉其硬件體系,還要求對編譯器的編譯原理有一定的理解。另外,在C語言層面上要達到芯片的峰值即8條指令并行是很難的,大多情況下都只能達到6.7條指令并行。在實際開發中,若優化結果已達到6,7條指令并行卻還離實時的要求相差很遠,再花大量的人力去力求達到8條指令并行是不經濟的,此時應該考慮其他的改進或策略上的調整以求達到目的。


    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 辽阳县| 阿勒泰市| 新津县| 康平县| 祁连县| 连城县| 旌德县| 义马市| 蓬安县| 遂川县| 明光市| 赣州市| 丽水市| 肥城市| 荃湾区| 汪清县| 阿勒泰市| 惠水县| 荃湾区| 潞城市| 祁东县| 高雄县| 永川市| 保亭| 沙河市| 清河县| 松江区| 吴桥县| 化德县| 鄯善县| 六枝特区| 郸城县| 大埔区| 莱阳市| 水富县| 页游| 揭阳市| 大渡口区| 沾化县| 徐闻县| 龙里县|