您好、香榭丽舍
客户对 c66x DSP 应用手册中优化环路部分3.1.5中的示例有一些疑问。
https://www.ti.com/lit/an/sprabg7/sprabg7.pdf
void example_gc (cplxf_t * a、cplxf_t * ejalpha、float * abs_a、int n)
{
int i;
float a_sqr、oneOverAbs_a;
对于(i = 0;i < n;i++)
{
a_sqr =a[i].Real * a[i].Real + a[i].imag * a[i].imag;
oneOverAbs_a =1.f/(float) sqrt (a_sqr);
abs_a[i]= a_sqr * oneOverabs_a;
ejalpha[i].Real =a[i].Real * oneOverAbs_a;
ejalpha[i].imag =a[i].imag * oneOverAbs_a;
}
}
优化代码如下所示:
_nassert (n % 4 = 0);
_nassert (((int) a % 8 = 0);
_nassert (((int) ejalpha % 8 = 0);
_nassert (((int) abs_a % 8 = 0);
#pragma MUST_ITERATE (4、100、4);
#pragma UNROLL (2);
对于(i = 0;i < n;i++)
{
a_sqr = a[i].Real * a[i].Real + a[i].imag * a[i].imag;
oneOverAbs_a =_rsqrsp (a_sqr);/* 1/sqrt ()指令8位尾数精度*/
/*一个内插*/
oneOverAbs_a = oneOverAbs_a *(1.5f -(a_sqr/2.f)* oneOverAbs_a * oneOverAbs_a);
abs_a[i]= a_sqr * oneOverabs_a;
ejalpha[i].Real =a[i].Real * oneOverAbs_a;
ejalpha[i].imag =a[i].imag * oneOverAbs_a;
}
问题:
以下两条指令的含义是什么?
oneOverAbs_a =1.f/(float) sqrt (a_sqr);
abs_a[i]= a_sqr * oneOverabs_a;
2.优化后,代码按如下方式更改:
oneOverAbs_a =_rsqrsp (a_sqr);/* 1/sqrt ()指令8位尾数精度*/
/*一个内插*/
oneOverAbs_a = oneOverAbs_a *(1.5f -(a_sqr/2.f)* oneOverAbs_a * oneOverAbs_a);
rsqrsp
为什么将 oneOVerAbs_A 更改为 oneOverAbs_a *(1.5f -(a_sqr/2.f)* oneOverAbs_A * oneOverAbs_a);
rsqrsp?
3.什么是 e jangle (A[i])?
谢谢。
Rgds
闪亮