线性汇编总结和函数说明
線性匯編總結和函數說明
=====================================================================
總體說明:
這部分測試的線性匯編代碼是代碼是與之前提取出來的函數塊(見function_module.c)
對應的函數來寫的,線性匯編的在原函數的名稱全面加了asm字樣,提供了C函數調用的原型,在
本文檔中對匯編函數作了詳細說明,在simulater工程中進行了測試。
----------------------------------------------------------------------
線性匯編經驗總結:
1. 一般只是對有循環結構的代碼編寫匯編替代,非循環代碼不需要流水,性能提高不大
2. 為形成軟件流水,循環體不要做條件判斷,如果有條件判斷盡量移到循環體外,或者用非跳轉代碼替代
(例如,在量化相同代碼,用條件跳轉的何不用條件跳轉的性能相差5倍,再比如內存搬移大小不固定的可能產生
條件跳轉,使用了固定大小的子塊后,子塊大小對性能影響不大,匯編代碼和C代碼的性能相差20倍左右)
3. 耗時較多的指令主要是load/store/乘/點乘等指令,一般為提高效率,一個循環盡可能處理多個數據操作,如
一般C循環處理一個字節、半字、字的操作,可以一次加載一個半字、字、雙字進行操作處理,由于C64有很多以字節、
半字為單位處理的指令,加上軟件流水,程序的效率可以提高達到原來匯編的2倍、4倍甚至8倍。
4. 碰到雙循環,一般將較小的循環放到內循環,然后外循環處理一次處理完一個內循環的操作,大大減少跳轉的次數。
5. 實現同樣操作盡量用數據相關小易于形成軟件流水的指令,盡量用最少周期的指令,盡量用特殊指令(一般效率比較高)
例如:循環體實現一個操作 val = is<0? -val : val,可以用比較和跳轉指令實現但破環軟件流水效率低,可以通過比較
擴展求或操作得到一個-1或1的數,再用乘運算實現這個操作,雖然周期長了一些,但能形成軟件流水,實際提高了效率。
6. 線性匯編一般常見的錯誤:
* 一個.sa匯編文件中的多個函數體內使用同一個標號(特別是循環標號loop/LOOP)等,編譯會報rededine
的錯誤,由于同一個匯編文件形成同一個目標文件,不同函數體中重復/使用同一個標號肯定是不對的,要使用不同的標號區別開
* 指令使用不當,加/減乘/除/移位等指令一定要注意操作數的類型,對于無符號/絕對值類型的操作數最好
使用無符號的操作指令
* 操作數溢出問題
* ...
7. 線性匯編調試經驗:
* 匯編程序先調試通過再進入具體工程中使用,一般是新建一個仿真工程用于編寫、調試、測試匯編代碼,
一方面,可以保證匯編程序準確無誤;另一方面,可以方便觀察匯編代碼和對應C代碼的性能提高情況,保證仿真測試下,
匯編代碼的效率確實比C代碼有所提高。
* 匯編代碼調試時先不使用任何優化選項,這樣可以通過Debug單步執行所編的代碼,便于檢查代碼的錯誤,
需要注意的是,即使不使用優化選項,在沒有分配資源單元時,編譯器仍然對寄存器的使用進行了調整(尤其是寄存器冗余
使用時),即單步調試時,寄存器的值不一定和代碼里的執行得到的值相對應,但通過Watch Window觀察到所有寄存器及其
值的變化。
* 內存的觀察最簡便的方法就是使用memory window,還可以調整顯示的數據類型,通過紅色標記看到存儲
的變化,如果要對比前后的數值可以將其打印到輸出窗口。
* 周期性能的測試,有沒有使用優化選項其結果的正確性是一致的,匯編程序調試通過后,使用優化選項
-o2/-o3來優化代碼,使用profile里面的時鐘工具測試C代碼和匯編代碼執行的周期。
總結
以上是生活随笔為你收集整理的线性汇编总结和函数说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称索尼即将发布新款 50mm F1.
- 下一篇: CCS的一些问题(转帖)