计算机组成原理-CPU集合篇(持续更新)

说明

||| 代表个人想法

参考学习:

​ 1. 极客时间专栏-深入浅出计算机组成原理

性能指标之 计算机的计时单位 - CPU时钟

虽然时间是一个很自然的用来衡量性能的指标,但是用时间来衡量时,有两个问题。

第一个就是时间不“准”。如果用你自己随便写的一个程序,来统计程序运行的时间,每一次统计结果不会完全一样。有可能这一次花了 45ms,下一次变成了 53ms。

为什么会不准呢?这里面有好几个原因。首先,我们统计时间是用类似于“掐秒表”一样,记录程序运行结束的时间减去程序开始运行的时间。这个时间也叫 Wall Clock Time 或者 Elapsed Time,就是在运行程序期间,挂在墙上的钟走掉的时间。

但是,计算机可能同时运行着好多个程序,CPU 实际上不停地在各个程序之间进行切换。在这些走掉的时间里面,很可能 CPU 切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 CPU。所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,我们得把这些时间给刨除掉

Linux 下有一个叫 time 的命令,可以帮我们统计出来,同样的 Wall Clock Time 下,程序实际在 CPU 上到底花了多少时间。

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

$ time seq 1000000 | wc -l
1000000


real  0m0.101s
user  0m0.031s
sys   0m0.016s

||| 如果机器是多核心那么请加大数值,实例在单核心的机器中运行

我们先来理解一下什么是时钟周期时间。你在买电脑的时候,一定关注过 CPU 的主频。比如我手头的这台电脑就是 Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。

||| 解释下,2.8GHz中实际G是代表10亿,那么2.8GHz就代表28亿次

||| 如果我们认为2.8GHz一秒,那么也就是28亿次一秒,28亿次那么暂时认为是CPU执行一个指令的次数,那么对于一些组合指令以及精简指令就不能按这个假设去计算

||| 如果一个指令执行的过程中还会调其他指令呢,就比如我们写的程序,为了更加方便使用跟维护,通常会将一个小功能进入分解跟组装,那么我是不是可以认为有些指定执行中,可能会调用其他指令

最简单的提升性能方案,自然缩短时钟周期时间,也就是提升主频。换句话说,就是换一块好一点的 CPU。不过,这个是我们这些软件工程师控制不了的事情,所以我们就把目光挪到了乘法的另一个因子——CPU 时钟周期数上。如果能够减少程序需要的 CPU 时钟周期数量,一样能够提升程序性能。

对于 CPU 时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积。

程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time

因此,如果我们想要解决性能问题,其实就是要优化这三者。

  1. 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的 80386 主频只有 33MHz,现在手头的笔记本电脑就有 2.8GHz,在主频层面,就提升了将近 100 倍。
  2. 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。在后面讲解 CPU 结构的时候,我们会看到,现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。因此,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
  3. 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。

我们可以把自己想象成一个 CPU,坐在那里写程序。计算机主频就好像是你的打字速度,打字越快,你自然可以多写一点程序。CPI 相当于你在写程序的时候,熟悉各种快捷键,越是打同样的内容,需要敲击键盘的次数就越少。指令数相当于你的程序设计得够合理,同样的程序要写的代码行数就少。如果三者皆能实现,你自然可以很快地写出一个优秀的程序,你的“性能”从外面来看就是好的。


   转载规则


《计算机组成原理-CPU集合篇(持续更新)》 江松泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
主从-从库的表比主库的大,表空间相差过大 主从-从库的表比主库的大,表空间相差过大
背景因为这边公司做数据分析的需求,mysql并不满足数据的速度条件,所有需要先mysql同步到clickhouse,因为同步到clickhouse的压力过大,为了不影响主库,所以采用搭建主从的方式,通过从库进行数据同步,为了保证多个从库同步
2022-02-21
下一篇 
prometheus-基于http_sd_configs的服务发现 prometheus-基于http_sd_configs的服务发现
说明暂时不考虑写prometheus的搭建章(单机搭建太简单了。。。),后续可能会考虑写prometheus的集群、prometheus的外部存储等文章 这文章需要一定的GO基础,如果只是直接尝试使用,无所谓 这文章只是测试而已,真实使用还
2021-12-09
  目录