计算机组成原理2

大家好我是jiantaoyab,这是我参考网上很多博主写的文章,所总结作为学习的笔记,在这里分享给大家,还有一些书籍《深入理解计算机系统》《计算机组成:结构化方法》《计算机体系结构:量化研究方法》

什么是性能呢?

在日常的生活中,我们常常提到性能,买手机或者是电脑,我们都想在合适的价格下买到性能最好的,那究竟什么是性能呢?

性能是时间的倒数

计算机的性能,其实和我们干体力劳动很像,好比是我们要搬东西。对于计算机的性能,我们需要有个标准来衡量。这个标准中主要有两个指标。

  • 响应时间(Response time)或者叫执行时间(Execution time)。想要提升响应时间这个性能指标,你可以理解为让计算机“跑得更快”

在这里插入图片描述

  • 吞吐率(Throughput)或者带宽(Bandwidth),想要提升这个指标,你可以理解为让计算机“搬得更多”

在这里插入图片描述

所以,响应时间指的就是,我们执行一个程序,到底需要花多少时间。花的时间越少,自然性能就越好。而吞吐率是指我们在一定的时间范围内,到底能处理多少事情。这里的“事情”,在计算机里就是处理的数据或者执行的程序指令。

和搬东西来做对比,如果我们的响应时间短,跑得快,我们可以来回多跑几趟多搬几趟。所以说,缩短程序的响应时间,一般来说都会提升吞吐率。

当然我们还可以多找一些人来搬东西,于是就有了8核,16核的出现。人多力量大,同时处理数据,在单位时间内就可以处理更多数据,吞吐率自然也就上去了

一般的把性能定义成响应时间的倒数
性能 = 1 / 响应时间 性能 = 1/ 响应时间 性能=1/响应时间

这样一来,我们只要缩短响应的时间,行能的数值就越大

计算机的计时单位:CPU 时钟

现实的时间中,我们可以用时间来衡量性能的指标,但是在计算机中,我们每次运行用一个程序的时间都是不相同的,为什么会不同呢?

在计算机中,们统计时间是用类似于“掐秒表”一样,记录程序运行结束的时间减去程序开始运行的时间。这个时间也叫 Wall Clock Time 或者 Elapsed Time,就是在运行程序期间,挂在墙上的钟走掉的时间。

但是我们的计算机是会同时运行着多个程序,CPU是在不同的程序间去切换,不过速度太快我们肉眼看不出,CPU每次切换就会跑掉一部分的时间,并且有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 CPU。所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,我不能用时间作为指标

在Linux下,我们能用运行time 命令。它会返回三个值,第一是realtime,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;第三个是sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time

在这里插入图片描述

实际上用的时间是0.015s,但是CPU time 是 0.020 + 0.007 = 0.027 s ,为什么我这里的时间比real还多了呢?

在这里插入图片描述

通过top命令可以看到我的 seq 和 wc 命令占据几乎是CPU 100%,2个命令给分配到了不同的CPU中执行,于是user 和 sys 和时间 是2个CPU运行的时间这和,就可能超过了real 的时间了

但是即使我们已经拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异,除了 CPU 之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。所以,我们需要对“时间”这个我们可以感知的指标进行拆解,把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。
程序的 C P U 执行时间 = C P U 时钟周期数 × 时钟周期时间 程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间 程序的CPU执行时间=CPU时钟周期数×时钟周期时间

时钟周期时间

我们在买CPU的时候,会看到CPU会标明是多少多少Hz,这里的 Hz 就是电脑的主频(Frequency/Clock Rate)。假如是 3.0GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 3.0G 条。

这个3.0GHz就是CPU钟表能识别出来最小的时间间隔像我们挂在墙上的挂钟,都是“滴答滴答”一秒一秒地走,所以通过墙上的挂钟能够识别出来的最小时间单位就是秒。主频越高,意味着这个表走得越快

而在 CPU 内部,和我们平时戴的电子石英表类似,有一个叫晶体振荡器(Oscillator Crystal)的东西,简称为晶振。我们把晶振当成 CPU 内部的电子表来使用。晶振带来的每一次“滴答”,就是时钟周期时间。

CPU 时钟周期数

对于 CPU 时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积。
程序的 C P U 执行时间 = 指令数 × C P I × C l o c k C y c l e T i m e 程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time 程序的CPU执行时间=指令数×CPI×ClockCycleTime
每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle,指令数,代表执行我们的程序到底需要多少条指令、用哪些指令

光堆主频就能无限制的提升CPU吗?

奔腾4的失败就告诉我们,是不可以的,我们还得考虑功耗的问题

CPU,一般都被叫作超大规模集成电路(Very-Large-Scale Integration,VLSI)。这些电路,实际上都是一个个晶体管组合而成的。CPU 在计算,其实就是让晶体管里面的“开关”不断地去“打开”和“关闭”,来组合完成各种运算和功能。

