本人做TI DSP優化過程中的一些積累,顯得比較凌亂,但都是比較常用而且非常有必要了解的點,大家可以接在這後面補充自己的經驗:
>. 同一EP包中不會出現兩條指令使用同一功能單元。
>. 兩條指令使用同一功能單元,不能在同一cycle內將結果寫出,因爲每個unit僅有一個寫出port.
>. 兩條指令使用同一乘法單元時,它們不能在同一指令週期內向register寫出結果,理由同上,每個unit僅有一個到寄存器文件的寫出port.
>. 每個EP,每條data path下,最多兩個unit能夠通過交叉path(1X, 2X)讀取反向register file中的同一個操作數(假定兩個units讀取同一個操作數).
>. 對C64X/C64X+ CPU,當指令通過cross path讀取一個cycle前被更新的寄存器時,總會產生一個cycle的延時,稱之爲stall, stall時,不需要插入NOP指令,由硬件自動完成插
>. 在同一EP中,不允許兩個load和store指令對同一寄存器文件中的同一源/目的進行操作。且地址寄存器必須與DA所使用的D unit出於同一側.
>. T1,T2支持64-bit load/store, T1/T2與unit同出現在load/store指令中. 相對於C62x DSP,C64x有改進,後者的.D功能單元亦與交叉通道相聯,也可每週期由交叉通道從另一
>. C64X/C64X+ dsp支持在任何byte邊界使用非對齊的load/store訪問word和doubleword。由此,word和doubleword數據均不需要32-bit或64-bit邊界對齊.
>. 當一unit做非對齊的Memory訪問時(通常unit帶T1/T2)時,不允許另一unit同時做memory操作,但允許另一unit同時做非memory訪問的操作.
>. C62x與C67x系列因爲data path共享,故都限制了同時讀和寫的40-bit數據的數目,而C64x/C64x+ cpu因爲每個Unit採用分開的data path,故不存在以上限制.
>. 除條件寄存器外,在同一cycle內,不允許對同一寄存器做4次以上的讀操作.
>. 同一cycle內,兩條指令不能向同一寄存器寫入。具有同一dst寄存器的兩條指令也可以被安排成並行,條件時它們不會在同一cycle內向dst寫入.
>. 使用MVC指令向尋址模式寄存器AMR寫入,如果其後緊跟指令LD,ST,ADDA或SUBA,且此4指令使用了A4-A7,B4-B7寄存器尋址,則會產生一個cycle的stall. 記住,當以
>. 同一EP中不允許出現兩條產生多個NOP cycle的指令.
>. 循環尋址方式可用於非對齊的數據訪問,採用循環尋址方式後,地址更新和內存訪問均按byte方式進行,即與相當量的byte序列的尋址訪問相同.
>. 非對齊循環buffer訪問方式適用於對邏輯地址相連內存區域的循環尋址,當非對齊訪問到循環buffer邊界時,將能正確的從buffer的兩端讀取數據,實現邊界處的無縫連接.
>. 對C64x,唯一限制是循環buffer的大小至少與被訪問的數據尺寸相同。如果buffer比被訪問的數據類型小,則非對齊訪問將產生無法預知的錯誤;而對C64x+,循環buffer至少爲32bytes.
>. 程序指令:
>. 使用選項 -k ,令編譯器保留.asm文件,因爲編譯器產生的.asm文件反饋了許多信息,理解這些信息,按它的提示修改C語言程序,對儘快優化代碼有好處.
>. C64x具有雙字讀取與存儲指令,增大了訪問存儲器的帶寬;峯值帶寬可達到每個指令週期128位;增加了無邊界調整的存儲器訪問能力,在沒有32位或64位邊界調整的嚴格限制下,C64x可以在單週期內完成64位數據的讀寫操作.
>. 在一系列嵌套循環中,最內層的循環是唯一可以進行軟件流水的循環。循環不能軟件流水的諸因素:
>. 一般而言,用與源操作數相同字長的數據類型來保存累加和是非常危險的。通常選擇是在計算過程(循環)內用較長的數據類型保存和數,最後根據具體情況選取適當字長。
>. 轉移指令有5個週期的延遲間隙(當前cycle n,到cycle n+6跳轉完畢,並執行指令),即在轉移指令進入流水線後,要再等5個週期才發生跳轉。所以,轉移指令後的5個指令指向包(EP)都進入了CPU流水線,並相繼執行,在寫彙編時要特別注意這一點.
>. !!!!!!!!爲防止數據訪問的bank衝突,優化辦法是將算法中訪問的2個數組定義在不同的bank中,具體做法是定義不同的數據段:L1_data1, L1_data2,並在cmd中將這兩個段定位到不同的兩段內存: L1_data1 > memory1, L1_data2 > memory2; 將函數中用到的兩個數組分別放在不同的存儲塊(要求芯片有一個以上存儲塊blocks);將一個數組的偶元素和奇元素的訪問安排在同一循環週期內。
>. 絕對不能把做了軟件流水編排後輸出的彙編語言程序再次作爲彙編優化器的源程序輸入,否則將導致整個程序編排錯誤。線性彙編語言應按照指令的自然邏輯順序"線性"的安放指令,由彙編優化器對它分析,做出優化安排
針對C64x+的一些優化經驗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.