开篇词-为什么你需要学习计算机组成原理?
01-冯·诺依曼体系结构:计算机组成的金字塔
计算机的基本硬件组成
CPU、内存和主板。
-
CPU执行计算
-
内存(Memory)。程序都要加载到内存 里才能运行
-
主板是一个有着各种各样,有大量插槽的配件。
- 主板的芯片组(Chipset)和总线(Bus)解决了CPU和内存之间如何通信的问题。
- 芯片组控制了 数据传输的流转,也就是数据从哪里到哪里的问题。
- 总线则是实际数据传输的高速公路。因此,总线速度 (Bus Speed)决定了数据能传输得多快
-
电源 , I/O设备 ,显卡(Graphics Card) 显卡里有除了 CPU之外的另一个“处理器”,GPU一样可以做各 种“计算”的工作。
-
鼠标、键盘以及硬盘,这些都是插在主板上的。作为外部I/O设备,它们是通过主板上的南桥 (SouthBridge)芯片组,来控制和CPU之间的通信的。
-
“南桥”芯片,一方面,它通常在主板的“南面”。另一方面,它的作用就是作为“桥”,连接外部设备和CPU之间的通信。
-
以前的主板上通常也有“北桥”芯片,用来作为“桥”,连接 CPU和内存、显卡之间的通信。现在北桥被移入CPU内部
冯·诺依曼体系结构
- “计算机”抽象概念。这是怎么样一个“计算机”呢?
- 冯·诺依曼体系结构,存储程序计算机。特点:“可编程”计算机,“存储”计算 机。
首先是一个包含ALU和处理器寄存器的处 理器单元,用来完成各种算术和逻辑运算。
冯·诺依曼体系结构(Von Neumann architecture),算术逻辑单元(Arithmetic Logic Unit,ALU),处理器寄存器(Processor Register),处 理器单元(Processing Unit)
然后是一个包含指令寄存器(IR)和程序计数器(PC)的控制器单元 ,用来控制程序的流程,通常就是不同条件下的分支和跳转。
指令寄存器(Instruction Reigster),程序计数器(Program Counter),控制器单元 (Control Unit/CU)数据(Data)指令(Instruction)
接着是用来存储数据和指令的内存。以及更大容量的外部存储。 最后就是各种输入和输出设备,以及对应的输入和输出机制。
总结延伸
- 具体来说,学习组成原理,其实就是学习控制器、运算器的工作原理,也就是CPU是怎么工作的,以及为何 这样设计;
- 学习内存的工作原理,从最基本的电路,到上层抽象给到CPU乃至应用程序的接口是怎样的;
- 学 习CPU是怎么和输入设备、输出设备打交道的。
学习组成原理,就是在理解从控制器、运算器、存储器、输入设备以及输出设备,从电路这样的硬件,到最 终开放给软件的接口,是怎么运作的,为什么要设计成这样,以及在软件开发层面怎么尽可能用好它。
02-给你一张知识地图,计算机组成原理应该这么学
整个计算机组成原理,就是围绕着计算机是如何组织运作展开的。
-
首先,我们来看计算机的基本组成。
- 学习计算机是由哪些硬件组成的。以及这些硬件是怎么对应到经典的冯·诺依曼体系结构 中的
- 运算器、控制器、存储器、i/o
- 了解计算机的两个核心指标,性能和功耗。
-
接下来你需要掌握计算机的指令和计算。
- 在计算机指令部分 .程序是怎么通过编译器和汇编器,变成机器指令,还需要知道我们的操作系统是怎么链接、装载、执行这些程序的。控制器来控制的指令执行的控制过程
- 实现这些运算功能的ALU(Arithmetic Logic Unit/ALU),也就是算术逻辑单元
-
可以深入到CPU的设计中
-
CPU时钟可以用来构造寄存器和内存的锁存器和触发器
因此,CPU时钟应该是我们学习CPU的前导知识。
-
数据通路,其实就是连接了整个运算器和控制器,并最终组成了CPU。
出于对于性能和功耗的考虑,你要 进一步理解和掌握面向流水线设计的CPU、数据和控制冒险,以及分支预测的相关技术。
-
道异常和中断发生的机制
-
讲指令的并行执行,看看如何直接在CPU层面,通过SIMD来支持并行计算。
-
-
了解存储器的原理。需要掌握从上到下的CPU高速缓存、内存、SSD硬盘和机械硬盘的工作原理,它们之间的性能差 异。
学习计算机组成原理,究竟有没有好办法?
- 首先,学会提问自己来串联知识点。学完一个知识点之后,你可以从下面两个方面,问一下自己。
- 我写的程序,是怎样从输入的代码,变成运行的程序,并得到最终结果的? 整个过程中,计算器层面到底经历了哪些步骤,有哪些地方是可以优化的?
- 其次,写一些示例程序来验证知识点。计算机组成中的大量原理和设计,都 对应着“性能”这个词。
- 通过和计算机硬件发展的历史做对照
03-通过你的CPU主频,我们来谈谈“性能”究竟是什么?
我们能不能给性能下一个明确的定义,然后来 进行准确的比较呢?
什么是性能?时间的倒数
-
第一个是响应时间或者叫执行时间。
-
第二个是吞吐率或者带宽
一般把性能,定义成响应时间的倒数: 性能 = 1/响应时间
响应时间(Response time)执行时间(Execution time)。吞吐率(Throughput)带宽(Bandwidth)
计算机的计时单位:CPU时钟
- 问题:记录程序经历的时间差不“准”。包含程序被调度的时间
- 要记录程序实际在cpu上运行的时间
- 问题:直接根据时间“比较”出两个程序的性能差异可以吗?
- 答案:不行。CPU的时刻功率不同导致主频不同,以及cpu执行速度可能受其他相关硬件的影响。比如内存,总线
- 解决:我们需要转化为只跟cpu相关的标准
- 程序的CPU执行时间=CPU时钟周期数×时钟周期时间
- 更进一步: 对于CPU时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称CPI)”。
- 更进一步: CPU时钟周期数=指令数×每条指令的平均时钟周期数
- 程序的CPU执行时间=指令数×CPI×时钟周期时间
CPU时钟周期数(CPU Cycles),时钟周期时间 (Clock Cycle),每条指令的平均时钟周期数(Cycles Per Instruction,简称CPI)
在CPU内部,有一个叫晶体振荡器(Oscillator Crystal)的东西,晶振带来的每一次“滴答”,就是时钟周期时间。
解决性能问题,要优化这三者。
-
时钟周期时间,就是计算机主频,这个取决于计算机硬件。
主频不了过高。过高会导致功耗以及散热问题
-
每条指令的平均时钟周期数CPI,就是一条指令到底需要多少CPU Cycle。
现代的CPU通过流水线技术(Pipeline),让一条指令需要的CPU Cycle尽可能地少。
-
指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。
04-穿越功耗墙,我们该从哪些方面提升“性能”?
功耗:CPU的“人体极限”
奔腾4的主频为什么没能超过3.8GHz的障碍呢?答案就是功耗问题。
-
cpu 想要计算得快
- 增加晶体管的总量(密度or面积)
- 增加频率
-
CPU的功率: 功耗 ~= 1/2 ×负载电容×电压^2×开关频率×晶体管数量
功耗增加太多,就会导致CPU散热跟不上,这时,我们就需要降低电压。这里有一点非常关键,在整 个功耗的公式里面,功耗和电压的平方是成正比的。
并行优化,理解阿姆达尔定律
从奔腾4开始,Intel意识到通过提升主频比较“难”去实现性能提升,开始推出多 核CPU,通过提升“吞吐率”而不是“响应时间”,来达到目的。
通过并行提高性能。
条件。
- 第一,需要进行的计算可以分解成几个可以并行的任务。
- 第二,需要能够分解好问题,并确保几个人的结果能够汇总到一起。
- 第三,在“汇总”这个阶段,还是得顺序执行
阿姆达尔定律(Amdahl’s Law):对于一个程序进行优化之后,处理器并行运算之后效率提升的情况。具体可以用这样一个公式 来表示: 优化后的执行时间 = 受优化影响的执行时间/加速倍数+不受影响的执行时间
总结延伸
通过提升主频,还是增加更多的CPU核心数量,通过并行来提升性能,都会遇到相应的瓶颈。
还有这样几个原则性的性能提升方法。
-
1.加速大概率事件。
特殊的向量和矩阵计算使用GPU运算。cache的运用
-
2.通过流水线提高性能。 cpu指令执行的过程进行拆分,细化运行,现代CPU多核提升吞吐量。
指令进行拆分之后可以让各个部分同时忙碌。类似单道批处理系统升级到多道批处理系统
-
3.通过预测提高性能。
“分支和冒险”、“局部性原理”这些CPU和存储系统设计方法