版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《计算机系统》优化程序性能上
篇《计算机系统》课程教学组2025年春季学期请从计算机应用者的角度思考
什么是功能?什么是性能?功能vs.性能功能:指在一般条件下系统能够为用户做什么,能够满足用户什么样的需求,重点在于:做什么?性能:衡量软件质量(好/坏)的重要因素,重点在于:做得如何?功能vs.性能功能:做什么?性能:做得如何?例:支持收发以30种语言为标题和正文的邮件;支持粘贴10MB的邮件附件——功能能够在2GBRAM/1GHzCPU的服务器上,支持10000注册用户;日均处理10000邮件;响应时间不超过5秒/封
——性能作为程序设计者要(完成功能):解决“做什么”的问题更要(完成功能+优化性能)
:不仅懂得“做什么”,且追求“做得如何”本讲开始我们一起尝试优化程序性能学习目标认知编译器的局限性从高级语言角度能够优化程序性能减少不必要的函数调用减少条件测试减少存储器引用观察机器级代码确定优化程序方法循环展开增加并行性存储器性能以C代码为代表,学习如何写代码,才能够生成更高效(快速)的机器代码
以系统的观点去优化:获得性能的方法需要理解程序如何被编译和执行现代处理器与存储系统如何工作如何评估程序性能,确定瓶颈不破坏代码的模块性与通用性123算法+数据结构编译器对代码优化多任务运行在多核平台以C代码为代表,到底如何写代码,才能够生成更高效(快速)的可执行代码?——目前来看可能实现方法:获得性能的方法编译器优化代码编译器是很强的编译器能够优化程序员写的程序编译器不是万能的可能导致与程序员意图不一致的结果编译器优化时一定要保证正确性,正确性,正确性!!!所以编译器的优化处理是:保守的(悲观的、安全的):基本的优化能力
而不是:激进的优化(乐观的,不安全的):横扫式优化,不管程序员水平如何,就是要对代码进行填平式优化改变程序员的意图,不安全,不安全,不安全!!!gcc的多种优化级别-O0:(字母“O”后面跟个零)关闭所有优化选项
-O1:
最基本/缺省优化等级。编译器在不花费过多编译时间的同时,试图生成更快更小的代码。非常基础的优化,一般这些任务能顺利完成-O2:
会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间-O3:这是最高最危险的优化等级-Os:这个等级用来优化代码尺寸-Og,-Ofast先看一个例子……#include
<stdio.h>int
main(){
int
i=1,j=32;printf("%d\n",i<<j);return
0;}#include
<stdio.h>int
main(){
int
i=1,j=32;i<<j;printf("%d\n",i);return
0;}#include
<stdio.h>int
main(){
int
i=1;i<<32;printf("%d\n",i);return
0;}gcc–O0后,得到结果1gcc–O2后,得到结果0gcc–O0后,得到结果1gcc–O2后,得到结果1gcc–O0后,warning:leftshiftcount>=widthoftype得到结果1gcc–O2后,相同warning:leftshiftcount>=widthoftype得到结果1先看一个例子……#include
<stdio.h>int
main(){
int
i=1,j=32;printf("%d\n",i<<j);return
0;}#include
<stdio.h>int
main(){
int
i=1,j=32;i<<j;printf("%d\n",i);return
0;}#include
<stdio.h>int
main(){
int
i=1;i<<32;printf("%d\n",i);return
0;}gcc–O0后,得到结果1gcc–O2后,得到结果0gcc–O0后,得到结果1gcc–O2后,得到结果1gcc–O0后,warning:leftshiftcount>=widthoftype得到结果1gcc–O2后,相同warning:leftshiftcount>=widthoftype得到结果1?一个解释,移的位数如果超出了范围,比如整数移32位,longlong类型数据移64位,则属于未定义行为,编译器就可以随性而为,不管得到什么结果都是正确的undefinedbehavior(UB)istheresultofexecutingaprogramwhosebehaviorisprescribedtobeunpredictable,inthelanguagespecificationtowhichthecomputercodeadheres.编译器的局限性-1编译器遵循的一个优化原则:安全优化存储器别名问题twiddle1要求六次存储器引用(2次读*xp,2次读*yp,2次写*xp)twiddle2要求三次存储器引用
(读*xp,读*yp,写*xp)twiddle2的效率更高
延伸:
如果
xp==yp?当xp与yp相等时,twiddle1被调用后,*xp值扩大4
倍
但,twiddle2被调用后,*xp值扩大
3
倍2个版本有不同结果,编译器必须假设所有情况,其优化受限*xp+=*xp*xp+=*xp*xp+=2**xp//指针xp和yp相同(指向同一地址)编译器的局限性-1存储器的别名使用x=1000,y=3000;*q=y; //3000*p=x; //1000t1=*q;t1的取值是根据p和q的指向决定的当p,q指向同一内存位置,t1就等于1000;相反则为3000妨碍优化的因素(optimizationblocker)编译器不能确定两个指针是否指向同一个位置必须假设所有可能的情况,限制了可能的优化策略编译器的局限性-2函数调用问题func1函数调用f函数4次func2函数调用f函数1次等价?
如果f函数涉及全局变量?若counter初始值为0,func1返回值是?func2返回值呢?0+1+2+3=64*0=0优化的关键?在人
——我们自己编译器优化能力很强,但过度依赖编译器会带来意外与错误的结果编译器优化只是辅助工作值得花费更多精力写出程序,使编译器能够将之转换为更有效机器代码多观察编译器在不同优化级别的结果,提高自己的优化水平程序性能的度量
CPE示例设若有集合a={1,2,4,5,7,9,10,12,16};
则求集合a的前置和集合p
={1,1+2,1+2+4,1+2+4+5,1+1+2+4+5+7,……1+2+4+5+7+9+10+12+16}有两种计算前置和p的方法,psum1方法:简单顺眼版psum2方法:循环展开版psum1是我们通常用到的版本,看起来也比较顺眼(容易理解,可读性好)psum2是后续要详细讲解的循环展开技术(5.8节),核心的思想就是每次循环计算两个元素p[i]和p[i+1]从而减少了循环的次数。psum1是我们通常用到的版本,看起来也比较顺眼(容易理解,可读性好)psum1是我们通常用到的版本,看起来也比较顺眼(容易理解,可读性好)psum2是后续要详细讲解的循环展开技术(5.8节),核心的思想就是每次循环计算两个元素p[i]和p[i+1]从而减少了循环的次数。psum1函数的CPE:496个周期+10n个周期psum2函数的CPE:600个周期+6.5n个周期结果显示:当处理的数据量(n)小的时候,两个版本的区别不大,但当周期数n在1000以上的时候,能处理元素的个数就明显不同了,且这种趋势越拉越大从高级语言角度
先定义一个数据结构data_t代表数据类型(int,float,double)vec_rec代表所定义的类型名该结构体就是一个数组,名为data,长度为len再定义常数IDENT和OP:待优化代码combine1函数实现功能:对于已知数组v,循环遍历其所有元素,进行累加或累乘,最终结果赋值给*dest
代码移动:combine2函数改进循环效率:将vec_length移除循环外
因为向量的长度不会随着循环的进行而改变
代码移动:combine2函数改进循环效率:将vec_length移除循环外
因为向量的长度不会随着循环的进行而改变代码移动:combine2函数只计算一次vec_length(v),并保存在一个变量中,在后续的循环中使用此变量代码移动:识别要执行多次但值不会改变的代码,将其移动到代码前部分,避免重复求值改进循环效率:将vec_length移除循环外
因为向量的长度不会随着循环的进行而改变代码移动:combine2函数代码移动:combine2函数缺点:在循环的过程中每次都会调用get_vec_element来访问数组的元素,对于数组的引用,检查边界是合理的,但分析结构体的数据结构可见:不进行边界检查我们也能够进行合法的访问减少函数调用:combine3函数措施:消除循环中的函数调用减少函数调用:combine3函数combine3的副作用:去掉了原来的get_vec_element函数,有损模块化combine3的性能:虽然我们在combine3减少了过程的调用,但相比combine2性能并没有明显的提升,这说明还有别的制约性能的因素combine3函数combine3函数问题:combine3中每次OP计算会将值累计在指针dest指定的位置上。而dest是个参数变量,会造成过多的存储访问寄存器rbp保存用于dest的值每次循环,要先读rbp到xmm0,计算后的结果又会重新写入到rbp中去(对内存进行了一次读操作,一次写操作),这样很浪费时间使用局部变量:combine4函数优化措施:定义一个局部变量acc,使其在循环中累计值,在循环结束后再将值写入内存,从而消减不必要存储器引用使用局部变量:combine4函数采用局部变量存储:若CPU工作寄存器数量较多,当局部变量不多,可直接放在寄存器内,而不是放到内存里,这样也提高了执行速度可以存放在SP(Stackpointer)寄存器,当然也可存在CPU的通用寄存器中优化需要软硬兼施DavidPatterson-ANewGoldenAgeforComputerArchitecture:History,ChallengesandOpportunities冯•诺伊曼结构combine2,3,4的优化均不依赖于机器的特性若更进一步优化,需要先了解一下计算机体系结构与处理器的知识JohnvonNeumann冯•诺伊曼结构五大部件控制器(分析和执行机器指令并控制各部件的协同工作)运算器(根据控制信号对数据进行算术运算和逻辑运算)存储器(内存存储中间结果,外存存储需要长期保存的信息)输入设备(接收外界信息)输出设备(向外界输送信息)冯•诺伊曼结构设计特点:
处理单元包含算术逻辑单元和处理器寄存器
控制单元包含一个指令寄存器和程序计数器
内存存储数据与指令
外部大容量存储
输入与输出机制存储程序计算机:Astored-programcomputerisacomputerthatstoresprograminstructionsinelectronicmemory15236798以存数指令为例4完成一条指令的过程CU控制单元主存储器数据寄存器地址寄存器存储体CPU程序计数器控制器指令寄存器…运算器乘商寄存器累加器算术逻辑运算单元操作数寄存器I/O设备指令流水线
经典五段
取指令(IF):根据PC的值从存储器取出指令指令译码(ID):产生指令执行所需的控制信号取操作数(OF):读取存储器操作数或寄存器操作数执行(EX):对操作数完成指定操作写回(WB):将操作结果写入存储器或寄存器想一想,如果每条语句完全顺序执行?指令流水线基础
经典五段流水线
取指令(IF):根据PC的值从存储器取出指令指令译码(ID):产生指令执行所需的控制信号取操作数(OF):读取存储器操作数或寄存器操作数执行(EX):对操作数完成指定操作写回(WB):将操作结果写入存储器或寄存器
如果各指令之间不存在相关性,那么它们在流水线中是可以同时执行的,这种指令间潜在的重叠就是指令级并行(Instruction-LevelParallelism,ILP)结构相关(也称为名相关)指不同指令同时访问相同硬件资源,但这些指令间不存在数据流。
在冯·诺依曼存储结构中,数据和程序放在同一存储器,若此时一条指令要读或写数据,而刚好取指单元要取指令,就出现结构相关(访存冲突)结构相关指令间相关性数据相关数据相关
指某条指令的操作数依赖前一条或前几条指令的运行结果写后读相关(RAW,ReadAfterWrite)A=B+CD=A-C//在数据A上写后读指令间相关性数据相关数据相关
指某条指令的操作数依赖前一条或前几条指令的运行结果写后读相关(RAW,ReadAfterWrite)A=B+CD=A-C//在数据A上写后读指令间相关性数据相关数据相关
指某条指令的操作数依赖前一条或前几条指令的运行结果写后读相关(RAW,ReadAfterWrite)A=B+CD=3*A//在数据A上写后读读后写相关(WAR,WriteAfterRead)A=B+CB=D*2//在数据B上读后写指令间相关性数据相关数据相关
指某条指令的操作数依赖前一条或前几条指令的运行结果写后读相关(RAW,ReadAfterWrite)A=B+CD=3*A//在数据A上写后读读后写相关(WAR,Wri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 齿轮加工自动化技术二期改造升级项目可行性研究报告模板立项申批备案
- 2026年“少年儿童心向党我与祖国共成长”六一国际儿童节主题活动方案
- 2025-2030年无人机海洋垃圾清理方案行业深度调研及发展战略咨询报告
- 移动通信终端设备及零部件创新创业项目商业计划书
- 2025-2030年虚拟银行跨境支付与外汇兑换企业制定与实施新质生产力战略分析研究报告
- 全球矿产资源供需格局与战略性矿产投资逻辑
- 2026年版网站建设服务合同含维护条款
- 中国游戏行业市场格局与投资逻辑深度分析
- 湖南学考地理试卷及答案
- 铜的供需格局与能源转型驱动
- 2025年特岗教师招聘初中信息技术考试题
- 广东省深圳市罗湖区罗湖外国语学校2026届数学高一下期末经典试题含解析
- 2026年医师定期考核人文试题库100道带答案(满分必刷)
- 雨课堂学堂在线学堂云《当代中国社会与文化:大湾区文化景观(暨南)》单元测试考核答案
- GB/T 9706.266-2025医用电气设备第2-66部分:助听器及助听器系统的基本安全和基本性能专用要求
- 班前会安全培训管理制度
- 云南省2026年普通高中学业水平选择性考试调研测试生物试题(含答案详解)
- JJF(京) 165-2025 颗粒物采样器采样物理效率测试规范 荧光微球洗脱法
- 中国人民大学实验室气瓶安全管理实施细则
- 2025-2030中国工业机器人连接器行业市场供需分析及投资评估规划分析研究报告
- 入学咨询协议书
评论
0/150
提交评论