前言:关于写此系列博客,仅仅只是为了记录一下我的计算机组成原理的学习进度以及便于复习,若有读者发现有不正确的地方请多多包涵并及时告诉我,谢谢。
所参考的资料为《计算机组成与系统结构》_第2版_袁春风。
(几乎为搬运,就是学习,但是本片几乎都是复习时手打,可能会有很多错别字)
全篇为博主的学习记录,若有转载请注明来源链接:
https://blog.csdn.net/wxy2635618879/article/details/104283786
第一台通用电子计算机ENIAC的诞生是计算机技术的进步和划代的只要标志。
”存储程序”方式的基本思想是:必须将事先编好的程序和原始数据送入主存后才能执行程序,一旦程序被启动执行,计算机能在不需要操作人员的干预下自动完成逐条取出指令并执行的任务。
硬件技术已经经历了4个发展阶段,但是绝大部分计算机的基本组成仍然机有冯·诺依曼结构计算机的特征。
冯·诺依曼结构计算机的基本思想主要包括:
上述图片就是一个经典的计算机系统的硬件组成。
计算机硬件主要包括:中央处理器、存储器、I/O控制器、外部设备和各类总线。
根据软件的用途,一般将软件分为系统软件和应用软件两大类。
如图是计算机系统层次转换示意图,描述了从最终用户希望计算机完成的应用(问题)到电子工程师使用器件完成基本电路设计的整个转换过程。
转换过程从上到下
以上都是软件层次的转化,而计算机硬件和软件之间需要有一个桥梁,这个桥梁就是指令集体系结构(ISA),简称体系结构或系统结构。
**ISA **规定的内容包括:数据类型及格式,指令格式,寻址方式和可访问地址空间大小,程序可访问的寄存器个数、位数和编号,控制寄存器的定义,I/O 空间的编址方式,中断结构,机器工作状态的定义和切换,输入/输出结构和数据传送方式,存储保护方式等。因此,可以看出,指令集体系结构是指软件能感知到的部分,也称软件可见部分。
机器语言程序就是一个 ISA 规定的指令的序列。
按照在计算机上完成任务的不同,可以把使用计算机的用户分为以下4类:最终用户、系统管理员、应用程序员和系统程序员。
不同计算机用户工作所在的系统结构层如下图。
ISA 处于硬件和软件的交界面上,硬件所有的功能都由 ISA 集中体现,软件通 过 ISA 在计算机上执行。所以,ISA 是整个计算机系统中的核心部分。
ISA 层下面是硬件部分,上面是软件部分。
(1)预处理阶段;(2)编译阶段;(3)汇编阶段;(4)链接阶段;
例如下图
如冯诺依曼结构模型机
在此模型机中,CPU包含ALU、通用寄存器组(GPRs)、标志寄存器、控制器、指令寄存器(Instruction Register,IR)、程序计数器(Program Counter,PC)、存储器地址寄存器(Memory Address Register,MAR)和存储器数据寄存器(Memory Data Register,MDR)。
各个器件的作用如下:
启动程序执行,CPU按照一下步骤自动取出程序中的一条一条指令执行:
考量计算机系统性能的俩个基本指标是:吞吐率、响应时间。
不同场合下所关心的计算机的性能不同。有的关心吞吐率,如电影院要求单位时间内传输的数据量要大;有的关心执行时间,如银行要求处理的速度快等。
操作系统在对处理器调度的时候,往往会让多个程序(或者说进程)轮流使用处理器,所以某个用户程序执行的过程中,可能还会有其他的用户程序和系统程序在执行,因此,用户感觉的某个程序的执行时间并不是真的执行时间。
通常把用户感觉的执行时间分为俩部分:CPU时间和其他时间。
CPU时间又分为俩部分:
(1)用户CPU时间,指真正用于运行用户程序的时间。
(2)系统CPU时间,指为了执行用户程序而需要CPU运行操作系统的时间。
其他时间指等待I/O操作完成的时间或CPU用于其他用户程序的时间。
计算机系统的性能评价主要考虑的是CPU性能。而CPU性能指的是用户CPU时间,它只包含CPU运行用户程序代码的时间。
CPU性能计算的几个重要指标:
那么计算用户程序的CPU时间的公式为:
CPU执行时间 = 程序所含时钟周期数 / 时钟频率 = 程序所含时钟周期数 * 时钟周期
对于不同的情况程序所含时钟周期数的计算方法不一样:
如果已知程序的总指令条数和综合CPI,那么
程序总时钟周期数 = 程序所含指令条数 * CPI
如果已知程序中共有n种不同类型的指令,第 i 种指令的条数和CPI*分别为Ci 和 CPIi,那么
程序总时钟周期数 = ∑ C P I i ∗ C i \sum {CPIi * Ci} ∑CPIi∗Ci
那么CPU执行时间 = 程序所含指令条数 * CPI * 时钟周期 = ∑ C P I i ∗ C i \sum {CPIi * Ci} ∑CPIi∗Ci * 时钟周期 。
例1.1假设某个频繁使用的程序 P 在机器 M1 上运行需要 10s,M1 的时钟频率为 2GHz。设计人员想开发一台与 M1 具有相同 ISA 的新机器 M2。采用新技术可使 M2 的时钟频率增加,但同时也会使 CPI增加。假定程序 P 在 M2 上的时钟周期数是在 M1 上的 1.5 倍,则 M2 的时钟频率至少达到多少才能使程序 P 在 M2 上的运行时间缩短为 6s?
**解:**程序P在M1上的时钟周期数为:CPU执行时间 X 时钟频率 = 10s X 2GHz = 2 X 1 0 10 10^{10} 1010。所以P 在机器 M2 上的时钟周期数为 1.5×2× 1 0 10 10^{10} 1010 = 3× 1 0 10 10^{10} 1010。要使程序 P 在 M2 上运行时间缩短到 6s, 则 M2 的时钟频率至少应为程序所含时钟周期数÷ CPU 执行时间= 30× 1 0 10 10^{10} 1010 / 6s = 5GHz。
例1.2 假设计算机 M 的指令集中包含 A、B、C 三类指令,其 CPI 分别为 1、2、4。某个程序 P 在 M 上被编译成两个不同的目标代码序列 P1 和 P2,P1 所含 A、B、C 三类指令的条数分别为 8、2、2,P2 所含 A、B、C 三类指令的条数分别为 2、5、3。请问:哪个代码序列指令条数少?哪个执行速度快?它们的 CPI 分别是多少?
解: P1指令数为12, P2指令数为10。
P1时钟周期数数为8x1 + 2x2 + 2x4 = 20。
P2的时钟周期数为2x1 + 5x2 + 3x4 = 24。
所以P1比P2快。
CPI = 总时钟周期数 ÷ 程序所含指令。
故P1 的 CPI = 20 ÷ 12 = 1.67; P2 的 CPI = 24 ÷ 10 = 2.4。
指令速度所用的计量单位时MIPS,其含义是平均每秒执行多少百万条指令。
设某指令 i 在程序种所占的比例为 wi, 执行时间为 ti, 那么等效指令的执行时间为:T = ∑ i = 1 n w i × t i \sum_{i=1}^n{wi × ti} ∑i=1nwi×ti(n为指令种数)。上式结果也是CPI。对指令的平均执行时间求倒数就能得到MIPS的值,即MIPS = 频率 / T。
行对MIPS是根据某个公认的参考机型来定义的相应 MIPS 值,指被测机型MIPS相对于参考机型MIPS的多少倍。
MIPS 反映了机器执行定点指令的速度,但是,用 MIPS 来对不同的机器进行性能比较有时是不准确或不客观的。因为不同机器的指令集不同,而且指令的功能也不同,也许在机器 M1 上某一条指令的功能,在机器 M2 上要用多条指令来完成,因此,同样的指令条数所完成的功能可能完全不同;另外,不同机器的 CPI 和时钟周期也不同,因而同一条指令在不同机器上所用的时间也不同。如下例子:
例1.3假定某程序 P 编译后生成的目标代码由 A、B、C、D 四类指令组成,它们在程序中所占的比例分别为 43%、21%、12%、24%,已知它们的 CPI 分别为 1、2、2、2。现重新对程序 P 进行编译优化,生成的新目标代码中 A 类指令条数减少了 50%,其他类指令的条数没有变。请回答下列问题。
(1)编译优化前后程序的 CPI 各是多少? (2)假定程序在一台主频为 50MHz 的计算机上运行,则优化前后的 MIPS 各是多少?
**解:**优化后 A 类指令的条数减少了 50%,因而各类指令所占比例分别计算如下。
A 类指令:21.5/(21.5+21+12+24) = 27%
B 类指令:21/(21.5+21+12+24) = 27%
C 类指令:12/(21.5+21+12+24) = 15%
D 类指令:24/(21.5+21+12+24) = 31%
(1)优化前后程序的 CPI 分别计算如下。
优化前:43%×1 + 21%×2 + 12%×2 + 24%×2 = 1.57
优化后:27%×1 + 27%×2 + 15%×2 + 31%×2 = 1.73
(2)优化前后程序的 MIPS 分别计算如下。
优化前:50M/1.57 = 31.8 MIPS
优化后:50M/1.73 = 28.9 MIPS
从 MIPS 数来看,优化后程序执行速度反而变慢了。这显然是错误的,因为优化后只减少了 A 类指令条数而其他指令数没变,所以程序执行时间一定减少了。从这个例子可以看出,用 MIPS 数来进行性能估计是不可靠的。
MFLOPS表示的是每秒执行的浮点运算有多少百万次,相应的还有GFLOPS( 1 0 9 {10^9} 109 次/秒)、TFLOPS( 1 0 12 10^{12} 1012 次/秒)和 PFLOPS( 1 0 15 10^{15} 1015 次/秒)等
**补充:**对于峰值MIPS就要用到CPI最小的值来计算。
基准程序(benchmarks)是进行计算机性能评测的一种重要工具。基准程序是专门用来进行性能评价的一组程序,能够很好地反映机器在运行实际负载时的性能,可以通过在不同机器上运行相同的基准程序来比较在不同机器上的运行时间,从而评测其性能。基准程序最好是用户经常使用的一些实际程序,或是某个应用领域的一些典型的简单程序。