完美不是乙個小細節;但注重細節可以成就完美。–公尺開朗基羅
專用dsp和通用處理器最大的差別在於,有很多特殊的計算處理來提高運算效率。在提高運算效率方便,從大的方面可以優化演算法,而小的方面可以細微到通用暫存器的使用、變數型別的定義等。使用f1 dsp有一段時間,一直沒有細緻地了解其結構細節。而了解其工作細節,可以更好地提高運算效率。如下的描述,一部分是文件中直接得到的資訊,而另外一部分為實驗結果的理解。
說明:
指令說明的流水級:5級流水執行圖
支援兩類長度的指令: 16位元和24位元(在彙編指令中能看到.n結尾的指令,理解上應該時16位元的)。取指時可以按照64位元對齊取指,所以每次取指消耗1個cycle,而非每個指令消耗乙個cycle。這樣的memory貌似會有額外開銷?函式編譯的iram位址按照64位元對齊。
dsp可以使用特定的方法來加速計算,如simd、位址產生器、零開銷迴圈、特殊功能指令等等。
f1中可以進行非對齊位址的讀寫,以及同時操作位址的自動增減。
load/store指令最長支援64bit資料的處理,並且支援非64bit對齊的位址處理。在處理未對齊情況下,需要使用ae_valign暫存器,及相應的指令。示例如下
非對齊load
ae_valign align;
ae_int32x2 *ap = (ae_int32x2 *)...
... ...
align = ae_la64_pp(ap);
ae_la32x2_ip(tmp,align,ap);
非對齊stroeae_int32x2 v_con = (ae_int32x2)(0);
ae_int32x2 *addr = (ae_int32x2 *)...
ae_valign align=ae_zalign64();//初始化0
//loop
ae_sa32x2_ip(v_con, align, addr); // store and post incremented by 8
ae_sa64pos_fp(align, addr);//flushes the end of the stream
在load/store操作memory時,可以同時更新相應位址暫存器,相應方式可以通過指令的字首、字尾體現出來。如一般指令格式ae_la16x4.ic ae_la16x4.ric
字尾的含義
字首的含義
core操作迴圈開銷:處理器都是按照一定流水進行處理的,亦即在執行當前指令的同時,已經在對後續執行指令進行取指、解碼等操作。而當跳轉指令執行時,將會破壞當前的流水,使得順序取指、解碼的指令不再是後續需要執行的指令,降低了流水操作帶來的效率提公升。所謂零開銷迴圈,直接意義上就是去除了跳轉指令帶來的影響,提高了處理效率。
零開銷迴圈是通過指令(zero overhead-loop instructions)來時實現的,如: loop loopgtz loopnez 等等。同時為了降低cache miss概率帶來的效率降低,同時可以配置l0 loop buffer size,理解上專門用於loop相關指令儲存。
彙編對比零開銷迴圈的效果:
源c**:
uint32_t gmemory1[1024];
uint32_t gmemory2[1024];
void zerooverheadloop()
}
非優化的彙編結果,cycle 19645,size 55bytes:
優化後的彙編結果,cycle 2057,size 28bytes:
nop.n
loop a3,........
ae_s32ip a3,a4,4
retw.n
}
simd是指單個指令,執行多個資料同時操作;我們知道ae_dr為64位元的暫存器,而此暫存器可以作為1個64位元、2個32位元或4個16位元資料進行操作;當它們作為2個32位元或4個16位元操作時,即為simd模式,如ae_mul16x4.l、ae_mul16x4.h等指令。
ide xplorer中的pipeline流水視窗,看到一些指令組合占用了一次的流水組合,理解上這些操作組合可以同時並行。如,哪些指令可以並行呢?理解上slot0、slot1各自的操作,當沒有暫存器依賴關係時可以並行;同乙個slot中alu與load/store操作也是可以並行的,具體可以參考整體結構圖部分。
在ide xploere中profile功能可以看到pipleline流水的執**況,其中有interlock的開銷;沒有找到詳盡的說明,理解當指令執行需要等待其它資源情況下,會出現interlock的額外開銷;例如使用到的某個暫存器值,需要等待前序指令完成等,在pipleline中的需要等待前一級流水的writeback更新完所需的暫存器內容。
在同一時刻可以使用16個ar暫存器,而物理上可以存在多個暫存器,如16、32、48,理解上稱為windowed register的含義是,在配置多個物理暫存器的情況下,可以滑動window的位置,來選擇使用哪16個暫存器作為a0-a15。此功能設計用於在子函式呼叫時可以改變暫存器的物理暫存器位址。其好處在於,只有當物理暫存器個數不足夠使用時,才採用壓棧、出棧的操作。
相應的指令有call4、call8、call12、callx4、callx8、callx12等,當使用它們進行子函式呼叫時,被呼叫的子函式中a0則對應在呼叫函式中的a4、a8、a12。這些變化是通過子函式入口的 entry 指令來完成的,entry指令的格式entry as,uint12 (in 8bytes),其作用,文件說明如下:
資料結構基礎知識1
談到資料結構,心情就變得有些沉重了。聽到大多數的人談論資料結構的重要性,然而學了半年的自己並不知道自己學了什麼。在這個假期,我決定將自己一學期的學習情況整理一下。若察不正確之處,便會加以改正。我想先吐槽一下我們專業的課程安排 先學習了c 還沒有學習到一半,課程就要結束了,於是乎老師帶我們坐起了火箭。...
資料結構 基本知識1
資料結構是研究組成資料的資料元素的學科。資料即資訊的載體,是能夠輸入到計算機中且能被計算機識別 儲存和處理的符號總稱。資料元素由若干資料項組成,資料項是資料中的最小單位。資料型別是對資料元素取值範圍與運算的限定。資料結構 ds 可用形式化語言描述,即ds是乙個二元組 ds d,r 其中,d為資料元素...
資料結構基礎知識 1
資料結構是計算機儲存 組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。資料結構具體指同一類資料元素中,各元素之間的相互關係,包括兩個組成成分,資料的邏輯結構,資料的...