一、CPU 时钟周期、主频、CPI、IPS、MIPS 的关系
CPU 的运行可以理解为被一个“节拍器”驱动。这个节拍器每跳一下,CPU 内部就推进一个很小的基本操作。这个节拍就是时钟周期,而一秒钟跳多少次,就是主频。
主频表示 CPU 每秒产生多少个时钟周期,单位通常是 Hz、MHz、GHz。
例如:
主频 = 3 GHz
表示每秒有 3 × 10<sup>9</sup> 个时钟周期
时钟周期是主频的倒数:
时钟周期 T = 1 / 主频 f
主频越高,单个时钟周期越短。例如 1 GHz 的时钟周期是 1 ns,2 GHz 的时钟周期是 0.5 ns。
但是注意,主频高不等于程序一定快。因为一条指令通常不是一个时钟周期就能完成的。
这里就引出 CPI。
CPI 是 Cycles Per Instruction,表示平均每条指令需要多少个时钟周期。
例如:
CPI = 4
表示平均执行一条指令需要 4 个时钟周期
如果某 CPU 主频为 2 GHz,CPI 为 2,则它每秒大约能执行:
IPS = 主频 / CPI
IPS = 2 × 10<sup>9</sup> / 2 = 1 × 10<sup>9</sup> 条指令/秒
IPS 是 Instructions Per Second,即每秒执行多少条指令。
MIPS 是 Million Instructions Per Second,即每秒百万条指令数:
MIPS = IPS / 10<sup>6</sup>
所以常用关系是:
IPS = 主频 / CPI
MIPS = 主频 / (CPI × 10<sup>6</sup>)
如果主频单位直接用 MHz,那么更方便:
MIPS = 主频(MHz) / CPI
例如 CPU 主频 100 MHz,CPI = 4,则:
MIPS = 100 / 4 = 25
完整的 CPU 执行时间公式是:
CPU 执行时间 = 指令条数 × CPI × 时钟周期
也可以写成:
CPU 执行时间 = 指令条数 × CPI / 主频
这几个量的关系在考研里非常常见:
主频 f 越高,时钟周期 T 越短
CPI 越大,平均每条指令越慢
指令条数越多,程序总时间越长
所以判断 CPU 性能时,不能只看主频。真正影响程序运行时间的是:
指令条数、CPI、主频
这也是经常考的陷阱:主频高的机器不一定比主频低的机器快。如果它的 CPI 更大,或者同一个程序在它上面需要执行更多指令,那么总时间可能反而更长。
二、MIPS 为什么不能绝对衡量 CPU 性能
MIPS 看起来很直观:每秒执行多少百万条指令。但它有一个很大的问题:不同机器的“指令”复杂度可能不同。
有的机器一条指令能完成很复杂的操作,有的机器需要多条简单指令才能完成同样工作。所以两个 CPU 的 MIPS 即使相同,实际完成任务的能力也可能不同。
例如:
机器 A:一条指令做很多事,MIPS 较低
机器 B:一条指令很简单,MIPS 较高
不一定说明 B 比 A 强。因为 B 可能需要更多指令才能完成同一个程序。
所以考研里要记住:
MIPS 适合在同一机器、同一类程序附近做粗略比较;
不适合直接比较不同指令系统、不同体系结构的计算机性能。
真正可靠的还是看具体程序的执行时间。
三、机器字长到底是什么
机器字长是指计算机一次能够直接处理的二进制数据的位数,通常与 CPU 的寄存器位数、ALU 一次运算的位数密切相关。
例如:
32 位机器:通常一次能直接处理 32 位二进制数据
64 位机器:通常一次能直接处理 64 位二进制数据
这里的“字”不是汉字的字,而是计算机中的 word。
所以:
机器字长 = CPU 一次能直接处理的数据位数
它通常会影响:
寄存器位数
ALU 运算位数
整数运算范围
地址表示能力
数据通路宽度
操作系统和编译器的数据模型
但是要注意,考研里容易混淆下面几个概念:
| 概念 | 含义 |
|---|---|
| 机器字长 | CPU 一次能直接处理的数据位数 |
| 指令字长 | 一条机器指令的二进制位数 |
| 存储字长 | 存储器一个存储单元存放的二进制位数 |
| 数据总线宽度 | 一次在总线上传送的数据位数 |
| 地址总线宽度 | 能表示多少个存储地址 |
这些概念可能相等,但不必然相等。
例如,一个 64 位 CPU 通常有 64 位通用寄存器,但它的地址总线不一定真的是 64 位。现实中很多 64 位处理器并不会支持完整的 264 地址空间。
考研中常见说法是:
机器字长越长,计算机一次能处理的数据位数越多,运算精度通常越高,寻址能力通常越强。
但严格说,机器字长只是影响因素,不是唯一因素。
四、为什么机器字长与运算精度密切相关
所谓运算精度,简单说就是数在计算机中表示得有多细、多准、多大范围。
计算机里的数最终都要用二进制位表示。位数越多,能表示的信息越多。
对于整数来说,位数越多,能表示的整数范围越大。
例如无符号整数:
8 位:0 到 255
16 位:0 到 65535
32 位:0 到 2<sup>32</sup> - 1
64 位:0 到 2<sup>64</sup> - 1
对于有符号整数,通常用补码表示:
n 位有符号整数范围:-2<sup>n-1</sup> 到 2<sup>n-1</sup> - 1
例如 32 位有符号整数:
-2<sup>31</sup> 到 2<sup>31</sup> - 1
所以机器字长越长,CPU 一次能直接处理的整数位数越多,整数运算范围通常越大。
对于小数来说,位数越多,能保留的小数有效位也越多,误差通常越小。
因此说:
机器字长与运算精度密切相关。
但不能简单理解成:
64 位机器所有运算精度都一定是 64 位。
这是错误的。
因为程序中具体使用什么精度,还取决于数据类型。例如 C 语言里可以有:
int
long
float
double
long double
Java 里也有:
int
long
float
double
CPU 是 64 位,不代表所有变量都自动变成 64 位,也不代表所有小数都是 64 位精度。
五、定点数是什么
定点数就是小数点位置固定的数。
计算机本身只存 0 和 1,不会真的存一个“小数点符号”。所谓定点数,是人为规定某些位表示整数部分,某些位表示小数部分。
例如规定一个 8 位二进制数中,前 4 位表示整数部分,后 4 位表示小数部分:
1011.0101
这个小数点的位置固定在中间,所以叫定点数。
如果没有小数部分,整数也可以看成一种特殊的定点数:
10110101
在计算机组成原理中,定点数常见有两类:
定点整数
定点小数
定点整数就是平常说的整数,默认小数点固定在最低位之后:
10110101.
定点小数默认小数点固定在符号位之后、数值位之前,常用于纯小数表示:
0.101101
定点数的特点是:
表示简单
运算速度快
硬件实现相对容易
表示范围有限
小数精度受固定位置限制
考研里讲原码、反码、补码、移码时,主要是在讲定点数的机器表示,尤其是定点整数。
六、浮点数是什么
浮点数就是小数点位置可以“浮动”的数。
它类似科学计数法。
十进制里可以写:
12345 = 1.2345 × 10<sup>4</sup>
0.0012345 = 1.2345 × 10<sup>-3</sup>
二进制浮点数也类似:
N = 尾数 × 基数<sup>阶码</sup>
在二进制计算机中,基数通常是 2,所以可以理解成:
N = 尾数 × 2<sup>阶码</sup>
浮点数通常由三部分组成:
符号位
阶码
尾数
其中:
符号位:表示正负
阶码:控制小数点移动,决定表示范围
尾数:保存有效数字,决定有效精度
因此浮点数的核心思想是:
用阶码扩大表示范围
用尾数保存有效精度
这就是为什么浮点数可以表示很大或很小的数。
例如:
1.01 × 2<sup>10</sup>
1.01 × 2<sup>-10</sup>
小数点位置由阶码控制,所以“小数点会浮动”。
浮点数的特点是:
表示范围大
适合科学计算
存在舍入误差
运算比定点数复杂
例如很多十进制小数在二进制中不能精确表示,所以会出现类似:
0.1 + 0.2 不一定精确等于 0.3
这不是程序错了,而是浮点数二进制表示本身带来的近似误差。
七、定点数、浮点数和 32 位、64 位是不是同一个概念
不是同一个概念。
它们属于不同层次。
定点数和浮点数说的是:
数值在计算机中采用什么表示格式
也就是“怎么表示数”。
32 位、64 位可能有几种含义,要看语境。
第一种,指机器字长:
32 位机器
64 位机器
表示 CPU 一次能直接处理的数据位数通常是 32 位或 64 位。
第二种,指数据类型长度:
32 位 int
64 位 long
32 位 float
64 位 double
第三种,指地址宽度或指针宽度:
32 位地址空间
64 位地址空间
所以它们不是同一个概念,但会发生联系。
比如:
32 位 int 通常是 32 位定点整数
64 位 long 通常是 64 位定点整数
32 位 float 通常是单精度浮点数
64 位 double 通常是双精度浮点数
这里的“32 位”和“64 位”是指这个数据类型占多少二进制位。
而“定点”或“浮点”是指这些二进制位怎么解释。
同样是 32 位:
32 位 int:解释为定点整数
32 位 float:解释为浮点数
它们位数一样,但表示规则完全不同。
所以不能说:
32 位 = 定点数
64 位 = 浮点数
这是错误的。
正确理解是:
定点数 / 浮点数:表示格式
32 位 / 64 位:使用的二进制位数
机器字长:CPU 一次直接处理的数据宽度
八、一个很重要的对比
| 概念 | 关注点 | 举例 |
|---|---|---|
| 机器字长 | CPU 一次处理多少位 | 32 位 CPU、64 位 CPU |
| 定点数 | 小数点位置固定 | 整数、定点小数 |
| 浮点数 | 小数点位置可变 | float、double |
| 运算精度 | 数表示得多准、多大范围 | 32 位整数、64 位 double |
| 主频 | 每秒多少时钟周期 | 3 GHz |
| CPI | 平均每条指令多少周期 | CPI = 2 |
| IPS | 每秒执行多少条指令 | 109 指令/秒 |
| MIPS | 每秒百万条指令数 | 1000 MIPS |
九、考研里最容易错的地方
第一,主频高不一定速度快。程序执行时间取决于指令条数、CPI 和主频三者:
CPU 执行时间 = 指令条数 × CPI / 主频
第二,MIPS 不适合跨体系结构绝对比较性能。因为不同机器的一条指令工作量可能不同。
第三,机器字长不是存储容量,也不是地址总线宽度。机器字长主要指 CPU 一次能直接处理的数据位数。
第四,32 位和 64 位不是定点数、浮点数的分类。32 位、64 位说的是位数;定点、浮点说的是表示方法。
第五,64 位 CPU 不代表所有数据都是 64 位精度。具体精度还取决于程序使用的数据类型和硬件支持。
十、最后把主线串起来
CPU 性能这一块可以抓住一条线:
主频决定每秒有多少时钟周期;
CPI 决定平均一条指令要消耗多少周期;
IPS/MIPS 表示每秒能执行多少条指令;
程序总时间由指令条数、CPI、主频共同决定。
机器字长和数值表示这一块可以抓住另一条线:
机器字长表示 CPU 一次直接处理多少位数据;
位数越多,通常能表示更大的范围或更高的精度;
定点数是小数点位置固定的数;
浮点数是小数点位置可变的数;
32 位、64 位只是位数,不等于定点或浮点。
所以最推荐的记忆方式是:
性能公式看:指令条数、CPI、主频
数据表示看:机器字长、定点、浮点、位数
这两条线分清后,CPU 性能指标和机器字长、运算精度之间的关系就不会混在一起了。



