This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

大家讨论一下:C66X完成实数FIR波滤器的性能



实现环境:

一次性输入长度为320信号数据x,滤波器的系数h长度为64个抽头。数据精度均为Q.15。根据大家的编程经验,C66X每一个机器周期,能完成的乘法次数有多少?

我的测试结果:每机器周期大约完成4.4个乘法次数。

而C66X资料上讲:可能在复数环境下周期大约完成32个乘法次数,在实数环境下周期大约完成16个乘法次数。当然上述存在一个累加运算,对整个性能存在影响。另外,还有整个滤波算法对存贮器资源需求、除M之外的其它运算单元的需求等因素也对整个算法的速度均存在影响。

但个人感觉我所完成的乘法速度也太慢了,或者讲没有充分利用C66X中的乘法资源。

DSP完成FIR滤波是整个信号处理中的最基本功能,其速度也是衡量该器件能力的重要标志。因而希望大家讨论一下你所使用的C66X在滤波处理中的运算性能。

等待大家的讨论!

  • 1.1    DDOTP4H (c66)

    long long __BUILTIN _ddotp4h    (__x128_t,  __x128_t);

    DDOTP4H 一个指令可以做8对个short相乘并累加(如图,是累加成两个和)

    如果A, B两侧算上的话就可以一个cycle做16个乘法。

    TI官方的DSPlib中的FIR滤波器就是用这个指令优化的。

     

    你实测性能只有4.4可能是因为D 单元受限,因为你的系数太长(64阶),取系数,取样值都要用D单元。

  • 达不到每cycle的16实数乘法的性能,是受.D元限制,优化之后的反馈提示如下:

    ;*                                A-side   B-side
    ;*      .L units                                           1        0    
    ;*      .S units                                           0        0    
    ;*      .D units                                          2        4*   
    ;*      .M units                                          4*       4*   
    ;*      .X cross paths                               4*       2    
    ;*      .T address paths                           4*       4*   
    ;*      Long read paths                            0        0    
    ;*      Long write paths                            0        0    
    ;*      Logical  ops (.LS)                          2        3     (.L or .S unit)
    ;*      Addition ops (.LSD)                       5        4     (.L or .S or .D unit)
    ;*      Bound(.L .S .LS)                           2        2    
    ;*      Bound(.L .S .D .LS .LSD)             4*       4* 

    我是做无线信道接收机,接收的(I,Q)信号首先需经过滤波。

    我主要是想要知道:C66X方面的专家目前在实数FIR运算方面所能达到的性能。C66X高手在FIR优化方面有什么经验?

     

     

     

  • 你这个循环还是M单元受限,感觉你还没有使用_ddotp4h

    另外你D单元用的似乎也不太高效
    使用了不对齐加载_mem8()-- 每个cycle只能做一个load
    改成用对齐加载_amem8() -- 每个cycle可以在A,B侧同时load,但要注意避免bank冲突

    最好的避免D单元首先的办法是把滤波器系数全部存在寄存器。你是64抽头,要占用32个寄存器,确实比较多,但不妨试试

    你可以参考DSPlib的优化,里面有FIR的例子,只是阶数小一些

  • 也是办法之一。

    不知道有谁在实际运用中实现了每个C66X核实数乘法运算速度能逼近达16*1.25G的运行速度。

    以我目前的经验乘每核乘法运算处只能达到6*1.25G的速度