当前位置:网站首页>嵌入式C语言循环展开
嵌入式C语言循环展开
2022-07-27 16:51:00 【WangLanguager】
1、分析:
每次循环过程中,在循环体中都增加了两条指令,一条减法指令(1个机器周期),一条分支指令(3个机器周期),共4个机器周期,这是系统的开销。
2、改进:
(1)重复循环体多次,减小开销比例。
(2)循环体内代码增多,循环次数减少。
3、循环展开的例子:
int checksum_v9(int *data, unsigned int N)
{
int sum = 0;
do
{
sum += *(data++);
sum += *(data++);
sum += *(data++);
sum += *(data++);
N-=4; //假设需要累加的数据的个数是4的倍数
} while (N!=0);
return sum;
}
上述程序的汇编代码为:
checksum_v9_s
MOV r2,#0 ;sum = 0
checksum_v9_loop
LDR r3,[r0] #4 ;r3 = *(data++)
SUBS r1,r1,#4 ;N-=4 and set flags
ADD r2,r3,r2 ;sum += r3
LDR r3,[r0] #4 ;r3 = *(data++)
ADD r2,r3,r2 ;sum += r3
LDR r3,[r0] #4 ;r3 = *(data++)
ADD r2,r3,r2 ;sum += r3
LDR r3,[r0] #4 ;r3 = *(data++)
ADD r2,r3,r2 ;sum += r3
BNE checksum_v9_loop ;if(N != 0) goto loop
MOV r0,#r2 ;r0 = sum
MOV pc,r14 ;return r0
4、讨论
改进后:总的循环开销从4N个机器周期减小为N个机器周期(每次循环需要4个机器周期的循环开销,减小为原来的1/4)。如果循环体越小,此方法效果越明显,甚至可以提高效率近1倍。
假设N=20,优化前执行83条语句,则优化后执行53条语句。
5、问题
(1)应该展开多少?
(2)展开次数不是4的倍数?
6、循环展开的思路
(1)循环展开的缺点
①代码量增加,占用更多的内存
②Cache空间占用问题
(2)所以需要具体问题具体分析,找到平衡点
7、举例:
例如:程序中循环体执行需要128个机器周期,循环开销一般是4个机器周期,
占3%,如果循环体占总程序的30%,那么循环开销占总程序的约1%,此时展开
循环,性能提高很有限。
循环的展开,有可能破坏cache中的内容,导致抖动,使程序性能急剧下降。
8、假设需要累加的数据的个数不是4的整数倍
int checksum_v10(int *data, unsigned int N)
{
unsigned int i;
int sum = 0;
for(i = N/4; i != 0; i --)
{
sum += *(data++);
sum += *(data++);
sum += *(data++);
sum += *(data++);
};
for(i = N&3; i != 0; i--)
{
sum += *(data++); //假设需要累加的数据的个数不是4的倍数
}
return sum;
}
9、结论
(1)循环计数值要用递减方式,计数器采用无符号数时,终止条件用(i!=0),不要用(i >= 0)
(2)如果确定循环次数大于1,则使用do{}while循环结构
(3)对于小循环体,可以进行循环展开,减小系统开销
(4)尽量使数组的大小为展开系数N的倍数
边栏推荐
- SQL time processing (SQL server\oracle)
- Role authorization --- complete the addition and deletion of secondary menus by adding and deleting primary menus
- Webmagic+selenium+chromedriver+jdbc grabs data vertically.
- Cyclic multi-Variate Function for Self-Supervised Image Denoising by Disentangling Noise from Image
- C language: 8. Makefile preparation
- C language: 13. Pointer and memory
- Programming jump
- c语言:15、结构体
- c语言:7、c语言多源码文件使用方法
- MySQL学习笔记(2)——存储过程与存储函数
猜你喜欢

Debian夺回“debian.community“ 域名,喷子仍不善罢甘休

kettle入门级操作第一篇(读取excel、输出excel)

sql 字段类型转换

go-zero单体服务使用泛型简化注册Handler路由

win10小技巧(1)——转移桌面位置

汉字查拼音微信小程序项目源码

2022 Ningde Vocational College Teachers' practical teaching ability improvement training - network construction and management

C language: 12. GDB tool debugging C program

Automatic testing of Web UI: Selenium syntax explanation is the most complete in the history

Definition of graph traversal and depth first search and breadth first search (2)
随机推荐
落实责任到人,广州多措并举筑牢儿童暑期“安全线”
低代码实现探索(四十五)业务参数
C语言案例:密码设置及登录> 明解getchar与scanf
2022备战秋招10W字面试小抄pdf版,附操作系统、计算机网络面试题
kettle EXCEL 累计输出数据
Questions about webservice
kettle8.2 安装及常见问题
Opening and using Alibaba cloud object storage OSS
C language: C language code style
kettle 分列、合并记录
大佬们,ORACLE CDC,本地运行,老是遇到这个An exception occurred in
C language: 14. Preprocessing
HDU1171_Big Event in HDU【01背包】
ipfs通过接口获得公钥、私钥,并加密存储。第一弹
C language: clion debugging method
C language: 13. Pointer and memory
Role authorization --- complete the addition and deletion of secondary menus by adding and deleting primary menus
win10小技巧(1)——转移桌面位置
正十七边形尺规作图可解性复数证明
The first entry-level operation of kettle (reading excel, outputting Excel)