想要计算得快,一方面,我们要在 CPU 里,同样的面积里面,多放一些晶体管(增加晶体管可以增加硬件能够支持的指令数量),也就是增加密度;另一方面,我们要让晶体管“打开”和“关闭”得更快一点,也就是提升主频。而这两者,都会增加功耗,带来耗电和散热的问题

为什么不能选择增加CPU的面积呢?

如果增加CPU的面积的话,晶体管的距离就变大了,电信号传输的时间就会变长

CPU的功率
功耗  = 1 / 2 × 负载电容 × 电压的平方 × 开关频率 × 晶体管数量 功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量 功耗 =1/2×负载电容×电压的平方×开关频率×晶体管数量
为了要提升性能,我们需要不断地增加晶体管数量。同样的面积下,我们想要多放一点晶体管,就要把晶体管造得小一点。这个就是平时我们所说的提升“制程”。从 28nm 到 7nm,相当于晶体管本身变成了原来的 1/4 大小。这个就相当于我们在工厂里,同样的活儿,我们要找瘦小一点的工人,这样一个工厂里面就可以多一些人。我们还要提升主频,让开关的频率变快,也就是要找手脚更快的工人

在这里插入图片描述

但是,功耗增加太多,就会导致 CPU 散热跟不上,这时,我们就需要降低电压。这里有一点非常关键,在整个功耗的公式里面,功耗和电压的平方是成正比的。这意味着电压下降到原来的 1/5,整个的功耗会变成原来的 1/25

通过并行提高性能

提升响应时间,就好比提升你用的交通工具的速度,比如原本你是开汽车,现在变成了火车乃至飞机。本来开车从广东到北京要 很多 个小时,换成飞机就只要 几个小时了,但是,在此之上,再想要提升速度就不太容易了。我们的 CPU 在奔腾 4 的年代,就好比已经到了飞机这个速度极限。

假如我们可以一次同时开 2 架、4 架乃至 8 架飞机,这就好像我们现在用的 2 核、4 核,乃至 8 核的 CPU,虽然时间没变,但是我们能同时运输更多的东西。

但是,并不是所有问题,都可以通过并行提高性能来解决。如果想要使用这种思想,需要满足这样几个条件。

  1. 需要进行的计算,本身可以分解成几个可以并行的任务

  2. 需要能够分解好问题,并确保几个人的结果能够汇总到一起

  3. 在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步来。

这就引出了性能优化中,常常用到的一个经验定律,阿姆尔定律,这定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率提升的情况

阿姆达尔定律
优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间 优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间 优化后的执行时间=受优化影响的执行时间/加速倍数+不受影响的执行时间

提高性能可以优化的方面

  • 加速大概率事件

在数学中大概率就是一个随机事件发生的概率很大,在一次实验中很可能发生,举个在计算机中的例子,假如一段代码有多个分支,每个分支都有一个被执行到的概率,因此我们可以实验分析每个分支的概率,按照概率大小进行排序,对大概率的分支优先加速优化。

  • 通过流水线提高性能

流水线是并行性的一个特例,处理器就是通过流水线的方式来提高指令的执行效率,流水线最初起源于车辆制造,车辆被拆分成很多个的部件,每个部件又可以继续拆分,拆分后的所有部件形成了流水线图,流水线图呈拓扑结构,拓扑中同一层的部件可以由独立的生产线进行生产,这样就可以灵活地扩充生产线来提高车辆的制造效率。

流水线优化的最大目标是将依赖延迟到最后,对所有的依赖关系进行拆解,拆解成多个不互相依赖的步骤,使得每个步骤可以并行运行,从而从整体上提高运行吞吐量和效率。

  • 通过预测提高性能

在某些情况下,我们可以大胆地预测计算机下一步的动作,可以提前将这些动作完成,等到需要执行这些动作的时候,已经提前准备好了,当然提前预测也是有失败率的,假设失败造成的效率下降为X,执行了预测的动作后,提高的效率为Y,只要X小于Y,这个提前预测就是有效的,是可以提高性能的

计算机里一个比较常见的提前预测的例子就是磁盘预读,通常我们读取磁盘的数据时,会先将硬盘数据读入到缓冲中,程序从缓冲中读取数据,当缓冲数据被读完后,处理器再从磁盘读取下一批数据,这里可以假设读取磁盘数据是顺序的,我们可以提前把下一次要读取的数据,加入到另外一个缓冲中,这样读取当前缓冲数据的时候,已经开始读取下一批缓冲的数据了,充分地利用了硬件资源,当前缓冲数据读取完毕后,直接可以用下一批缓冲的数据,不需要等待,当然这里如果下一批数据变成了随机的,那就可能会造成已经读取的数据的失效和浪费,不过,如果大部分情况下都是顺序读取的,提前读取获得的性能提高远大于由于读取失效造成的性能下降

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux信号【systemV】

