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

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 <adi_types.h>
#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!\n",goProfile.nCycles);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值