第七节:关于优化,线性汇编和汇编(未完待续)

      优化是一个值得讨论的话题,要最大程度利用缓存,并且合理使用线性汇编,若你有信心比编译器优化的

好,也可以尝试汇编。

     有些人可能一直搞不清楚,自己的算法究竟要优化到何种程度才算完结。要用什么样的方式去优化。当你

的优化取得一定成绩时,你一定非常开心,但是,问题来了,是否应该继续。。。,我曾经也为这些问题困扰着。

     我觉得,要达到这样一个能力:能够结合项目需求为优化工作制定一个方案,并且知道下一步该做什么优

化。要达到这样的境界,必须对CPU指令的执行情况、待访问数据的分布位置、有哪些汇编指令可以在项目中

使用、如何在程序的可读性与优化的适用性之间达到平衡这四个方面有着清晰的认识。在你遇到困难时,你

不能说:大概就这样吧,这样就可以了。这样的想法,只会扼杀你的学习欲望。

      我分几个方面阐述要学习的知识点。基本包括:DSP不同的指令类型的执行规律,让待访问数据处于合适

的位置,(通过汇编或线性汇编)让DSP满流水线工作,等等。

    首先从寄存器谈起,因为cpu所有的运算都在和寄存器打交道,理想情况下,如果cpu所需要的数据都在寄存器中,

那么速度无疑是最佳的。DSP有AB两组寄存器,每组32个。请看下图

图1-1 :两组寄存器示意图

DSP包含了4种类型的指令。每种类型的指令执行的时间是不一样的,具体请看下图:

      图2.1:不同类型的几种指令所占用的执行时间。

 

上图的意思是:每种指令的总执行时间是delay时间和latency时间之和,所以乘法指令是2个周期,load类指令是5周期,

跳转branch类指令是6周期。其他指令是1周期。

      上述load类指令所花费的5周期是建立在数据在L1存储器的基础上,如果数据在L2或者在更遥远的DDR2,那肯

定不止5个周期。      

      毫无疑问,除了load类指令是需要和存储器打交道以外,乘法类指令和单周期类的指令都是和寄存器打交道。

所以优化的思路包括下面几个层次:一是寄存器级别,尽量增加数据在寄存器中的有效时间,读进来一个数据之后,

尽量“充分”运算。二是一级缓存或者一级存储器级别,减少数据加载到寄存器所耗费的时间。

      对应的思想很简单:尽量让数据处于离CPU“最近”的位置,比如在L1上分配数据空间,通过EDMA结合乒乓缓

存区把数据从DDR2“搬运”到L1(EDMA会在另一节中单独讲)。合理设计算法及线性汇编,让数据在寄存器中充

分参与运算。尽量按照“线性方式”操纵数据。简单总结为:当cpu需要数据的时候,数据就在寄存器上。

 

        其次说下汇编。许多人谈起汇编会觉得头大,这个很正常,比起C代码,汇编要一步一步设计好CPU运算指

令,保证寄存器数据不冲突,这个的确很难。TI给出了一个解决方法,就是用线性汇编,可以达到近似汇编的效

率,又有着和C语音一样的简洁。

       举例:

(未完待续。。。)

 

 

      

 

 

 

 

 

你可能感兴趣的:(DSP,汇编,优化,编译器,工作,算法)