目录 前言 正文: 1消息队列 1.1什么是消息队列? 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…

【每日一题】3.2 求逆序对

题目描述 给定一个长度为 n的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i个和第 j个元素&#xff0c;如果满足 i<j 且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输入格式 第一行包含整数 n…

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

【深度学习笔记】计算机视觉——图像增广

图像增广 sec_alexnet提到过大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后&#xff0c;生成相似但不同的训练样本&#xff0c;从而扩大了训练集的规模。 此外&#xff0c;应用图像增广的原因是&#xff0c;随机改变训练样本可以…

unity 场景烘焙中植物叶片(单面网络)出现的白面

Unity版本 2021.3.3 平台 Windows 在场景烘焙中烘焙植物的模型的时候发现植物的叶面一面是合理的&#xff0c;背面是全白的&#xff0c;在材质球上勾选了双面烘焙&#xff0c;情况如下 这个问题可能是由于植物叶片的单面网格导致的。在场景烘焙中&#xff0c;单面网格只会在一…

【Pytorch】模型部署

文章目录 0. 进行设置1. 获取数据2. FoodVision Mini模型部署实验概要3. 创建 EffNetB2 特征提取器4. 创建 ViT 特征提取器5. 使用训练好模型进行预测并计时6. 比较模型结果、预测时间和大小7. 通过创建 Gradio 演示让 FoodVision Mini 呈现8. 将Gradio demo变成可部署的应用程…

面试准备:排序算法大汇总 C++

排序算法总结 直接插入排序 取出未排序部分的第一个元素&#xff0c;与已排序的部分从后往前比较&#xff0c;找到合适的位置。将大于它的已排序的元素向后移动&#xff0c;将该元素插入到合适的位置。 //1. 直接插入排序 void InsertionSort(vector<int>& nums){f…

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商&#xff0c;武汉灰京文化注重多样化的推广策略&#xff0c;通过与各大媒体、社交平台和游戏社区建立紧密的合作关系&#xff0c;为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式&#xff0c;将游戏信息传播给…

框架漏洞-->Struts2 Docker_Vulnhub搭建

来浅浅的讲一下Struts2漏洞 目录 1.Docker_Vulnhub搭建 2.Struts2 3.Struts2的框架特征 4.S2-029-->Remote Code Execution 5.漏洞复现 1.RCE 2.Getshell 1.Docker_Vulnhub搭建 因为我用的是Linux&#xff0c;所以我选择直接搭个docker&#xff0c;这里我建议先换个…

SpringCloud微服务-统一网关Gateway

统一网关Gateway 文章目录 统一网关Gateway1、为什么需要网关?2、gateway快速入门3、路由断言工厂Route Predicate Factory4、过滤器工厂-路由过滤器GatewayFilter5、全局过滤器**GlobalFilter**6、各种过滤器的执行顺序7、跨域问题的解决 1、为什么需要网关? 网关与各个服务…

模拟队列(数组实现)

题目描述&#xff1a; 代码模板&#xff1a; int q[N],hh,tt -1;//插入操作 void push(int x) {q[tt] x; }//弹出操作 void pop() {hh ; }//判断是否为空 bool empty() {if(hh > tt) return true;else return false; }//返回队首元素 int query() {return q[hh]; }AC代…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

React富文本编辑器开发(一)

这是一个系统的完整的教程&#xff0c;每一节文章的内容都很重要。这个教程学完后自己可以开发出一个相当完美的富文本编辑器了。下面就开始我们今天的内容&#xff1a; 安装 是的&#xff0c;我们的开发是基于Slate的开发基础&#xff0c;所以要安装它&#xff1a; yarn ad…

第19章-IPv6基础

1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

Vue开发实例(七)Axios的安装与使用

说明&#xff1a; 如果只是在前端&#xff0c;axios常常需要结合mockjs使用&#xff0c;如果是前后端分离&#xff0c;就需要调用对应的接口&#xff0c;获取参数&#xff0c;传递参数&#xff1b;由于此文章只涉及前端&#xff0c;所以我们需要结合mockjs使用&#xff1b;由于…

智慧公厕:让城市更智慧、更环保

在现代社会&#xff0c;智慧公厕作为城市管理的重要一环&#xff0c;是智慧城市的重要组成部分&#xff0c;其建设的价值十出突出&#xff0c;是公共厕所信息化升级改造的核心方案。如智慧公厕源头厂家广州中期科技有限公司&#xff0c;所自主研发的智慧公厕整体解决方案&#…

docker-mysql:5.7安装

1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、安装 # -d&#xff1a;后台运行 #…