DSP

ADSP-BF609 乘除运算需要的周期数及测试方法

2019-07-13 12:10发布

BF609为16位定点DSP,每个core中含有2个16位MAC,1个 MAC运算只需要1个机器周期;当主频为500MHz时,意味着完成1次乘累加需要的时间为2ns; 然而,通常FFT,滤波器设计处理的是浮点数,BF609处理浮点数的乘累加时间就不是1个周期了,而是144个机器周期; (1 cycle = 1/主频;当BF609运行在最高主频500MHz时,1 cycle = 2ns;) 1.完成1次常量的乘法:6 cycles;  例如:14.05 * 177777777.888888888; 2.完成1次常量的除法:10 cycles;例如:14.05/ 177777777.888888888; 3.完成1次变量的乘法:   72   cycles   = 0.144us;例如:float i * float k ; 4.完成1次变量的乘累加:144 cycles   = 0.288us;例如:float z = z + float i * float k ; 4.完成1次变量的除法:251 cycles = 0.502us;例如:float i / float k ; 5.完成变量的乘除法:  317 cycles;例如:float i * float j  / float k ; 需要说明的是:DSP是流水线指令,同样的运算,放到代码的不同位置,测得的时间不完全相同,看编译效果;
完成1次浮点数乘累加的汇编代码见下图:

代码所耗费机器周期的测试方法 CCES提供代码运行周期数的测试函数, #include #define PROFBEG(TAG)    asm volatile("%0=cycles;" : "=d"(TAG.nCycles)) #define PROFEND(TAG)   asm volatile("r0=cycles; %0=r0-%0; %1=%0+%1;" : "+d"TAG.nCycles), "+d"TAG.nSum)::"R0") typedef struct {     uint32_t    nCycles;     uint32_t    nSum; } prof_t  goProfile; PROFBEG(goProfile);  //在需要测试的代码前加PROFBEG() Result = 14.05/177777777.888888888; PROFEND(goProfile);  //在结束点加PROFEND() printf("[CORE 0]1: need cycles = %d! ",goProfile.nCycles);