float a=1.0,b=2.0;
int i;
while(1)
{
for(i=0;i<100000;i++)
{
a=a*b;
}
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); // D4 亮
for(i=0;i<100000;i++)
{ a=a*b;
}
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); // D4 灭
}
}
如上代码,我想最大的发挥6748的运算速度,用测10W次的乘法为例,现在的情况是我对这段初始代码进行了改变:
float a=1.0,b=2.0,c=3.0,d=4.0,e=5.0;
int i;
while(1)
{
for(i=0;i<20000;i++)
{
a=a*b;
b=b*c;
c=c*d;
d=d*e;
e=a*c;
}
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); // D4 亮
for(i=0;i<20000;i++)
{ a=a*b;
b=b*c;
c=c*d;
d=d*e;
e=a*c;
}
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); // D4 灭
}
}
依然测10W次,对比之前的代码,可以优化到-O1,-pm,-mt,整体运算时间大幅度减少,每个b=b*c运算耗时6 cpu cycle(但是有个别步骤耗时30cpu cyle ,我判断是for循环导致流水线断开,并且逐渐回复的过程)。但是看了datasheet里面,浮点运算速度是2748 MFLOPS,主频456Mhz,乘法计数器写着2sp X sp=sp per clock,并且DSP的乘法指令周期汇编手册上写了在1个cpu cycle。那么我现在如何提升每个b=b*c运算的速度尽量到1个cpu cycle呢?或者我该如何修改代码,才可以进行-O2 -O3的优化呢?
Shine:
看一下下面的wiki网站是否有用。http://processors.wiki.ti.com/index.php/Floating_Point_Optimization