机器字长与运算精度,定点数、浮点数和 32 位、64 位
本文最后更新于5 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

一、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 性能指标和机器字长、运算精度之间的关系就不会混在一起了。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