平台: OMAPL138E
优化等级:O2
大家好,我现在做DSP优化的事情,做了一个DSP优化实验,目的是充分利用流水,减少指令执行周期。
在做测试的时候写了几段对比代码,发现了一些比较奇怪的问题,具体描述如下
float arr_f[1004];//定义的浮点数组
for(i=0;i<1004;i++)
{
arr_f[i] = arm_share.data[i] * 1.0; //arm_share.data[] 里的数据是随机数 整型的,乘以1.0是为了转换成浮点数
}
void test_float1(void)
{
int o,n;
int i=0;
float result = 0.0;
Task_sleep(10);
o=TSCL;
for(i=0;i<1000;i++)
{
result += arr_f[i] + arr_f[i+1] + arr_f[i+2]; //!!!
}
n=TSCL;
Task_sleep(10);
u1_printf("test_float1 %d %f\r\n", (n-o), result);
}
void test_float1_1(void)
{
int o,n;
int i=0;
float result = 0.0;
Task_sleep(10);
o=TSCL;
for(i=0;i<1000;i++)
{
result += arr_f[i]; //!!!
result += arr_f[i+1];
result += arr_f[i+2];
}
n=TSCL;
Task_sleep(10);
u1_printf("test_float1_1 %d %f\r\n", (n-o), result);
}
# test_float1 2055 960710.000000
# test_float1_1 1659 960710.000000
test_float1 的周期数 为 2055,
test_float1_1的周期数 为 1659,
结论:通过改变代码的写法,可以减少指令执行周期数,这个比较好理解,但是下面这种写法,测试的结果就有点奇怪,想不明白,具体代码如下
void test_float2(void)
{
int o,n;
int i=0;
float result = 0.0;
Task_sleep(10);
o=TSCL;
for(i=0;i<1000;i++)
{
result += arr_f[i] + arr_f[i+1] + arr_f[i+2] + arr_f[i+3]; //!!!
}
n=TSCL;
Task_sleep(10);
u1_printf("test_float2 %d %f\r\n", (n-o), result);
}
void test_float2_2(void)
{
int o,n;
int i=0;
float result = 0.0;
Task_sleep(10);
o=TSCL;
for(i=0;i<1000;i++)
{
result += arr_f[i]; //!!!
result += arr_f[i+1];
result += arr_f[i+2];
result += arr_f[i+3];
}
n=TSCL;
Task_sleep(10);
u1_printf("test_float2_2 %d %f\r\n", (n-o), result);
}
# test_float2 2025 1263704.000000
# test_float2_2 16005 1263704.000000
test_float2 的周期数 为 2055,
test_float2_2的周期数 为 16005
看测试的结果,为什么test_float2_2函数用的指令周期多了这么多?
仅仅多了这一句代码 result += arr_f[i+3],指令周期数一下在变成了16005,
想了好长时间都想不明白,麻烦大家或TI的技术们帮忙看一下,谢谢