int32数组300个求和,如何最快执行?实测执行1次加法运算平均要4个指令周期,是否有问题
int32 a[300],b;
方法1测试:
b=a[0];
b+=a[1];
b+=a[2];
…
b+=a[299];
不用循环语句,直接加,加载在RAM中测试,运行耗时8us左右;
方法2测试:
i=300;b=0;
while(i–)
b+=a[i];
加载在RAM中运行测试,耗时为30us左右;
另外使用浮点加法也测试了下,同样的while循环耗时大致为38us左右。
测试的时间是采用在程序前后加GPIO翻转操作,使用示波器看电平时间测试得到。
问题是如何优化类似数组的求和计算,按理说流水线结构第一种方式测试耗时应该是2us左右,为什么感觉慢了4倍!
onebyte:
这个可以看一下汇编代码
int32数组300个求和,如何最快执行?实测执行1次加法运算平均要4个指令周期,是否有问题
int32 a[300],b;
方法1测试:
b=a[0];
b+=a[1];
b+=a[2];
…
b+=a[299];
不用循环语句,直接加,加载在RAM中测试,运行耗时8us左右;
方法2测试:
i=300;b=0;
while(i–)
b+=a[i];
加载在RAM中运行测试,耗时为30us左右;
另外使用浮点加法也测试了下,同样的while循环耗时大致为38us左右。
测试的时间是采用在程序前后加GPIO翻转操作,使用示波器看电平时间测试得到。
问题是如何优化类似数组的求和计算,按理说流水线结构第一种方式测试耗时应该是2us左右,为什么感觉慢了4倍!
Martin Yu:
用电平翻转方法测试,会加入IO口的电平改变时间,建议计算操作所需的指令周期数,再根据主频计算时间。
int32数组300个求和,如何最快执行?实测执行1次加法运算平均要4个指令周期,是否有问题
int32 a[300],b;
方法1测试:
b=a[0];
b+=a[1];
b+=a[2];
…
b+=a[299];
不用循环语句,直接加,加载在RAM中测试,运行耗时8us左右;
方法2测试:
i=300;b=0;
while(i–)
b+=a[i];
加载在RAM中运行测试,耗时为30us左右;
另外使用浮点加法也测试了下,同样的while循环耗时大致为38us左右。
测试的时间是采用在程序前后加GPIO翻转操作,使用示波器看电平时间测试得到。
问题是如何优化类似数组的求和计算,按理说流水线结构第一种方式测试耗时应该是2us左右,为什么感觉慢了4倍!
jian liu:
回复 Martin Yu:
连续300次加法求和,IO翻转时间基本可以忽略;
按照我的理解,300次加法,连续的没有循环语句的,每一次应该就是只要1个周期,150M下应该只有2us左右,不会是测到的8us
不懂汇编。。。