(讨论)ARM的DSP 函数效率

2019-07-20 21:48发布

       我目前用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上做算法优化是不是也需要一些技巧。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
czdspeed
1楼-- · 2019-07-21 22:46
 精彩回答 2  元偷偷看……
czdspeed
2楼-- · 2019-07-22 01:33
jeff_梁 发表于 2016-5-25 16:16
我现在做的项目也是用F4的DSP来跑算法,也有很多盲区!以后还望指点

好的,谢谢你。有问题多交流我搞dsp比较多,arm的dsp核也不是很懂。
Lone
3楼-- · 2019-07-22 04:45
DSP没有涉及,学习了
czdspeed
4楼-- · 2019-07-22 10:25
 精彩回答 2  元偷偷看……
czdspeed
5楼-- · 2019-07-22 12:14
jeff_梁 发表于 2016-5-25 16:16
我现在做的项目也是用F4的DSP来跑算法,也有很多盲区!以后还望指点

好的,有问题多交流。
xkwy
6楼-- · 2019-07-22 18:09
 精彩回答 2  元偷偷看……

一周热门 更多>