完美不是一个小细节;但注重细节可以成就完美。–米开朗基罗
专用DSP和通用处理器最大的差别在于,有很多特殊的计算处理来提高运算效率。在提高运算效率方便,从大的方面可以优化算法,而小的方面可以细微到通用寄存器的使用、变量类型的定义等。使用F1 DSP有一段时间,一直没有细致地了解其结构细节。而了解其工作细节,可以更好地提高运算效率。如下的描述,一部分是文档中直接得到的信息,而另外一部分为实验结果的理解。
整体结构
说明:
- 文档上F1是SIMD结构的处理器,上图中AE_DR可以同时处理2个24bits、2个32bits或4个16bits格式的数据;
- 更像是MIMD的处理器;其属于VLIW结构,支持同时执行两个操作;理解上上图中不同slot亦即slot0、slot1;或同一slot中不同单元可以同时执行;
- 图中的 AE_DR为12个64bit寄存器,而AR为32bits寄存器,其个数可以配置;
- 图中的slot0及AR Registers为文档core Architecture部分;
处理流水
指令说明的流水级:
- P-Stage: PC Generation
- I-Stage: Instruction Alignment
- R-Stage (0): Decode and Dispatch
- E-Stage (1): Execute, Branch Resolution, and Load/Store Address Generation
- M-Stage (2): Memory Access
- W-Stage (3): Commit and Writeback
5级流水执行图
关于取指
支持两类长度的指令: 16比特和24比特(在汇编指令中能看到.n结尾的指令,理解上应该时16比特的)。取指时可以按照64比特对齐取指,所以每次取指消耗1个cycle,而非每个指令消耗一个cycle。这样的memory貌似会有额外开销?函数编译的IRAM地址按照64比特对齐。
关于加速计算
DSP可以使用特定的方法来加速计算,如SIMD、地址产生器、零开销循环、特殊功能指令等等。