CPU 执行程序的秘密,藏在了这 15 张图里( 六 )


指令的类型指令从功能角度划分 , 可以分为 5 大类:

  • 数据传输类型的指令 , 比如 store/load 是寄存器与内存间数据传输的指令 , mov 是将一个内存地址的数据移动到另一个内存地址的指令;
  • 运算类型的指令 , 比如加减乘除、位运算、比较大小等等 , 它们最多只能处理两个寄存器中的数据;
  • 跳转类型的指令 , 通过修改程序计数器的值来达到跳转执行指令的过程 , 比如编程中常见的 if-else、swtich-case、函数调用等 。
  • 信号类型的指令 , 比如发生中断的指令 trap;
  • 闲置类型的指令 , 比如指令 nop , 执行后 CPU 会空转一个周期;
指令的执行速度CPU 的硬件参数都会有 GHz 这个参数 , 比如一个 1 GHz 的 CPU , 指的是时钟频率是 1 G , 代表着 1 秒会产生 1G 次数的脉冲信号 , 每一次脉冲信号高低电平的转换就是一个周期 , 称为时钟周期 。
对于 CPU 来说 , 在一个时钟周期内 , CPU 仅能完成一个最基本的动作 , 时钟频率越高 , 时钟周期就越短 , 工作速度也就越快 。
一个时钟周期一定能执行完一条指令吗?答案是不一定的 , 大多数指令不能在一个时钟周期完成 , 通常需要若干个时钟周期 。 不同的指令需要的时钟周期是不同的 , 加法和乘法都对应着一条 CPU 指令 , 但是乘法需要的时钟周期就要比加法多 。
如何让程序跑的更快?
程序执行的时候 , 耗费的 CPU 时间少就说明程序是快的 , 对于程序的 CPU 执行时间 , 我们可以拆解成 CPU 时钟周期数(CPU Cycles)和时钟周期时间(Clock Cycle Time)的乘积 。
CPU 执行程序的秘密,藏在了这 15 张图里文章插图
时钟周期时间就是我们前面提及的 CPU 主频 , 主频越高说明 CPU 的工作速度就越快 , 比如我手头上的电脑的 CPU 是 2.4 GHz 四核 Intel Core i5 , 这里的 2.4 GHz 就是电脑的主频 , 时钟周期时间就是 1/2.4G 。
要想 CPU 跑的更快 , 自然缩短时钟周期时间 , 也就是提升 CPU 主频 , 但是今非彼日 , 摩尔定律早已失效 , 当今的 CPU 主频已经很难再做到翻倍的效果了 。
另外 , 换一个更好的 CPU , 这个也是我们软件工程师控制不了的事情 , 我们应该把目光放到另外一个乘法因子 —— CPU 时钟周期数 , 如果能减少程序所需的 CPU 时钟周期数量 , 一样也是能提升程序的性能的 。
对于 CPU 时钟周期数我们可以进一步拆解成:「指令数 x 每条指令的平均时钟周期数(Cycles Per Instruction , 简称 CPI)」 , 于是程序的 CPU 执行时间的公式可变成如下:
CPU 执行程序的秘密,藏在了这 15 张图里文章插图
因此 , 要想程序跑的更快 , 优化这三者即可:
  • 指令数 , 表示执行程序所需要多少条指令 , 以及哪些指令 。 这个层面是基本靠编译器来优化 , 毕竟同样的代码 , 在不同的编译器 , 编译出来的计算机指令会有各种不同的表示方式 。
  • 每条指令的平均时钟周期数 CPI , 表示一条指令需要多少个时钟周期数 , 现代大多数 CPU 通过流水线技术(Pipline) , 让一条指令需要的 CPU 时钟周期数尽可能的少;
  • 时钟周期时间 , 表示计算机主频 , 取决于计算机硬件 。 有的 CPU 支持超频技术 , 打开了超频意味着把 CPU 内部的时钟给调快了 , 于是 CPU 工作速度就变快了 , 但是也是有代价的 , CPU 跑的越快 , 散热的压力就会越大 , CPU 会很容易奔溃 。
很多厂商为了跑分而跑分 , 基本都是在这三个方面入手的哦 , 特别是超频这一块 。
CPU 执行程序的秘密,藏在了这 15 张图里文章插图