当前位置: 首页 > news >正文

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记

写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理总结,希望读者理解。


《深入理解计算机系统(CSAPP)》第3章 程序的机器级表示 - 学习笔记_友人帐_的博客-CSDN博客

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记_友人帐_的博客-CSDN博客

《深入理解计算机系统(CSAPP)》第6章 存储器层次结构 - 学习笔记_友人帐_的博客-CSDN博客

《深入理解计算机系统(CSAPP)》第7章 链接- 学习笔记_友人帐_的博客-CSDN博客

《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记_友人帐_的博客-CSDN博客

《深入理解计算机系统(CSAPP)》第9章虚拟内存 - 学习笔记_友人帐_的博客-CSDN博客


第五章 优化程序性能

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

(1)编译器能做的优化

优化选项:-Ox:g-基本优化;1~3 - 更高级优化。

  • 寄存器分配
  • 代码选择与排序(调度)
  • 消除死代码
  • 消除轻微的低效率问题

(2)优化的局限性

  • 要在基本约束下运行:不能引起程序功能的任何改变;不去优化畸形情况下的程序行为。

  • 只在单个文件中进行优化分析,不做文件间的代码优化分析,代价太大。

  • 大多数分析都是基于静态信息,难以预测运行时的输入。

  • 遇到问题时必须对程序只使用安全的优化,偏保守。

2. 妨碍编译器优化的因素

  • 内存别名:两个指针指向同一个内存位置;因此编译器必须假设不同的指针可能会指向内存中同一个位置。

  • 函数调用:不能确定函数调用是否有副作用;因此编译器会假设最糟的情况并保持所有的函数调用不变。

解决方法:

  • 对于内存别名:

    消除不必要的内存引用:可以增加局部变量,将运算中间值累积在寄存器中,在整个过程结束后写回目标内存。

  • 对于函数调用:

    用内联函数替换优化函数调用:将函数调用展开替换为函数体;

    减少过程调用:尽量少地调用函数。

3. 优化方法

(1)不依赖处理器

  • 代码移动:如果某段代码总是产生相同的结果,就将其从循环中移出,避免重复计算。

  • 复杂运算简化:用更简单的方法替换昂贵的操作,例如使用移位、加代替乘法、除法。

  • 共享公用子表达式:找到多个计算的公共部分,重用表达式的一部分。

  • 尽量减少循环边界的检查

  • 消除不必要的内存引用,用局部变量累积结果

  • 使用AVX2编程,使用向量指令计算

(2)实现指令级并行

  • 循环展开

通过增加每次迭代计算的元素的数量,减少循环的迭代次数。减少了不直接有助于程序结果的操作的数量,例如循环索引计算和条件分支。它提供了一些方法,可以进一步变化代码,减少整个计算中关键路径上的操作数量。

k × 1 k\times 1 k×1展开

limit = length - k + 1;
for (i = 0; i < limit; i += k)
{// 对元素i到i+k-1合并运算
}
for (; i < length; i++)
{// 以每次处理一个元素的方式处理最后0~k-1个元素
}
  • 提高并行性

利用更多的功能单元来执行,比单个完全流水线化的功能单元更快,打破延迟界限。

使用多个累积量:对于可结合和可交换的合并运算可以通过将一组合并运算分割成两个或更多的部分,并在最后合并结果来提高性能。

k × n k\times n k×n展开:k次循环展开,n路并行

limit = length - k + 1;for (i = 0; i < limit; i += k)
{// 对元素i到i+k-1合并运算// 使用n个累积量
}// 处理最后0~k-1个元素// n个累积量运算结果合并

最好使用 k × k k\times k k×k展开,且对于延迟为 L L L,容量为 C C C的操作而言,循环展开因子 k ≥ C ⋅ L k\ge C·L kCL时达到最大吞吐量。

展开变换时,必须考虑实现的功能是否与原来相同。要考虑运算是否可交换、可结合,溢出情况下是否保证结果与原来相同等。(浮点加法和乘法不可结合,原因在于四舍五入和溢出)

同时k不能过大,否则会出现寄存器溢出的情况:k的个数超过了机器的寄存器个数,会将变量分配在栈上,运行速度反而会降低。(x86-64处理器有16个寄存器,并可以使用16个YMM寄存器来保存浮点数)

  • 重组(重新结合变换)

改变运算顺序,以减少计算中关键路径上操作的数量,更好地利用功能单元的流水线能力。下一个循环的部分操作可以早一些开始。

称为 k × n a k\times na k×na展开。

4. 现代CPU设计

(0)基本概念

程序性能度量标准:每元素的周期数 (Cycles Per Element, CPE)

功能单元的性能:

  • 延迟(latency):表示完成运算所需要的总时间;

  • 发射时间(issue time):表示两个连续的同类型的运算之间需要的最小时钟周期数;

  • 容量(capacity):表示能够执行该运算的功能单元的数量。

  • 最大吞吐量:发射时间的倒数。一个完全流水线化(发射时间为1)的功能单元有最大的吞吐量,每个时钟周期进行一个运算。具有多个功能单元可以进一步提高吞吐量。对一个容量为C,发射时间为I的操作来说,处理器可能获得的吞吐量为每时钟周期C/I个操作。(每个时钟周期可以完成的操作数)

