我目前用f407改造一款原来公司用dsp完成的产品。 不知道论坛的网友有没有用过ARM的DSP核做过算法方面的评估。我之前做DSP算法评估的流程,一个算法写好后要先评估用了多少个乘加运算,内存开销,最后在DSP里面进行流水线优化。考核时间一般用DSP内部的两个“心跳计数器”“TSCH”“TSCL”计算实际的指令开销。
现在用ARM,找不到精确定义时间的寄存器,所以我用调试器的那个“sec”计算运行的时间长短的。但是用了几次我发现不是太准,好像要比实际情况慢不少。我想问下坛友有什么好的方法精确的确定某段程序运行时间长短,tim定时器里面的cnt行不行。
另外还有一个问题,我看了芯片介绍f407有硬件浮点支持,还有不少dsp的库函数支持。我周末做了一实验,考察了一下两列浮点数连乘的运行时间。
1.for(i=0;i<6;i++)
re += *(in-i) * fircoeff; 这个在“sec”里面看了耗时是0.0000136
dsp lib里面的函数改造了一下
2.arm_add_f32(&IN[0], &fircoeff[0], &test[6], 6); 这个在“sec”里面看了耗时是0.0000187
也就是说DSP的库函数还没有直接连乘的效率高,而且这个只是连乘的结果还没有进行累加,这个让我很费解。我觉得应该不太可能。不知道问题出在哪里。
因为用DSP做的话要优化流水小,展开部分循环,输入的参数要双字对齐,告诉编译器这个循环最大和最小循环次等信息。一个循环的代码要写成这样:
_nassert(((int)x & 7) ==0);
_nassert(((int)y & 7) ==0);
_nassert(nr % 8 == 0);
#pragma MUST_ITERATE(2,4096,2);
#pragma UNROLL(16);
for(i=0;i<nr;i++)
{
*(y+i) += m * *(x - i);
}
我不清楚ARM上做算法优化是不是也需要一些技巧。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
http://www.keil.com/pack/doc/CMSIS/DSP/html/index.html
一周热门 更多>