计算机组成原理简单
基础篇
由计算机的基本硬件组成
首先,广泛。组成原理中有很多概念,每个概念的信息量也很大。例如,如果你想理解 CPU 中的算术逻辑单元(即 ALU)是怎么实现加法的,需要牵涉到如何把整数表示成二进制,还需要了解这些表示背后的电路、逻辑门、CPU 时钟、触发器等知识。
第二,深度。组成原理中的许多概念是计算机学科的另一门核心课程。例如,计算机指令是如何从你写的 C、Java 这种高级语言已经成为计算机可以执行的机器代码吗?如果我们展开并深入解释这个问题,它将成为编译原理的核心课程。
第三,学习不能应用。学习是用来使用的,但由于课程本身的属性,许多人经常沉迷于概念和理论,不能与他们的日常发展工作联系起来,以解决工作中遇到的问题,所以,学习往往没有成就感,很难有动力坚持。
早年,要自己组装一台计算机,首先要有三件,CPU、内存和主板。
在这三个部分中,我们首先要说的是 CPU,它是计算机最重要的核心配件。你必须知道全名。它被称为中央处理器(Central Processing Unit)。为什么说 CPU 是最重要的因为计算机的所有计算都是由 计算的CPU 来做的。CPU 也是整台电脑中最昂贵的部分之一。
第二个重要的配件,就是内存(Memory)。您编写的程序、打开的浏览器和操作游戏必须加载到内存中才能操作。程序读取的数据和计算结果也应放入内存中。内存越大,可以加载的东西就越多。
存储在内存中的程序和数据需要 CPU 读取,CPU 计算后,将数据写回内存。CPU 不能直接插入内存,反之亦然。因此,它带来了最后一个大块——主板(Motherboard)。
主板是一种配件,有时有几十甚至几百个插槽。我们的 CPU 插在主板上,内存也插在主板上。。芯片组控制数据传输的流通,即数据从哪里到哪里。总线是实际数据传输的高速公路。因此,总线速度(Bus Speed)它决定了数据能传输多快。
有了三大件,只要配上电源供电,计算机差不多就可以跑起来了。但是现在还缺少各类输入(Input)/ 输出(Output)设备,也就是我们常说的 I/O 设备。如果你使用自己的个人电脑,显示器是必不可少的。只有有了显示器,我们才能看到计算机输出的各种图像和文本,这就是所谓的输出设备。
同样,鼠标和键盘也是必不可少的配件。这样,我就可以输入文本并写下这篇文章。它们被称为输入设备。
另一种非常特殊的设备是显卡(Graphics Card)。现在,使用图形界面操作系统的计算机,无论是 Windows、Mac OS 还是 Linux,图形卡是必不可少的。有些人可能会说,当我安装电脑时,我没有买图形卡,电脑可以正常运行啊!这是因为主板现在有了一个内置的图形卡。如果你用电脑玩游戏,做图形渲染或运行深度学习应用程序,你主要需要买一个单独的图形卡,插入主板。图形卡殊的,因为图形卡除了 CPU另一外的另一个处理器,即 GPU(Graphics Processing Unit,图形处理器),GPU 也可以做各种计算工作。
鼠标、键盘和硬盘都插在主板上。作为外部 I/O 设备通过主板上的南桥(SouthBridge)控制和 芯片组CPU 之间的通信。南桥芯片的名称非常直观。一方面,它在主板上的位置通常在主板的南面。另一方面,它的功能是连接鼠标、键盘和硬盘等外部设备CPU 之间的通信。
有了南桥,自然对应着也有“北桥”。是的,以前的主板上通常也有“北桥”芯片,用来作为“桥”,连接 CPU 与内存和显卡之间的通信。然而,随着时间的推移,主板上北桥芯片的工作已经转移到 CPU 内部,所以你在主板上看不到北桥芯片。
手机里只有 SD 卡(Secure Digital Memory Card)这种类似硬盘功能的存储卡插槽没有内存插槽,CPU 插槽。是的,由于手机的大小,手机制造商选择了 CPU、内存、网络通信甚至相机芯片都包装在芯片上,然后嵌入到手机主板上。这种方法叫 SoC,也就是 System on a Chip(系统芯片)。
所有的计算机程序也可以抽象地从输入设备中读取输入信息,通过计算器和控制器执行存储在存储器中的程序,最终将结果输出到输出设备中。我们写的所有程序,无论是先进的还是低级的语言,都是基于这样一个抽象的框架。
- 图灵机是一种思想模型(计算机的基本理论基础),是一个贫穷、结构性的问题。图灵认为,所有可以用算法解决的问题都可以用图灵机解决;
- 冯诺依曼提出了存储程序的计算机设计理念,并参考图灵模型设计了历史上第一台电子计算机,即冯诺依曼机。
CPU
事实上,计算机的性能与我们的体力劳动非常相似,就像我们必须搬东西一样。我们需要有一个衡量计算机性能的标准。本标准主要有两个指标。
第一个是响应时间(Response time)或执行时间(Execution time)。想要提高响应时间的性能指标,可以理解为让计算机跑得更快。
二是吞吐率(Throughput)或者带宽(Bandwidth),想要提高这个指标,可以理解为让计算机移动更多。
在过去的几年里,流行的手机运行点软件是在手机上运行多个预设程序,然后根据运行所需的时间计算一个分数来评估手机的性能。在行业中,主要的 CPU 和服务器制造商组织了一个叫 SPEC(Standard Performance Evaluation Corporation)第三方机构专门用于指定各种跑分规则。
SPEC 提供的 CPU 基准测试程序就像 CPU 通过几十个不同的计算程序,对 届的高考进行了处理CPU 性能给出最终评分。这些程序丰富多彩,包括编译器、解释器、视频压缩、人工智能国际象棋等,涵盖了应用场景的各个方面。如果您感兴趣,请单击此链接。
其次,。即使在同一台计算机上,CPU 可能是满载运行或降频运行,降频运行自然需要更多的时间。
除了 CPU 此外,时间的性能指标还会受到其他相关硬件的影响,如主板和内存。因此,我们需要拆解我们能感知到的时间指标,并对程序进行 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。
让我们先了解什么是时钟周期时间。当你买电脑时,你必须注意 CPU 主频。例如,我手头的电脑是 Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为,。
如果你想更准确地描述这个 2.8GHz 代表我们 CPU 的钟表可以识别最小的时间间隔。就像我们挂在墙上的挂钟一样,它们都是滴答滴答一秒一秒地走,所以墙上挂钟能识别的最小时间单位是秒。
而在 CPU 内部类似于我们通常戴的电子石英表,有一个晶体振荡器(Oscillator Crystal)的东西,简称晶振。我们把晶振当作 。CPU 内部的电子表来使用。。
对于 CPU 时钟周期数,我们可以做另一个分解,把它变成指令数×每个指令的平均时钟周期(Cycles Per Instruction,简称 CPI)。不同的指令需要 Cycles 不同,,,自然慢。这样拆分后,我们的程序 CPU 执行时间可以成为这三个部分的乘积。
**程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time **
- Clock Cycle Time 晶振时间,时钟周期
- CPI,每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI),加法和乘法都对应着一条 CPU 指令,乘法需要的 Cycles 就比加法要多
因此,如果我们想要解决性能问题,其实就是要优化这三者。
- 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的 80386 主频只有 33MHz,现在手头的笔记本电脑就有 2.8GHz,在主频层面,就提升了将近 100 倍。
- 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。在后面讲解 CPU 结构的时候,我们会看到,现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。因此,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
- 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。
于是,从 1978 年 Intel 发布的 8086 CPU 开始,计算机的主频从 5MHz 开始,不断提升。1980 年代中期的 80386 能够跑到 40MHz,1989 年的 486 能够跑到 100MHz,直到 2000 年的奔腾 4 处理器,主频已经到达了 1.4GHz。而消费者也在这 20 年里养成了“看主频”买电脑的习惯。当时已经基本垄断了桌面 CPU 市场的 Intel 更是夸下了海口,表示,颇有一点“大力出奇迹”的意思。
然而,计算机科学界从来不相信“大力出奇迹”。奔腾 4 的 CPU 主频从来没有达到过 10GHz,最终它的主频上限定格在 3.8GHz。这还不是最糟的,更糟糕的事情是,大家发现,奔腾 4 的主频虽然高,但是它的实际性能却配不上同样的主频。想要用在笔记本上的奔腾 4 2.4GHz 处理器,其性能只和基于奔腾 3 架构的奔腾 M 1.6GHz 处理器差不多。
一个 3.8GHz 的奔腾 4 处理器,满载功率是 130 瓦。这个 130 瓦是什么概念呢?机场允许带上飞机的充电宝的容量上限是 100 瓦时。如果我们把这个 CPU 安在手机里面,不考虑屏幕内存之类的耗电,这个 CPU 满载运行 45 分钟,充电宝里面就没电了。而 iPhone X 使用 ARM 架构的 CPU,功率则只有 4.5 瓦左右。
我们的 CPU,一般都被叫作超大规模集成电路(Very-Large-Scale Integration,VLSI)。这些电路,实际上都是一个个晶体管组合而成的。CPU 在计算,其实就是让晶体管里面的“开关”不断地去“打开”和“关闭”,来组合完成各种运算和功能。
想要计算得快,一方面,我们要在 CPU 里,同样的面积里面,多放一些晶体管,;另一方面,我们要让晶体管“打开”和“关闭”得更快一点,。而这两者,都会增加功耗,带来耗电和散热的问题。
我们会在 CPU 上面抹硅脂、装风扇,乃至用上水冷或者其他更好的散热设备,就好像在工厂里面装风扇、空调,发冷饮一样。但是同样的空间下,装上风扇空调能够带来的散热效果也是有极限的。
因此,在 CPU 里面,能够放下的晶体管数量和晶体管的“开关”频率也都是有限的。一个 CPU 的功率,可以用这样一个公式来表示:
- 增加晶体管可以增加硬件能够支持的指令数量,增加数字通路的位数,以及利用好电路天然的并行性,从硬件层面更快地实现特定的指令,所以增加晶体管也是常见的提升cpu性能的一种手段。
- 电压的问题在于两个,一个是电压太低就会导致电路无法联通,因为不管用什么作为电路材料,都是有电阻的,所以没有办法无限制降低电压,另外一个是对于工艺的要求也变高了,成本也更贵啊。
那么,为了要提升性能,我们需要不断地增加晶体管数量。同样的面积下,。这个就是平时我们所说的提升“制程”。从 28nm 到 7nm,相当于晶体管本身变成了原来的 1/4 大小。这个就相当于我们在工厂里,同样的活儿,我们要找瘦小一点的工人,这样一个工厂里面就可以多一些人。我们还要提升主频,让开关的频率变快,也就是要找手脚更快的工人。
但是,功耗增加太多,就会导致 CPU 散热跟不上,这时,我们就需要降低电压。这里有一点非常关键,在整个功耗的公式里面,功耗和电压的平方是成正比的。这意味着电压下降到原来的 1/5,整个的功耗会变成原来的 1/25。
事实上,从 5MHz 主频的 8086 到 5GHz 主频的 Intel i9,CPU 的电压已经从 5V 左右下降到了 1V 左右。这也是为什么我们 CPU 的主频提升了 1000 倍,但是功耗只增长了 40 倍。比如说,我写这篇文章用的是 Surface Go,在这样的轻薄笔记本上,微软就是选择了把电压下降到 0.25V 的低电压 CPU,使得笔记本能有更长的续航时间。
这就引出了我们在进行性能优化中,常常用到的一个经验定律,。这个定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率提升的情况。具体可以用这样一个公式来表示:
在“摩尔定律”和“并行计算”之外,在整个计算机组成层面,还有这样几个原则性的性能提升方法。
- 加速大概率事件。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算,于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。本来一个 CPU 需要跑几小时甚至几天的程序,GPU 只需要几分钟就好了。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。后面的文章,我也会为你讲解 GPU 和 TPU 的基本构造和原理。
- 通过流水