本人做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+的一些优化经验
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.