HIT-CSAPP 第五章 面向程序的优化方法(1)

news2025/1/18 9:50:01

考纲:

1.面向程序性能的优化

  • 面向编译器的程序优化方法:减少过程调用、减少内存引用、指令并行等方法等方法。
  • 面向流水线、超标量、向量CPU的程序优化方法。

2.存储器的层次结构

优化编译器的能力和局限性

内存别名使用妨碍函数优化

void twiddle1(long *xp, long *yp){ //假设传入的参数是1 2 
    *xp + = *yp;                    //x = x+y=3
    *xp + = *yp;                    //x =x+y=5
}

第一段代码,函数从内存中引用数据需要访问内存两次,然后执行加的操作往内存中写还需要访问依次内存,这就是三次。然后下一句x = 5又访存了三次所以一共访存了六次。

void twiddle2(long *xp, long *yp){ //假设传入的参数是1 2 
    *xp + =2* *yp;                    //x = x+2y=5
}

第二个函数他把访存六次变成了访存三次,但是在实际运行中编译器是否会采用第二种方式呢?

 采用第二种方式往往得不到我们想要的结果:假设xp和yp指针指向内存的同一位置,那么在下面这种情况下,可能和预期不符。

///twiddle1执行的效果:扩大四倍///
*xp += *xp;
*xp += *xp;

//twiddle2执行的效果扩大三倍///
*xp += 2**xp;

事实上,编译器为了避免xp和yp相等的情况,不会产生类似twiddle2的代码进行优化。

再看书上的一个例子:

x = 1000, y=3000
*q=y;/*3000*/
*p=x;/*1000*/
t1=*q;/*1000 or 3000*/

两个指针指向同一位置的情况叫做内存别名使用,如果指向同一位置那么就是1000指向不同位置那么就是3000,编译器必须假设两种情况,这就限制了编译器的优化。

练习5.1

如果相等
*xp = *xp+*xp //2x
*xp = *xp-*xp//0
*xp = *xp-*xp//0

递归调用

 内联函数对函数调用的优化

表示程序的性能

  • CPE:每元素的周期数
  • CPI:每指令的周期数
  • 延迟界限:当一系列指令严格按照顺序执行,执行下一条指令前,上一条指令必须完成
  • 吞吐量界限:是程序性能的终极界限,刻画处理器单元的原始计算能力。

一般有用的优化

考虑编译器

 不考虑编译器

1.代码移动

如果他总是产生相同的结果,将代码从循环中移出。

 2.复杂运算简化

  • 比如可以用移位代替乘法:乘法需要三个时钟周期而移位只需要一个时钟周期。
  • 将乘法替换成加法如下图蓝色笔所示,演示的乘法和加法是等价的,性能提高了三倍

 3.共享公共子表达式

-og 基本的优化 -o1 -o2更高级别的优化

 都有i*n+j的表达式,汇编语言掌握即可。

程序员角度优化程序

减少过程调用

 为什么编译器不能自动代码移动&&程序员如何提高程序性能

 消除不必要的内存引用

 CPU和内存之间速度差距很大,所以第六章介绍了多级缓存结构,但是每次CPU访问主存还是要花费时间的,从程序员的角度,可以尝试减少访问时间。

 b[i]--------每次都要读出来再写回 为啥编译器不能优化? 内存别名

 由第七章的知识可知局部变量是存放在栈中,局部变量运行的时候往往先存放在cache中

 这样优化完之后,就将要修改的值存入cache,减少访问内存的次数,增加对缓存的访问,进而提高程序的速度。

练习5.4

  

 A:没经过优化的代码中,%xmm0简单地被用作临时值,每次循环迭代中都会设置和使用,

B:两个版本有相同的功能,甚至内存别名的使用

C:变换可以不改变程序的行为,因为除了第一次迭代开始从dest读取值和前一次迭代最后写入到这个寄存器的值是相同的。因此,合并指令可以简单第使用在循环开始时就已经在%xmm0中的值。

两个函数的区别是,第二个函数访问的次数少,第一个没必要读内存,其实只需要把有用的数据写入内存就行

利用执行集并行

Benchmark例子:向量的数据类型

                                                        减少内存引用

采用流水线方式工作

5.8循环展开:

循环展开通过每次增加函数循环迭代的个数,减少迭代的次数,也可以减少关键路径的数量。

 但是优化之后不能明显提高程序性能,我们分析一下原因。

 练习5.8画关键路径

 

 

 

 

问题:

内联函数 减少内存访问次数的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ERTEC200P-2 PROFINET设备完全开发手册(4-1)

ERTEC200P-2作为应用处理器,既可以单独使用,通过GPIO扩展实现基本的IO功能。也可以配合外部主机(例如单片机)实现更复杂的应用。ERTEC200P-2与外部主机接口的示意图如下。常用的接口包括UART,SPI,XHIF接口。…

MSI: 基于多元同步索引的SSVEP频率识别算法

MSI: 基于多元同步索引的SSVEP频率识别算法1.算法背景2.算法原理3.Python代码实现1.算法背景 脑机接口(Brain-Computer Interface, BCI)因其在神经工程与神经科学中的广泛应用价值而备受研究者们的关注。BCI系统可以在人类或动物被试与外部设备之间提供…

