计算机组成原理
1,计算机三大件:
1)CPU(Central Processing Unit),所有计算在CPU中完成。
2)内存,编写的程序,打开的浏览器,运行的游戏都要加载到内存里才能运行,程序读取的数据、计算的结果,也都要放在内存里,内存越大,加载的东西也就越多。存放在内存里的程序和数据需要被CPU读取,CPU计算完之后再把数据写回到内存,但CPU不能直接插到内存上,反之亦然,于是带来另一大件—主板。
3)CPU和内存都插在主板上,主板的芯片组和总线解决了CPU和内存之间如何通信的问题。芯片组控制数据传输的流转,总线决定数据传输的速度。
2,冯·诺依曼体系结构,即存储程序计算机,可编程和可存储的计算机。
1)包含算术逻辑单元和处理寄存器的处理器单元,用来完成各种算术和逻辑运算,能够完成各种数据的处理和计算工作,也可叫数据通路或运算器。
2)以及指令寄存器和程序计数器的控制器单元,用来控制程序的流程,通常是不同条件下的分支和跳转。
3)存储数据和指令的内存,以及更大容量的外部存储。
4)最后就是输入输出设备。
3,在现在的计算机里,算术逻辑单元和控制器单元共同组成了CPU。
4,所有的计算机程序,都可以抽象为从输入设备读取输入信息,通过运算器和控制器来执行在存储器里的程序,最终把结果输出到输出设备中。
计算机的计时单位:CPU时针
1,计算机的性能衡量有两个指标,一是响应时间,二是吞吐率。提升吞吐率可以多加机器多堆硬件,但性能提升不那么容易。用响应时间衡量性能时存在两个问题:
1)时间不准,计算机可能同时运行多个程序,CPU实际上在各个程序之间来回切换,有些程序运行时还需要从网络、硬盘读取数据到内存和CPU,要准确统计程序的运行时间,需要去掉这些时间。Linux下有个time命令,返回三个值,一个real time,即运行程序整个过程流逝掉的时间Wall Clock Time,一个user time即CPU运行程序在用户态运行指令的时间,一个是sys time即CPU运行程序在操作系统内核里运行指令的时间,程序实际花费的CPU执行时间就是user time加上sys time。
2)即使知道CPU运行时间并不一定可以比较出两个程序的性能差异。除了CPU外,时间性能指标还受到主板、内存等相关硬件的影响。
2,将时间指标拆解,程序CPU执行时间变成CPU时钟周期数(CPU Cycles)和时钟周期时间(Clock Cycle)的乘积。程序的CPU执行时间=CPU时钟周期数*时钟周期时间。
3,最简单的提升性能的方案是缩短时钟周期时间(1/CPU主频),即提升CPU主频。
1)CPU主频固定的情况下,减少程序需要的CPU时钟周期数。
2)CPU时钟周期数可再次分解为指令数*每条指令的平均时钟周期数(Cycle Per Instruction,CPI),不同的指令需要的Cycles不同,加法和乘法都对应一条CPU指令,但乘法需要的Cycles比加法多。拆解后程序的CPU执行时间=指令数*CPI*Clock Cycle Time。
4,现代的CPU通过流水线技术(Pipeline)让一条指令需要的CPU Cycle尽可能的少,编绎器将代码编绎成计算机指令时有不同的表示方式。
5,CPU一般被叫做超大规模集成电路,这些电路实际上都是一个个晶体管组合而成,CPU计算其实就是让晶体管里面的开关不断地去打开和关闭,来组合完成各种运算和性能。想要计算的快,一方面在CPU同样的面积里多放晶体管增加密度,另一方面让晶体管打开和关闭的更快一点即提升主频,而这两者都会增加功耗,带来耗电和散热的问题。
1)提升CPU主频带来功耗的问题,功耗~=1/2 *负载电容*电压的平方*开关频率*晶体管数量。
2)同样的面积下增加晶体管,则需要晶体管造得小一点,也就是提升制程。功耗与电压的平方成正比,降低电压能有效地降低功耗。
6,提升主频较难的情况下可通过提升吞吐率通过多核CPU并行提高性能。
1)并行提升性能需要将问题分解成并行的任务,再汇总分解的任务,汇总阶段不可以并行须顺序执行。
2)性能优化中一个经验定律阿姆达尔定律,对一个程序进行优化后,处理器并行运算之后效率提升的情况可以公式表示:优化后的时间=受优化影响的执行时间/加速倍速 + 不受影响的执行时间。
7,在整个计算机组成层面,有几个原则性的性能提升方法:
1)加速大概率事件,在过去几年流行的深度学习,整个计算过程中,99%都是向量和矩阵计算,可通过GPU替代CPU大幅度提升深度学习的模型训练过程。
2)通过流水线提高性能,CPU指令执行过程拆分,细化运行。
3)通过预测提高性能,预先猜测下一步提前进行运算,典型例子是循环访问数组,后续的分支和冒险、局部性原理等CPU和存储系统设计方法,就是利用预测提前进行相应操作,来提升程序性能。