CPE值的两个基本界限:

  • 延迟界限(latency bound):因为在下一条指令开始之前,这条指令必须结束。给出了任何必须按照严格顺序完成合并运算的函数所需要的最小CPE值。理解:严格按照顺序执行,即使用一个功能单元,执行该合并运算最低能达到的CPE。(即为一个功能单元的极限,但可以通过增加功能单元并行计算以使实际运算速度突破这个界限)
  • 吞吐量界限(throughput bound):刻画了处理器功能单元的原始计算能力。这个界限是程序性能的终极限制。理解:比如执行整数加法的最大吞吐量为2,即每个时钟周期最多可以执行2次整数加法运算,故由于最大吞吐量为2,吞吐量对于整个合并运算的CPE限制为1/2=0.5,即由于最大吞吐量为2,整数加法的CPE最低只能到达0.5。

(1)现代处理器特点

能够实现指令级并行,同时对多条指令求值。

  • 超标量(superscalar):是它可以在每个时钟周期执行多个操作。把计算分解为多个阶段,在阶段间传递部分计算。
    在这里插入图片描述

  • 乱序的(out-of-order):指令执行的顺序不一定与它们在机器级程序中的顺序一致。

(2)主要组成部分

  • 指令控制单元(Instruction Control Unit, ICU):负责从内存中读出指令序列,并根据这些指令序列生成一组针对程序数据的基本操作。
  • ICU 从指令高速缓存 (instruction cache) 中读取指令,指令高速缓存是一个特殊的高速存储器,它包含最近访问的指令。通常,ICU会在当前正在执行的指令很早之前取指,这样它才有足够的时间对指令译码,并把操作发送到EU。
  • 取指控制的块包括分支预测,以完成确定取哪些指令的任务。
  • 指令译码逻辑接收实际的程序指令,并将它们转换成一组微操作。
  • 退役单元 (retirement unit) 记录正在进行的处理,控制寄存器文件中所记录的那些寄存器的更新。令译码时,关于指令的信息被放置在一个先进先出的队列中。这个信息会一直保持在队列中,直到发生以下两个结果中的一个。①一旦一条指令的操作完成了,而且所有引起这条指令的分支点也都被确认为预测正确,那么这条指令就可以退役(retired)了,所有对程序寄存器的更新都可以被实际执行了。②如果引起该指令的某个分支点预测错误,这条指令会被清空(flushed),丢弃所有计算出来的结果。
  • **执行单元 (Execution Unit, EU):**接收来自取指单元的操作并执行。每个时钟周期会接收多个操作 这些操作会被分派到一组功能单元中,分别用来专门处理不同类型的操作。
  • 读写内存是由加载和存储单元实现的。
  • 加载和存储单元通过数据高速缓存(data cache) 来访问内存。数据高速缓存是一个高速存储器,存放着最近访问的数据值。
  • 使用投机执行技术对操作求值,但是最终结果不会存放在程序寄存器或数据内存中,直到处理器能确定应该实际执行这些指令。分支操作被送到EU,确定分支预测是否正确。如果预测错误,EU会丢弃分支点之后计算出来的结果,还会发信号给分支单元,说预测是错误的,并指出正确的分支目的。在这种情况中,分支单元开始在新的位置取指。
  • 标记为执行“算术运算”的单元通常是专门用来执行整数和浮点数操作的不同组合。
  • 为了加速一条指令到另一条指令的结果的传送,执行单元可以直接将结果发送给彼此。

在这里插入图片描述

(3)现代处理器的一些功能

  • 分支预测(branch prediction):处理器会猜测是否会选择分支,同时预测分支的目标地址。

一种方式:投机执行(speculative execution):处理器会开始取出位于它预测的分支会跳到的地方的指令,并对指令译码,甚至在它确定分支预测是否正确之前就开始执行这些操作。如果过后确定分支预测错误,会将状态重新设置到分支点的状态,并开始取出和执行另一个方向上的指令。

  • 寄存器重命名

在这里插入图片描述

相关文章:

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…...

【Spring Boot】033-使用 `@ResponseBody` 注解代替`ServletResponse`?

【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse&#xff1f; 文章目录 【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse&#xff1f;0、全局总结一、ResponseBody 注解与 ServletResponse 比较1、ResponseBody 注解2、ServletResponse3、总结 二…...

【openGauss实战13】闪回技术

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

Top大学教授:青年学者,请避免这些写作问题→

在科研初期&#xff0c;很多作者由于缺乏经验和指导&#xff0c;糊里糊涂地发了一些质量较低的论文。 为了帮助青年科学家提高写作能力&#xff0c;比利时鲁汶大学的Blocken教授&#xff08;同时也是Building & Environment、Journal of Wind Engineering & Industrial…...

使用midjourney搞出一套三国人物画像!

当下已进入如火如荼的全民AI时代&#xff0c;最近体验了下midjourney&#xff0c;使用它的以图生图功能生成出来一套三国人物画像&#xff0c;和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程&#xff0c;大致如下&#x…...

