第1章 计算机体系结构的基本概念

1.1 计算机体系结构的概念

1.1.1 概念的演变

存储程序计算机,即冯·诺依曼计算机由五个部分组成:

  • 运算器。用于完成数值运算。
  • 存储器。用于存储数据和程序。
  • 输入/输出设备。计算机与外部信息交换。
  • 控制器。对程序完成控制(指令、命令)序列,完成对数据的运算。

①以运算器为中心;②程序(指令)和数据放在同一存储器中

计算机体系结构是程序员所看到的计算机的属性,即概念性结构和功能特性。

1.1.2 计算机体系结构组成和实现

体系结构概念包括计算机系统设计的三个方面:

  1. 计算机指令系统:程序员可见的实际指令系统,是计算机系统硬件和软件之间的一个分界面。
  2. 计算机组成:又叫微体系结构
  3. 计算机硬件:计算机具体的实现技术,包括逻辑设计,集成电路工艺、封装等。

1.1.3 计算机系统中的层次概念

系列机(family machine)一个厂家生产的具有相同的体系结构(指令集结构),但组成和实现不同的一系列不同型号的计算机系统。

兼容性:

1.2 计算机体系结构的发展

1. 分布的 I/O 处理能力

2. 并行处理技术的发展

并行性的概念:

  • 并行性:计算机系统在同一时刻或者同一时间间隔内进行多种运算或操作。

    只要在时间上相互重叠,就存在并行性。

    • 同时性:两个或两个以上的事件在同一时刻发生。
    • 并发性:两个或两个以上的事件在同一时间间隔内发生。

从执行程序的角度来看,并行性等级从低到高可分为:

  • 指令内部并行:单条指令中,各种微操作之间的并行。
  • 指令级并行:并行执行两条或两条以上的指令。
  • 线程级并行:并行执行两个或两个以上的线程。(通常是一个进程内派生多个线程为调度单位。)
  • 任务级或过程级并行:并行执行两个或两个以上的过程或任务(程序段),以子程序或进程为调度单位。
  • 作业或程序级并行:并行执行两个或两个以上的作业或程序。

从处理数据的角度看,并行性等级从低到高可分为:

  • 字串位串:每次只对一个字的一位进行处理。

    最基本的处理方式,不存在并行性

  • 字串位并:同时对一个字的全部位进行处理,不同字之间是串行的。

    开始出现并行性

  • 字并位串:同时对许多字的同一位(位片)进行处理。

    具有较高的并行性

  • 全并行:同时对许多字的全部位或部分位进行处理。

    最高一级的并行

3. Flynn 分类法

Flynn 分类法 按照指令和数据的关系,把计算机系统的结构分为 4 类:

  1. 单指令流单数据流(Signle Instruction Single Data Stream,SISD):指令和数据都不存在并行,完全串行执行。

  2. 单指令流多数据流(Single Instruction Multiple Data Stream,SIMD):一个指令流同时对多个(组)数据进行相同的操作。

    典型机器包括阵列机(Array Processor)和图形处理器(GPU)。

  3. 多指令流单数据流(Multiple Instruction Single Data Stream,MISD):多个指令流在一个数据流上进行操作。

    多处理器容错结构的计算机。

  4. 多指令流多数据流(Multiple Instruction Multiple Data Stream,MIMD):多个独立的处理器在不同的数据上执行不同的指令。

4. 提高并行性的技术途径

  1. 时间重叠:引入时间因素,让多个处理过程在时间上相互错开,轮流重叠地使用同一套硬件设备地各个部分,以加快硬件周转而赢得速度。例如流水线技术。

    实现时间重叠的基础是:部件功能专用化

  2. 资源重复:引入空间因素,以数量取胜。同故宫重复设置硬件资源,大幅度地提高计算机系统的性能。

  3. 资源共享:这时一种软件方法,它使多个任务按一定时间顺序轮流使用同一套硬件设备。例如网络打印技术。

    资源共享的概念实质上是单处理机模拟多处理机。

5. 多机系统中并行性的发展

多机系统遵循时间重叠、资源重复、资源共享原理,发展为 3 种不同的多处理机:

  • 同构型多处理机
  • 异构型多处理机
  • 分布式系统

6. 耦合度

耦合度 反应多机系统中各机器之间物理连接的紧密程度和交互作用的强弱。

最低耦合 :耦合度最低,除通过某种中间存储介质外,各计算机之间没有物理连接,也无共享的联机硬件资源。

松散耦合系统(间接耦合系统) :一般是通过通道或者通信线路实现计算机之间的互连,可以共享外存设备(磁盘、磁带等)。机器之间的相互作用是在文件或数据集一级上进行。

紧密耦合系统(直接耦合系统) :在这种系统中,计算机之间的物理连接的频带较高,一般是通过总线或高速开关互连,可以共享主存。

