(讨论)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上做算法优化是不是也需要一些技巧。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。