Introduction to the Microprocessor and Computer¶
Outline:
- Overview of Intel microprocessors
- Discussion of history of computers
- Function of the microprocessor
- Computer data formats
- Terms and jargon
Historical Background¶
- 第一台通用的、可编程的电子计算机是 1946 年由美国宾夕法尼亚大学的约翰·普雷斯班设计的 ENIAC(Electronic Numerical Integrator and Computer)。可编程相比重新设计硬件更加灵活。
- 冯·诺依曼(John von Neumann)在 1945 年提出了一种新的计算机结构,这种结构被称为冯·诺依曼结构。这种结构的特点是程序和数据存储在同一块存储器中,程序可以被当作数据来处理。
- 起初的编程是用机器码实现的,由一系列的 0 和 1 组成。
- 1950 年代 UNIVAC 等系统出现,这些系统使用汇编语言编程,汇编语言是一种符号化的机器码。
- 1957 年 Grace Hopper 发明了第一个高级语言,称为 FLOWMATIC。同年 IBM 发明了 FORTRAN 语言。Grace Hopper 也是 COBOL 语言的发明者之一,她也发现了世界上第一个 bug(1947),是一只卡在计算机中的飞蛾。
进入微机时代:
- 1971 年,Intel 公司推出了 4004 微处理器,这是第一款集成电路微处理器。4004 是一款 4 位的、能寻址 4096 个字节的存储器,其指令集包含 45 条指令。其速度比 ENIAC 还是慢,但是其重量小于 1 盎司。
- 1978 年,Intel 推出了 8086 微处理器,使用了 IA-32 架构,含有 16 位的寄存器和 16 位的 data bus,内存管理使用了分段的技术。
- 1982 年,Intel 发布 80286 微处理器,引入了 protected mode。
- 1985 年,Intel 发布 80386 微处理器,是 IA-32 架构的第一款 32 位处理器,寄存器为 32 位,且低 16 位保持前几代的寄存器功能,维持了向后兼容性。同时其提供了虚拟 8086 模式,且支持了内存的分页,page size 为 4KB。
- 1989 年,Intel 发布 80486 微处理器,提供了内置的浮点运算单元 x87,提供了 8KB 的一级缓存。
- 1993 年,Intel 发布 Pentium 微处理器,引入了第二条执行流水线,实现了超标量的设计,同时引入了分支预测技术。
- 1995-1999 年,相继发布了 Pentium Pro、Pentium II、Pentium III 微处理器。
- 2000-2006 年,发布 Pentium 4 系列处理器。
Some Technical Terms¶
- RISC:从 Pentium Pro 开始,Intel 在 CISC 指令集下实现的是 RISC 设计,即将 CISC 指令集转换为 RISC 指令集再执行,但同时能够兼容 CISC 指令集。
- 乱序执行:超标量设计带来了 ILP(Instruction Level Parallelism),但是由于数据相关性,指令之间的执行顺序可能会受到影响,因此需要乱序执行技术来解决这个问题。
乱序执行的例子
Text Only | |
---|---|
1 2 3 4 5 6 |
|
假设这里的 look ahead window = 4,运用三条流水线。如果是顺序执行,因为数据依赖关系,其执行情况如下图:
如果使用乱序执行,维护一个数据流图:
按照数据流图可以来优化执行顺序:
- SIMD:单指令多数据流,即一条指令可以同时处理多个数据,例如 MMX、SSE、AVX 等。
- Hyper-Threading:一种多线程技术,可以让一个物理核心模拟出多个逻辑核心,提高了 CPU 的利用率。
Intel 64 Architecture
软件寻址 64 位,物理地址寻址最多 52 位。这种技术也被称为 IA-32e 模式,包含 64-bit 模式和兼容模式。
Number Systems¶
这一部分比较基础,略过。
Computer Data Formats¶
包含 ACSCII、Unicode、BCD、有符号和无符号整数、浮点数等等。
- ACSCII:American Standard Code for Information Interchange,标准的 ASCII 是一种 7 位的编码方式,包含 128 个字符。
- 其中,第 8 位(MSB)用来做校验位。在打印机中,这一位的 0 代表 alphanumeric,1 代表 graphics。
- Extended ASCII:使用 8 位来表示字符(最高位为 1),包含 256 个字符,存储了一些外国字符、注音、希腊字母、制表符等。
- Unicode:大多数基于 Windows 的应用使用 Unicode,每个字符使用 16 位来表示。
- 0000H-00FFH 和标准 ASCII 一样,00FFH-FFFFH 用来表示其他字符。
- BCD:Binary Coded Decimal,用 4 位二进制数来表示一个十进制数,包含 0-9 的数字。
Packed & Unpacked BCD
- Packed BCD:两个 BCD 数字存储在一个字节中,每个数字占 4 位,用于微处理器中的 BCD 加法减法。
- Unpacked BCD:每个 BCD 数字占 1 字节,即 8 位,一般是键盘输入的数据。
例如,12
的 Packed BCD 表示为 0001 0010
,Unpacked BCD 表示为 0000 0001 0000 0010
。
复杂的计算情况下一般不用 BCD 码。
- Byte-sized Data:字节大小的数据,一般用来存储字符、整数等。
- Word-sized Data:字大小(16 位)的数据,一般用来存储地址、整数等。在 x86 架构中,数据以小端序存储。
大小端问题
需要注意的是,x86 中数据是小端存储,但是字符串、指令等是大端存储。
- Double Word-sized Data:双字大小(32 位)的数据,也就是所谓的 DWORD。
- Real Numbers:实数,也就是浮点数。IEEE 754 标准定义了浮点数的表示方法。
这里需要注意一些别名符号,MASM 是一个 x86 汇编器,其定义了一些别名符号:
The IEEE 754 Format¶
由 William Morton Kahan 等人于 1985 年提出,定义了浮点数的表示方法。Kahan 也获得了 1989 年的 ACM 图灵奖,被誉为“浮点数之父”。
Format¶
该标准将浮点数表示为:
\[
(-1)^{\text{sign bit}} \times (1+\text{fraction}) \times 2^{\text{exponent-bias}}
\]
对于单精度浮点数,其格式为:
Text Only | |
---|---|
1 |
|
对于双精度浮点数,其格式为:
Text Only | |
---|---|
1 |
|
Why not 2's Complement?¶
- 没有无符号浮点数,用 2's Complement 没有任何的额外好处。
- 补码的负数比正数多一个,导致不对称。
- 科学计算的时候实际上是区分 +0 和 -0 的,而 2's Complement 无法区分。
- 等等等等。
Special Values¶
Exponent 部分为全 0 或全 1 时,表示特殊值:
- 0:Exponent 全 0,Fraction 全 0,表示 +0 或 -0,看 Sign 位。
- 无穷大:Exponent 全 1,Fraction 全 0,看 Sign 位决定正负。
- NaN:Exponent 全 1,Fraction 非 0,表示 Not a Number。
Subnormal Numbers¶
- Normal Numbers:Exponent 不全 0 也不全 1。
- Subnormal Numbers:Exponent 全 0,Fraction 非 0。这个数很小,小到超过了 IEEE 754 的精度范围,因此需要特殊处理。这个时候的数字表示有一些差异:
\[
(-1)^{\text{sign bit}} \times (0+\text{fraction}) \times 2^{1-\text{exponent-bias}}
\]
- Subnormal Numbers 可能会引发性能的剧烈下降。
Rounding¶
- TiesToEven:靠近偶数的时候向偶数靠拢。(默认)
- TiesAwayfromZero
- TiesToZero
- TiesTowards +∞
- TiesTowards -∞
Addition¶
对阶、相加、舍入。
对阶操作的存在会导致大数吃小数的问题,因此需要进行舍入操作。
一些公式可以进行重写,会有性能和精度的变化。例如 Herbie 等工具可以自动优化这些公式。
重写浮点表达式的例子
\[
\sqrt{x+1} - \sqrt{x} = \frac{1}{\sqrt{x+1} + \sqrt{x}}
\]
精度从 70.6% 提升到 99.5%,性能从 1.0x 下降到 0.7x。
New Floating-point Format for AI¶
为了便于 AI 计算,一些新的浮点数格式被提出,例如 Bfloat16、TF32、FP16 等。