ELK日志分析系统

ELK日志分析系统 日志主要包括系统日志/var/log 应用日志 安全日志secure&#xff0c; rsyslog远程传输日志进行汇总集中化管理&#xff0c;日志统计和检索又成为一件比较麻烦的事情&#xff0c;、 1、完整日志系统基本特征 收集&#xff1a;能够采集多种来源的日志数据 …...

整型在内存中的存储

目录 一、为什么内存中存储补码&#xff1f; 二、大小端概念 百度笔试试题&#xff1a; 几道小题&#xff1a; 一、为什么内存中存储补码&#xff1f; 上一节我们了解了原码&#xff0c;反码&#xff0c;补码的概念&#xff08;http://t.csdn.cn/N0grg&#xff09;&#xff…...

子集-回溯算法

1题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1…...

公司study three

ctrlwind&#xff1a;新建桌面 ctrlwin 箭头 切换桌面 WIN CTRL F4 删除桌面 stream foreach遍历 instFormModifytracesList.stream().forEach(s->{ s.setModifyUser(sysUserTemplate.getNameById(s.getModifyUser()));});拼接 String collect2 peopleList.stream()…...

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…...

CycloneDDS开源代码在Linux系统上编译生成可执行文件的详细步骤

cyclonedds开源代码在Linux系统上编译生成可执行文件的详细步骤 1 远程仓库CycloneDDS源码下载2 创建build目录3 进入build目录4 指定安装路径前缀5 编译 cmake --build6 编译完成后进行安装7 版本构建并编译7.1 虚拟机网络桥接7.2 镜像源添加7.3 CUnit单元测试工具安装7.4 编译…...

PLL锁相环的一部分--鉴频鉴相器

鉴频鉴相器作为锁相环的一部分也是有相对应的独立芯片. 鉴频鉴相器芯片主要有以下几种&#xff1a; LM565/LM565C 鉴频鉴相器芯片XR2211CP 鉴频鉴相器芯片NE567 比较器、鉴频、鉴相 ICMC1496/LM1496 综合运算放大器与调制/解调器 ICLM567 比较器、鉴频、鉴相 ICMC100EP2100 高…...

CSS实现磨砂玻璃(毛玻璃)效果样式

要实现磨砂玻璃背景&#xff0c;可以使用 CSS3 中的 ::before 伪元素和 backdrop-filter 属性&#xff0c;结合 opacity 属性和 blur() 函数来实现。 具体实现步骤如下&#xff1a; 创建一个具有背景的元素&#xff0c;例如一个 div 元素。 div {background-image: url(&quo…...

Solidity拓展:数学运算过程中数据长度溢出的问题

在数学运算过程中假如超过了长度则值会变成该类型的最小值&#xff0c;如果小于了该长度则变成最大值 数据上溢 uint8 numA 255; numA;uint8的定义域为[0,255]&#xff0c;现在numA已经到顶了&#xff0c;numA会使num变成0(由于256已经超过定义域&#xff0c;它会越过256&…...

【C语言】经典题目(一)

【C语言】字符串刷题篇在这里哦&#xff01; 【C语言】字符串—刷题篇 【C】语言经典题目&#xff0c;五个摘录为一篇&#xff0c;将会持续更新啦&#xff01;&#x1f49e; C语言经典题目 三位数水仙花数完数求利润三个数数字排序 三位数 &#x1f4ab;题目 已知有1、2、3、4…...

Linux 设备树文件手动编译的 shell 脚本

前言 前面通过 Makefile 实现手动编译 Linux 设备树 dts 源文件及其 设备树依赖 dtsi、.h 头文件&#xff0c;如何写成一个 shell 脚本&#xff0c;直接编译呢&#xff1f; 其实就是 把 Makefile 重新编写为 shell 脚本即可 编译设备树 shell 脚本 脚本内容如下&#xff1a…...

C++核心编程——初识STL——STL的基本概念和六大组件

文章目录&#x1f4ac; 一.前言二.STL基本概念和组成①容器②算法③迭代器④空间配置器⑤适配器⑥仿函数 三.STL工作机制 一.前言 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西&#xff0c;以及一种得以制造出“可重复运用的东西”的方法,让程序员的心血不止于…...

5.2图的BFS与DFS遍历

一.BFS遍历 1.图的广度优先遍历代码实现 说明&#xff1a; 1.广度优先遍历&#xff0c;类比树的层次遍历&#xff08;树属于特殊的图&#xff09; 2.对应算法想象图的物理结构存储&#xff1a; 邻接矩阵表示唯一时间复杂度&#xff1a;O(|V|^2); 邻接表不唯一:O(|V|2|E|)&…...

JSP+SQL网上选课系统(源代码+论文+答辩PPT)

随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生选课系统作为一种现代化的教学技术,以越来越受到人民的重视,是一个学校不可缺少的部分, 学生选课系统就是为了管理好选课信息而设计的。学…...

C语言数据结构——树、堆(堆排序)、TOPK问题

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...