“深元AI”赋能传统加油站智能化转型,全力打造新一代智慧加油站

历届的全国两会和党代会上,“安全生产”始终是核心议题。党的二十大报告提出:推动公共安全治理模式向事前预防转型,并强调要加强重点行业、重点领域安全监管,提高防灾减灾救灾和重大突发公共事件处置保障能力。同时,国…

Linux_vim编辑器

Vi编辑器是所有Unix及Linux系统下标准的编辑器,类似于windows系统下的notepad(记事本)编辑器,由于在Unix及Linux系统的任何版本,Vi编辑器是完全相同的,因此可以在其他任何介绍vi的地方都能进一步了解它&…

Java的CPU 飙升700%优化的真实案例

最近负责的一个项目上线,运行一段时间后发现对应的进程竟然占用了700%的CPU,导致公司的物理服务器都不堪重负,频繁宕机。 那么,针对这类java进程CPU飙升的问题,我们一般要怎么去定位解决呢? 采用top命令定位进程 登…

spring初始项目创建

首先进入http://spring.p2hp.com/projects/spring-framework.html,点击git按钮 点击Access to Binaries中的链接 找到里程碑版本,要引入仓库地址 这里的spring-context依赖只是基础的spring框架的依赖 在resources目录下创建spring的xml文件&#xff0c…

中国31个主要城市绿地数据(空间分辨率为1m)

近年来,为了满足生态文明和可持续发展的理念,科学的城市绿地规划和管理在中国越来越受到重视。因此,提高UGS分类体系和布局布局的合理性,建设绿色宜居城市,是近年来政府和学者关注的重点。为此,本文选取中国…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与…

Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

系列文章 👉 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用起来省心多了。 也借此总结学习下:Terraform Cloud 比 Terraform OSS 有哪些增强,…

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。 1、功能需求 《球球大作战》是一款多人对战游戏,下图是它的战斗场景…

C语言库函数(memcpy,memmove)的模拟实现

模拟实现memcpy函数 下面是memcpy的函数声明 void *memcpy(void *str1, const void *str2, size_t n) 参数 str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。n -- 要被复…

stm32当中的EXTI外部中断系统

一. 中断系统 中断 : 在主程序运行过程中,出现特定的中断触发条件,使得CPU暂停当前正在运行的程序,而去处理中断程序,完成后,又返回原来被暂停的位置继续工作 中断优先 : 当有多个中断开始时&…

SSR初体验-结合Vue3全家桶

SSR初体验 基础搭建 安装依赖 先开启一个服务器 let express require("express");let server express();server.get("/", (req, res) > {res.send(Hello Node Server); });server.listen(3000, () > {console.log("start node server on …

vue3引入Element plus的详细步骤

目录 一、遇到问题 二、操作步骤 一、遇到问题 在用vue3去引用Element UI的时候,发现了白屏不能显示,一直检查是不是代码的问题。后面找到了问题的所在,原来是vue3对应兼容的是Element Plus,要去下载对应的Element plus版本来引…

为什么提升客户服务是长期成功的关键

当今互联网,服务越来约趋向个人化,但在这个在线互动的时代,当涉及到客户支持时,这种个人联系的感觉可能很难形成。当事情出错时,当客户需要支持时,个人联系的感觉最为强烈。在不远的过去,客户支…

网络安全如何入门?有哪些学习误区?

那年我高三毕业的时候要填志愿前几天 我妈问我想学什么专业。 我说,想学网络设计、或者计算机、网络安全工程师 那时候还比较年轻,也对网络,计算机这方面感兴趣嘛 于是我妈和我爸决定让我学网管。 我说不想做网管,想直接成为一…

给想涨薪和正在学习Android的朋友们一些建议

前言 相信很多从事Android开发工作的朋友,在入职一年后会有申请涨薪的想法,但由于某些原因,公司拒绝了您的加薪申请,在我看来,出现这种情况主要有两种原因:第一个原因可能是你在工作中就只知道埋头苦干&am…

81-82-83-84-85-86 - 文件系统设计与实现

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)深入浅出操作系统 - 目录 文章目录1. 问题1.1 硬盘上最最最简单的文件系统支持方式1.2 改进思路1.3 更多细节问题1.4 文件系统概要设计1.5 硬盘数据逻辑示意图1.6 硬盘数据物理组…

文心一言 VS chatgpt (8)-- 算法导论2.3 5~6题

五、回顾查找问题(参见练习 2.1-3),注意到,如果序列 A 已排好序,就可以将该序列的中点与v进行比较。根据比较的结果,原序列中有一半就可以不用再做进一步的考虑了。二分查找算法重复这个过程,每次都将序列剩余部分的规…

数据结构之七大排序

数据结构之七大排序🔆排序的概念及其运用排序的概念常见的排序算法🔆插入排序直接插入排序希尔排序🔆选择排序直接选择排序堆排序🔆交换排序冒泡排序快排🔆归并排序🔆非比较排序🔆结语&#x1f…