BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #12233同步于 2012/5/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求指导,在定点DSP中,两个float类型的数相乘,代价太大

FengChao
2012/5/12镜像同步11 回复
我用ccs,测了一下,两个int类型的数做乘法,要消耗17个时钟周期左右。(两个float类型的,相乘,要500左右个时钟周期。。。)我是用C语言写的。是不是说,把数都乘上一个比较大的系数,比如100000,把浮点数转化为int类型的,然后再计算就比较省时间呢?求指导,万分感谢!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nickluchen机器人#1 · 2012/5/12
对的,没错,先做定点化。定点DSP上就别想着跑浮点程序了……
FengChao机器人#2 · 2012/5/12
传说DSP能再一个时钟周期完成一次乘法和一次加法?我的2812datasheet上说,是16位*16位的乘法。这种高效的算法,是不是只有用汇编写? 我要在150个时钟周期内,完成一系列的操作,但是我用CCS跑了下,貌似要大概180个时钟周期才能搞定…如果能用那种高效的乘法加法器,应该就能完成了。 求指导~(记得看邮箱。。。) 【 在 nickluchen 的大作中提到: 】 : 对的,没错,先做定点化。定点DSP上就别想着跑浮点程序了……
UZ机器人#3 · 2012/5/13
不是传说啊。。。乘加是基本的DSP指令,如果你的算法很独特又要高效那只好自己调优 了。先用C写逻辑,再看编译出来的汇编,再修改。。。 【 在 FengChao (会当凌绝顶,一览众山小) 的大作中提到: 】 : 传说DSP能再一个时钟周期完成一次乘法和一次加法?我的2812datasheet上说,是16位*16位的乘法。这种高效的算法,是不是只有用汇编写? : 我要在150个时钟周期内,完成一系列的操作,但是我用CCS跑了下,貌似要大概180个时钟周期才能搞定…如果能用那种高效的乘法加法器,应该就能完成了。 : 求指导~(记得看邮箱。。。) : ...................
coming机器人#4 · 2012/5/13
如果是高端的DSP,有比较高效的内联函数可以直接调用,可以选择合适函数,都是做了汇编优化的,做定点乘法很快,freescale dsp有,2812没有用过,不清楚
FengChao机器人#5 · 2012/5/13
如果没有内联函数,是不是就要自己看汇编程序,然后再优化?。。。╮(╯▽╰)╭ 【 在 coming 的大作中提到: 】 : 如果是高端的DSP,有比较高效的内联函数可以直接调用,可以选择合适函数,都是做了汇编优化的,做定点乘法很快,freescale dsp有,2812没有用过,不清楚
coming机器人#6 · 2012/5/14
【 在 FengChao 的大作中提到: 】 : 如果没有内联函数,是不是就要自己看汇编程序,然后再优化?。。。╮(╯▽╰)╭ 那就只能这样了
nickluchen机器人#7 · 2012/5/14
C6000上做乘累加效率较高,虽然DSP没有像ARM那样单独的乘累加指令,但是通过add和mpy指令组合效率也很高(C6000上最好是循环能流水起来效果才明显,因为有多个功能单元要尽量提高并行性)。C2000系列是16位MCU吧,不知道有没有intrinsic,如果有的话,直接在C程序中调用intrinsic函数就很接近写汇编代码运行的效率了。 邮件我刚刚回你了~ 【 在 FengChao 的大作中提到: 】 : 传说DSP能再一个时钟周期完成一次乘法和一次加法?我的2812datasheet上说,是16位*16位的乘法。这种高效的算法,是不是只有用汇编写? : 我要在150个时钟周期内,完成一系列的操作,但是我用CCS跑了下,貌似要大概180个时钟周期才能搞定…如果能用那种高效的乘法加法器,应该就能完成了。 : 求指导~(记得看邮箱。。。) : ...................
zizi06机器人#8 · 2012/5/14
C6000和C2000都有个IQmath库,挺容易用的,你可以试下 顺便问下lz,怎么在ccs里看指令的运行周期啊
zizi06机器人#9 · 2012/5/14
而且我觉得,你用一个float乘个大int,这不也是浮点运算么,而且避免溢出什么的还得除回去。。。用移位的方式比较好