如果有长度为512的INT型数组a和b,希望对a和b做乘家,返回和,你会用哪种方法?
大部分人闭上眼睛马上就会想到下面的代码
int i;
float sum = 0;
for(i=0; i<512; i++)
{
sum += a[i] * b[i];
}
这种方法很好理解,但是效率不高。
推荐以下的做法:对a和b数组采用双精度浮点读取,再按32位高位和低位数值分别处理。因为C6000 CPU的两个数据通路各有一个乘法器,可以在一个cycle内执行两条32位乘法才,所以下面循环的乘累加运算可以在一个cycle中执行完毕,效率显然要优于上面的代码。
int i;
float sum0 = 0;
float sum1 = 0;
for (i=0; i<512/2; i++)
{
sum0 += _itof(_hi(a[i])) * _itof(_hi(b[i]));
sum1 += _itof(_lo(a[i])) * _itof(_lo(b[i]));
}
return sum0 + sum1;
类似的做法可扩展至向量的加法、减法、乘法运算。 |