实现环境:
一次性输入长度为320信号数据x,滤波器的系数h长度为64个抽头。数据精度均为Q.15。根据大家的编程经验,C66X每一个机器周期,能完成的乘法次数有多少?
我的测试结果:每机器周期大约完成4.4个乘法次数。
而C66X资料上讲:可能在复数环境下周期大约完成32个乘法次数,在实数环境下周期大约完成16个乘法次数。当然上述存在一个累加运算,对整个性能存在影响。另外,还有整个滤波算法对存贮器资源需求、除M之外的其它运算单元的需求等因素也对整个算法的速度均存在影响。
但个人感觉我所完成的乘法速度也太慢了,或者讲没有充分利用C66X中的乘法资源。
DSP完成FIR滤波是整个信号处理中的最基本功能,其速度也是衡量该器件能力的重要标志。因而希望大家讨论一下你所使用的C66X在滤波处理中的运算性能。
等待大家的讨论!
James Li2:
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单元。
chenpjh:
回复 James Li2:
达不到每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优化方面有什么经验?
James Li2:
回复 chenpjh:
你这个循环还是M单元受限,感觉你还没有使用_ddotp4h
另外你D单元用的似乎也不太高效使用了不对齐加载_mem8()– 每个cycle只能做一个load改成用对齐加载_amem8() — 每个cycle可以在A,B侧同时load,但要注意避免bank冲突
最好的避免D单元首先的办法是把滤波器系数全部存在寄存器。你是64抽头,要占用32个寄存器,确实比较多,但不妨试试
你可以参考DSPlib的优化,里面有FIR的例子,只是阶数小一些
chenpjh:
回复 James Li2:
也是办法之一。
不知道有谁在实际运用中实现了每个C66X核实数乘法运算速度能逼近达16*1.25G的运行速度。
以我目前的经验乘每核乘法运算处只能达到6*1.25G的速度
TI中文支持网