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);