1.3 计算机系统设计和分析

1.3.1 成本和价格

商品的标价(价格)由以下因素构成:

  • 原料成本

  • 直接成本:与一件产品直接相关的成本,包括劳务成本、采购成本等。

  • 毛利:公司开支的一部分,这部分开支必须均摊到每一件产品中。

    主要包括:公司研发经费,市场建立费用等。

  • 折扣:公司提供了批发价格折扣,产品通过零售店进行销售,零售商需要获利,所以抬高部分价格。

1.3.2 基准测试程序

测试程序包(组件,benchmark suites)

  • 选择一组各方面有代表性的测试程序组成
  • 尽可能全面的测试了一个计算机系统的性能

1.3.3 量化设计的基本原则 (重点)

1. 大概率事件优先原则

追求全局的最优结果

对于大概率事件(最常见的事件),赋予它优先的处理权和资源使用权,以获得全局的最优结果。即“好钢用在刀刃上”,事半功倍。

2. Amdahl 定律

  • 系统性能加速比,受限于该部件在系统中所占的重要性

  • 可以定量计算

注意:是没改进的执行时间比上改进后的执行时间

  • 可改进比例: T1/T0T_1/T_0

  • 部件加速比: T1/T2T1/T2

部件改进后,系统的总执行时间等于不可改进部分的执行时间加上可改进部分改进后的执行时间,即

总执行时改进后=(1可改进比例)总执行时改进前+可改进比例总执行时改进前部件加速比总执行时间_{改进后}=(1-可改进比例)*总执行时间_{改进前}+\frac{可改进比例*总执行时间_{改进前}}{部件加速比}

总执行时改进后=总执行时改进前[(1可改进比例)可改进比例部件加速比]总执行时间_{改进后}=总执行时间_{改进前}*[(1-可改进比例)*\frac{可改进比例}{部件加速比}]

  • 系统加速比:

总执行时改进前总执行时改进后=1(1可改进比例)可改进比例部件加速比\frac{总执行时间_{改进前}}{总执行时间_{改进后}} = \frac{1}{(1-可改进比例)*\frac{可改进比例}{部件加速比}}

解:

{% asset_img image-20230214181520516.png image-20230214181520516 %}

3. 程序的局部性原理

  • 程序执行时所访问的存储器在时-空上是相对地簇聚(这种簇聚包括指令和数据两部分)
    • 程序的时间局部性:程序即将用到的信息很可能就是目前正在使用的信息。
    • 程序的空间局部性:程序即将用到的信息很可能与目前正在使用的信息相邻或者临近。
    • 其他局部性:生产——消费局部性

4. CPU 性能公式

CPU时间=执行程序所需的时钟周期数时钟周期时间=ICCPI时钟周期时间CPU时间 =执行程序所需的时钟周期数*时钟周期时间= IC *CPI*时钟周期时间

  • CPICPI :每条指令执行的平均时钟周期数

    CPI=执行程序所需的时钟周期数/ICCPI = 执行程序所需的时钟周期数 / IC

  • ICIC:所执行的指令条数

{% asset_img image-20230214193002805.png image-20230214193002805 %} 

{% asset_img image-20230214192650728.png image-20230214192650728 %}

**解:**

$CPI_{分支}=2$

$CPI_{其他}=1$

$CPI = CPI_i * IC_i$

$CPI_A = 0.2*2+0.8*1=1.2$

$CPI_B = 0.25*2+0.75*1 = 1.25$ (B 的其他指令中没有单独的比较指令,所以 $CPU_B$ 的程序量是 $CPU_A$ 的 80%)

$IC_{A_{分支}}$ = $IC_{B_{分支}}$

$IC_B = 0.8 * IC_A$ (由于 $CPU_B$ 不执行比较)

$f_{clk_A}=xf_{clk_B}$ ;题目中 $x$ 可取 1.25 或 1.1。 

$T_{clk_B}=xT_{clk_A}$

由 $T_{CPU} = IC *  CPI * T$

$T_{CPU_A} = IC_A * CPI_A * T_{clk_A}$

$T_{CPU_A} = IC_A * (0.2*2+0.8*1) * T_{clk_A} = IC_A * 1.2 * T_{clk_{A}}$ (比较指令也属于其他指令) 

$T_{CPU_B}=IC_B * 1.25 * T_{clk_B} = 0.8*IC_A * 1.25 * x T_{clk_A} = IC_A*x*T_{CLK_A}$

所以,当 $x=1.25$ 时,尽管 $CPU_B$ 执行的指令条数较少,但 $CPU_A$ 有着更短的时钟周期, $CPU_A$ 更快。

$x=1.1$ 时,$CPU_B$ 更快。