计算机操作系统:第七章_计算机性能评估

第七章:计算机性能评价

本章介绍计算机系统性能的评测方法和优化技术,包括CPU性能指标、系统性能评测方法、性能优化策略以及功耗与能效分析。通过本章学习,理解计算机性能的评价标准,掌握性能分析和优化的基本方法。

学习目标

  • 理解计算机性能的主要评价指标
  • 掌握CPU性能的计算方法
  • 理解Amdahl定律及其应用
  • 了解常用的基准测试程序
  • 掌握常见的性能优化技术
  • 理解功耗与性能的关系

本章重点

  1. CPU性能指标及其计算方法
  2. Amdahl定律及其应用
  3. 基准测试程序的选择和使用
  4. 性能优化技术

本章难点

  1. CPU时间计算和性能比较
  2. Amdahl定律的理解和应用
  3. 系统瓶颈分析
  4. 功耗墙和暗硅问题

计算机性能评价是计算机系统设计、选型和优化的重要基础。不同的应用场景对性能的要求不同,因此需要多个指标来全面评价计算机性能。

7.1.1 响应时间与吞吐量

响应时间(Response Time)

  • 从提交请求到获得响应的时间间隔
  • 又称执行时间、等待时间、延迟
  • 衡量单个任务的完成速度
  • 越短越好,是用户直接感知的性能指标

吞吐量(Throughput)

  • 单位时间内完成的工作量
  • 如:每秒处理的事务数(TPS)、每秒完成的作业数
  • 衡量系统整体处理能力
  • 越大越好,是系统级性能指标
响应时间与吞吐量的关系:

单机场景:
  - 减少响应时间通常会提高吞吐量
  - 如:程序优化后执行更快,单位时间完成的任务更多
  
多任务场景:
  - 可能存在权衡
  - 增加处理器数量可能提高吞吐量,但单个任务的响应时间可能不变
  - 例如:8核处理器可以同时处理8个任务,吞吐量提高8倍,
    但每个任务的响应时间与单核相同

┌─────────────────────────────────────────────────────┐
│                    响应时间 vs 吞吐量                │
├─────────────────────────────────────────────────────┤
│                                                     │
│  响应时间 ↓                                         │
│       │                                             │
│       │    ╱ 优化单机性能                           │
│       │   ╱  (响应时间和吞吐量同时改善)            │
│       │  ╱                                          │
│       │ ╱                                           │
│       │╱  增加处理器数量                             │
│       └──────────────→ 吞吐量 ↑                      │
│          (吞吐量提高,响应时间不变)                │
│                                                     │
└─────────────────────────────────────────────────────┘

实际应用

  • 交互式应用(如网页浏览)更关注响应时间
  • 服务器应用(如Web服务器)更关注吞吐量
  • 实时系统需要同时满足响应时间和吞吐量要求

7.1.2 CPU性能指标

CPU执行时间:CPU执行程序所花费的时间,不包括I/O等待时间

时钟周期(Clock Cycle):计算机主时钟的周期时间

  • 时钟周期 = 1 / 时钟频率
  • 如:1GHz时钟频率对应1ns时钟周期

时钟频率(Clock Rate):每秒的时钟周期数

  • 单位:Hz、MHz、GHz
  • 如:3GHz表示每秒30亿个时钟周期

CPI(Cycles Per Instruction):每条指令的平均时钟周期数

  • 反映指令执行的效率
  • 受指令类型、流水线效率、Cache命中率等因素影响

MIPS(Million Instructions Per Second):每秒执行的百万条指令数

  • MIPS = 指令数 / (执行时间 × 10^6)
  • 或:MIPS = 时钟频率 / (CPI × 10^6)

MFLOPS(Million Floating-point Operations Per Second):每秒百万次浮点运算

  • 用于评价科学计算性能
  • GFLOPS = 10^9次浮点运算/秒
  • TFLOPS = 10^12次浮点运算/秒
  • PFLOPS = 10^15次浮点运算/秒
CPU性能指标关系图:

┌─────────────────────────────────────────────────────────────┐
│                      CPU性能指标                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   时钟频率(GHz)                                            │
│        │                                                    │
│        ▼                                                    │
│   时钟周期(ns) = 1 / 时钟频率                              │
│        │                                                    │
│        ▼                                                    │
│   CPU时间 = 指令数 × CPI × 时钟周期                         │
│                      ▲                                      │
│                      │                                      │
│              指令类型比例                                   │
│              流水线效率                                     │
│              Cache命中率                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

7.1.3 性能计算公式

基本公式

CPU执行时间 = 指令数 × CPI × 时钟周期
            = 指令数 × CPI / 时钟频率

示例:
程序包含1000条指令
CPI = 2
时钟频率 = 2GHz

CPU执行时间 = 1000 × 2 / (2×10^9) 
            = 1000 纳秒
            = 1 微秒

MIPS计算

MIPS = 指令数 / (执行时间 × 10^6)
     = 时钟频率 / (CPI × 10^6)

注意:MIPS受指令集影响,不同机器的指令复杂度不同,
      因此MIPS不能直接比较不同架构的性能

性能比较

性能比 = 性能_A / 性能_B = 执行时间_B / 执行时间_A

如果性能比 = n,则说"A的速度是B的n倍"
或"A比B快n-1倍"

注意:"快n倍"和"是n倍"的区别
- "A比B快2倍" 表示 A的速度 = B的速度 × 3
- "A的速度是B的2倍" 表示 A的速度 = B的速度 × 2

示例:
程序在A机器上运行10秒,在B机器上运行15秒
性能比 = 15 / 10 = 1.5
A的速度是B的1.5倍,或A比B快50%

综合性能计算示例

假设两台机器的对比:

机器A:时钟频率2GHz,CPI=2.0
机器B:时钟频率1.5GHz,CPI=1.5

对于同样的程序(指令数相同):

CPU时间_A = 指令数 × 2.0 / 2×10^9 = 指令数 × 10^-9
CPU时间_B = 指令数 × 1.5 / 1.5×10^9 = 指令数 × 10^-9

结论:两台机器执行时间相同!
说明:不能只看时钟频率,CPI也很重要

7.2.1 影响CPU性能的因素

CPU性能由三个关键因素决定:指令数、CPI、时钟频率。

指令数

  • 受指令集架构(ISA)影响
  • 受编译器优化影响
  • 受程序算法影响
  • 不同ISA的指令数差异很大(CISC vs RISC)

CPI(每条指令的时钟周期数)

  • 受处理器微架构影响
  • 流水线深度和效率
  • 分支预测命中率
  • Cache命中率
  • 指令级并行性(ILP)

时钟频率

  • 受制造工艺影响(纳米制程)
  • 受功耗限制(功耗墙)
  • 受散热条件限制
  • 受关键路径延迟限制
影响CPU性能的三要素:

        ┌─────────────────────────────────────┐
        │            程序执行时间            │
        │   = 指令数 × CPI × 时钟周期       │
        └─────────────────────────────────────┘
                      ▲
         ┌───────────┼───────────┐
         │           │           │
         ▼           ▼           ▼
    ┌─────────┐ ┌─────────┐ ┌─────────┐
    │ 指令数  │ │   CPI   │ │时钟频率 │
    │         │ │         │ │         │
    │•算法    │ │•流水线 │ │•工艺   │
    │•编译器  │ │•分支预测│ │•功耗   │
    │•ISA     │ │•Cache  │ │•散热   │
    └─────────┘ └─────────┘ └─────────┘

性能优化方向

  • 减少指令数:优化算法、编译器优化
  • 降低CPI:提高流水线效率、改善Cache性能、优化分支预测
  • 提高时钟频率:改进工艺、降低功耗

7.2.2 Amdahl定律

Amdahl定律:用于计算系统某部分改进后整体性能的提升。

加速比 = 1 / [(1 - 可改进比例) + 可改进比例/部件加速比]

变量说明:
- 可改进比例:原程序中可改进部分的执行时间比例
- 部件加速比:改进后该部分的加速倍数
- 加速比:整体程序的加速倍数

示例1:
某程序运行时间100秒,其中乘法运算占40秒。
如果将乘法运算速度提高4倍,总加速比是多少?

可改进比例 = 40/100 = 0.4
部件加速比 = 4

加速比 = 1 / [(1-0.4) + 0.4/4]
       = 1 / [0.6 + 0.1]
       = 1 / 0.7
       ≈ 1.43

改进后的执行时间 = 100 / 1.43 ≈ 70秒

Amdahl定律的启示

  • 改进效果显著部分对整体性能影响大
  • 频繁使用的部分值得优化(80/20法则)
  • 优化有极限,不能无限加速
  • 即使某部分加速到无穷大,整体加速比上限为:1/(1-可改进比例)
加速比上限分析:

当部件加速比 → ∞ 时:
加速比_max = 1 / (1 - 可改进比例)

可改进比例    最大加速比
   0.1           1.11
   0.2           1.25
   0.5           2.00
   0.9          10.00
   0.95         20.00

结论:要想获得显著的性能提升,必须改进
      程序中占用时间较大的部分

Amdahl定律应用示例

例2:多核扩展性分析
某程序中可并行部分占80%,串行部分占20%。
使用多少核才能获得10倍加速?

设使用n个核:
加速比 = 1 / [0.2 + 0.8/n] = 10

解方程:
0.2 + 0.8/n = 0.1
0.8/n = -0.1  (无解!)

结论:由于串行部分占20%,即使使用无限多核,
      最大加速比也只有 1/0.2 = 5倍
      永远无法达到10倍加速

例3:优化选择
方案A:优化占50%时间的部分,加速比2倍
方案B:优化占10%时间的部分,加速比10倍

方案A加速比 = 1 / [0.5 + 0.5/2] = 1.33
方案B加速比 = 1 / [0.9 + 0.1/10] = 1.10

结论:方案A效果更好,说明优化高频部分更重要

7.2.3 指令类型与CPI

不同类型指令的CPI不同:

指令类型 典型CPI 说明
—————–——
整数运算 1 简单ALU操作,单周期完成
浮点运算 3-5 需要多周期完成(如乘法、除法)
内存访问(Cache命中) 1-2 数据在L1 Cache中
内存访问(Cache未命中) 10-100+ 需要访问L2/L3/内存
分支指令(预测正确) 1 流水线正常执行
分支指令(预测错误) 10-20 需要清空流水线

加权平均CPI计算

CPI_平均 = Σ(CPI_i × 指令比例_i)

示例:
某程序中各类指令比例和CPI:
- ALU指令:50%,CPI=1
- 访存指令:30%,CPI=4(Cache命中率90%,未命中时CPI=100)
- 分支指令:20%,CPI=2

首先计算有效访存CPI:
CPI_访存 = 0.9×4 + 0.1×100 = 13.6

然后计算平均CPI:
CPI_平均 = 1×0.5 + 13.6×0.3 + 2×0.2
         = 0.5 + 4.08 + 0.4
         = 4.98

可见Cache未命中对性能影响很大!

7.3.1 基准测试程序

基准测试程序(Benchmark):用于评测计算机性能的标准程序集合,模拟实际工作负载。

SPEC基准测试(Standard Performance Evaluation Corp):

SPEC CPU:测试处理器性能

  • SPECint:整数运算性能(如编译器、压缩、视频编码)
  • SPECfp:浮点运算性能(如科学计算、有限元分析)
  • 最新版本:SPEC CPU 2017

SPEC Power:测试功耗性能

  • 测量不同负载下的性能和功耗
  • 计算性能/功耗比

SPEC JVM:测试Java性能

SPEC CPU 2017测试套件包含:

整数测试(SPECint2017):
- 600.perlbench:Perl解释器
- 602.gcc:C编译器
- 605.mcf:组合优化
- 620.omnetpp:离散事件仿真
- 623.xalancbmk:XML处理
- 625.x264:视频压缩
- 631.deepsjeng:人工智能(围棋)
- 641.leela:人工智能(围棋)
- 648.exchange2:编程语言解释器
- 657.xz:数据压缩

浮点测试(SPECfp2017):
- 603.bwaves:流体动力学
- 607.cactuBSSN:物理学
- 619.lbm:流体动力学
- 621.wrf:天气预报
- 627.cam4:气候建模
- 628.pop2:海洋建模
- 638.imagick:图像处理
- 644.nab:分子动力学
- 649.fotonik3d:计算电磁学
- 654.roms:海洋建模

其他基准测试

TPC基准测试(Transaction Processing Performance Council):

  • TPC-C:在线事务处理(OLTP)
  • TPC-H:决策支持(数据仓库)
  • TPC-DS:大数据分析
  • 指标:tpmC(每分钟事务数)

LINPACK

  • 解线性方程组
  • 测试浮点运算性能
  • 超级计算机排名基准(TOP500)

Geekbench

  • 跨平台综合性能测试
  • 支持多种操作系统和架构

Cinebench

  • 基于Cinema 4D的渲染测试
  • 测试CPU和GPU性能

7.3.2 性能评测方法

真实程序测试

  • 使用实际应用程序测试
  • 结果最真实,最能反映实际性能
  • 但移植工作量大,测试时间长

核心程序测试(Kernel)

  • 提取程序中最耗时的核心代码
  • 简化测试过程
  • 可能忽略系统其他方面(如I/O)

合成测试程序

  • 模拟典型操作序列
  • 如:Whetstone(浮点测试)、Dhrystone(整数测试)
  • 便于比较,但可能与真实负载有差距
  • 现代已较少使用

微基准测试

  • 测试特定组件性能
  • 如:内存带宽测试、Cache延迟测试、分支预测测试
  • 用于分析系统瓶颈
性能测试方法对比:

┌──────────────┬──────────┬──────────┬──────────┐
│   测试方法    │  真实性   │  可移植性 │  测试难度 │
├──────────────┼──────────┼──────────┼──────────┤
│ 真实程序      │   ★★★   │   ★☆☆   │   ★★★   │
│ 核心程序      │   ★★☆   │   ★★☆   │   ★★☆   │
│ 合成测试      │   ★☆☆   │   ★★★   │   ★☆☆   │
│ 微基准测试    │   ☆☆☆   │   ★★★   │   ★☆☆   │
└──────────────┴──────────┴──────────┴──────────┘

7.3.3 性能测试注意事项

测试环境控制

  • 关闭无关程序和服务
  • 预热缓存(warm-up)
  • 多次测量取平均值
  • 报告测试配置和环境

避免测量误差

  • 计时器精度(使用高精度计时器)
  • 操作系统开销
  • 随机干扰(如中断)
  • 计算统计置信区间

结果解读

  • 单一指标往往不够全面
  • 结合实际应用场景
  • 考虑功耗、成本、可靠性等因素
  • 性能价格比(性价比)
测试报告示例:

测试配置:
- CPU:Intel Core i7-9700K @ 3.6GHz
- 内存:32GB DDR4-3200
- 操作系统:Ubuntu 20.04
- 编译器:GCC 9.3.0,优化级别-O2

测试结果(SPECint2017):
- 600.perlbench:5.23
- 602.gcc:4.89
- ...
- 总体得分:5.12

测试注意事项:
- 运行3次取平均值
- 标准差 < 2%
- 关闭CPU动态频率调节

7.4.1 编译器优化

编译器优化是提高程序性能的重要手段,无需修改源代码。

优化级别

  • -O0:无优化,便于调试,编译速度最快
  • -O1:基本优化,平衡编译时间和性能
  • -O2:全面优化,推荐用于发布版本
  • -O3:激进优化,可能增加代码体积,某些情况下可能降低性能
  • -Os:优化代码大小,适合嵌入式系统
  • -Ofast:不遵守严格标准的高性能优化

常见优化技术

1. 常量传播(Constant Propagation)
   原始代码:
   int x = 10;
   int y = x + 5;
   
   优化后:
   int x = 10;
   int y = 15;  // 直接替换为常量

2. 死代码消除(Dead Code Elimination)
   删除不会执行的代码
   
   原始代码:
   int x = 10;
   x = 20;
   return x;  // x=10被覆盖,是无用赋值
   
   优化后:
   int x = 20;
   return x;

3. 循环展开(Loop Unrolling)
   减少循环开销
   
   原始代码:
   for (int i = 0; i < 100; i++)
       sum += a[i];
   
   优化后(展开4倍):
   for (int i = 0; i < 100; i += 4) {
       sum += a[i];
       sum += a[i+1];
       sum += a[i+2];
       sum += a[i+3];
   }

4. 函数内联(Function Inlining)
   减少函数调用开销
   
   原始代码:
   inline int add(int a, int b) { return a + b; }
   int x = add(3, 4);
   
   优化后:
   int x = 3 + 4;  // 直接展开

5. 指令调度(Instruction Scheduling)
   重排指令顺序,减少流水线停顿

7.4.2 算法优化

算法优化是最高效的优化方式,可以带来数量级的性能提升。

时间复杂度优化

查找算法对比:

算法         时间复杂度      100万条记录查找
────────────────────────────────────────────
线性查找      O(n)           平均50万次比较
二分查找      O(log n)       最多20次比较
哈希查找      O(1)平均       1次查找
二叉搜索树    O(log n)平均   最多20次比较

排序算法对比:

算法         时间复杂度      100万条记录排序
────────────────────────────────────────────
冒泡排序      O(n²)          约1万亿次比较
快速排序      O(n log n)     约2000万次比较
归并排序      O(n log n)     约2000万次比较
计数排序      O(n+k)         约100万次操作

空间换时间策略

  • 使用缓存存储中间结果(记忆化)
  • 预计算常用值(查表法)
  • 增加数据结构冗余以提高查询速度
空间换时间示例:

原始代码(计算阶乘):
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n-1);  // 每次都要重新计算
}

优化后(查表法):
int fact_table[] = {1, 1, 2, 6, 24, 120, 720, ...};
int factorial(int n) {
    return fact_table[n];  // O(1)时间
}

斐波那契数列优化:
原始递归:O(2^n)
记忆化递归:O(n)
动态规划:O(n)
矩阵快速幂:O(log n)

7.4.3 存储层次优化

Cache优化

  • 提高空间局部性:连续访问相邻数据
  • 提高时间局部性:重复使用数据
  • 避免Cache冲突:数据对齐,避免伪共享
Cache优化示例:

// 原始代码(按列访问,Cache不友好)
for (int j = 0; j < n; j++)
    for (int i = 0; i < n; i++)
        sum += a[i][j];

// 优化后(按行访问,Cache友好)
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        sum += a[i][j];

// 缓存分块(Cache Blocking/Tiling)
for (int ii = 0; ii < n; ii += BLOCK)
    for (int jj = 0; jj < n; jj += BLOCK)
        for (int i = ii; i < min(ii+BLOCK, n); i++)
            for (int j = jj; j < min(jj+BLOCK, n); j++)
                sum += a[i][j];

预取技术

  • 硬件预取:处理器自动识别访问模式,提前加载数据
  • 软件预取:程序员插入预取指令(如_mm_prefetch)
软件预取示例:

for (int i = 0; i < n; i++) {
    _mm_prefetch(&a[i+16], _MM_HINT_T0);  // 预取数据到L1
    sum += a[i];
}

7.4.4 并行与并发

指令级并行(ILP)

  • 流水线技术:将指令执行分为多个阶段,重叠执行
  • 超标量执行:每周期发射多条指令
  • 乱序执行(OoO):动态调度指令,减少停顿
  • 分支预测:预测分支方向,减少流水线刷新

线程级并行

  • 多线程编程
  • OpenMP:共享内存并行编程
  • POSIX线程(Pthreads)

数据级并行

  • SIMD指令(单指令多数据)
  • x86:SSE(128位)、AVX(256位)、AVX-512(512位)
  • ARM:NEON
SIMD优化示例(使用AVX):

// 普通循环
for (int i = 0; i < 1024; i++)
    c[i] = a[i] + b[i];

// AVX优化(一次处理8个float,256位)
#include <immintrin.h>
for (int i = 0; i < 1024; i += 8) {
    __m256 va = _mm256_load_ps(&a[i]);
    __m256 vb = _mm256_load_ps(&b[i]);
    __m256 vc = _mm256_add_ps(va, vb);
    _mm256_store_ps(&c[i], vc);
}

性能提升:理论上是8倍(实际约4-6倍,受内存带宽限制)

GPU并行计算

  • 适合数据并行任务
  • CUDA、OpenCL编程
  • 数千个轻量级线程并行执行

7.4.5 系统级优化

负载均衡

  • 任务分配到多个处理器
  • 避免某些处理器过载,某些空闲
  • 动态任务调度

I/O优化

  • 异步I/O:不阻塞CPU等待I/O完成
  • 批量I/O:合并多个小I/O请求
  • 使用高速存储设备(SSD、NVMe)
  • I/O调度算法优化

内存优化

  • 减少内存分配次数(使用内存池)
  • 避免内存碎片
  • 使用大页(Huge Pages)减少TLB未命中
  • 减少内存拷贝(零拷贝技术)
零拷贝技术示例:

传统文件发送:
磁盘 -> 内核缓冲区 -> 用户缓冲区 -> 内核套接字缓冲区 -> 网卡
(2次拷贝)

零拷贝(sendfile):
磁盘 -> 内核缓冲区 -> 网卡
(0次用户态拷贝)

性能提升:减少CPU开销,提高吞吐量

7.5.1 功耗墙问题

功耗墙(Power Wall):随着晶体管密度增加,芯片功耗密度急剧上升,散热成为瓶颈。

动态功耗公式

P_dynamic = C × V² × f

C:负载电容
V:工作电压
f:时钟频率

关键结论:
- 功耗与电压平方成正比
- 功耗与频率成正比
- 降低电压可显著降低功耗

静态功耗

  • 晶体管漏电流导致
  • 随着制程缩小而增加
  • 即使芯片空闲也存在

功耗墙的影响

  • 单核频率提升受限(无法散热)
  • 转向多核架构
  • 动态电压频率调节(DVFS)
功耗与性能关系:

功耗
  │
  │     ╱ 功耗墙
  │    ╱
  │   ╱
  │  ╱
  │ ╱
  │╱ 实际工作点
  └──────────────→ 性能

7.5.2 能效指标

能效比:性能与功耗的比值

  • 单位:Performance/Watt(性能每瓦特)
  • Green500排名使用此指标

每指令能耗(Energy Per Instruction)

  • 反映处理器能效
  • 与CPI和功耗相关

EEMBC能效基准

  • 嵌入式系统的能效测试
  • 测量工作负载下的能耗
能效优化策略:

1. 制程改进
   - 更小的纳米制程降低电容
   
2. 架构优化
   - 异构计算(大核+小核)
   - 根据负载选择合适的核心
   
3. 动态管理
   - DVFS:动态调整电压和频率
   - 空闲时降低频率或休眠
   
4. 软件优化
   - 减少指令数
   - 提高Cache命中率(减少访存能耗)

7.5.3 暗硅问题

暗硅(Dark Silicon):由于功耗限制,芯片上部分晶体管不能同时工作,需要保持关闭状态。

产生原因

  • 晶体管密度增长快于功耗效率提升
  • 芯片功耗预算有限
  • 散热能力受限

应对策略

  • 专用加速器(根据负载启用不同模块)
  • 近阈值计算(降低工作电压)
  • 3D堆叠(提高集成度)
暗硅示意:

芯片面积:
┌─────────────────────────────┐
│  ████    暗硅(关闭)        │
│  ████  ┌─────┐  ████        │
│        │ 工作 │              │
│  ████  │ 核心 │  ████        │
│        └─────┘              │
│  ████    暗硅(关闭)  ████  │
└─────────────────────────────┘

只有约20-40%的晶体管可以同时工作

1. 计算机性能的主要衡量指标是(  )
   A. 存储容量    B. 响应时间    C. 字长    D. 指令条数
2. 某CPU主频为2GHz,则其时钟周期为(  )
   A. 2ns    B. 1ns    C. 0.5ns    D. 4ns
3. CPI是指(  )
   A. 每秒执行指令数    B. 每条指令的平均时钟周期数
   C. 指令执行时间      D. 处理器时钟频率
4. 根据Amdahl定律,若某部件的加速比为无穷大,系统加速比的上限是(  )
   A. 无穷大    B. 可改进比例的倒数    
   C. 1/(1-可改进比例)    D. 可改进比例
5. 以下哪个基准测试主要用于测试处理器整数性能(  )
   A. SPECfp    B. SPECint    C. LINPACK    D. TPC-C
6. 动态功耗与哪个因素不成正比(  )
   A. 负载电容    B. 工作电压    C. 时钟频率    D. 电压的平方
7. 编译器优化级别-O2的含义是(  )
   A. 无优化    B. 基本优化    C. 全面优化    D. 激进优化
8. SIMD是指(  )
   A. 单指令单数据    B. 单指令多数据
   C. 多指令单数据    D. 多指令多数据
9. 以下哪个不是存储层次优化的方法(  )
   A. 循环展开    B. Cache分块    C. 预取    D. 按行访问数组
10. 暗硅问题产生的主要原因是(  )
   A. 晶体管数量不足    B. 功耗限制
   C. 制程工艺落后    D. 存储容量不足
1. CPU执行时间的计算公式为:CPU时间 = _______ × _______ × _______。
2. 基准测试程序SPEC CPU分为______和______两类,分别测试整数和浮点性能。
3. Amdahl定律的公式为:加速比 = _______。
4. 存储层次优化的主要目标是提高______局部性和______局部性。
5. 常见的并行技术包括______级并行、______级并行和______级并行。
6. 动态功耗公式:P = _______ × _______ × _______。
7. 能效比是______与______的比值。
8. DVFS是指______。
9. 80/20法则指的是______。
10. TOP500排名使用______基准测试。
1. 某程序在A机器上运行时间为10秒,A机器的时钟频率为2GHz。在B机器上运行该程序需要8秒。问:
   (1) B机器比A机器快多少倍?
   (2) 如果两台机器的CPI相同,B机器的时钟频率是多少?
2. 某计算机运行某程序,各类指令的比例和CPI如下:
  - ALU指令:40%,CPI=1
  - Load指令:20%,CPI=2
  - Store指令:10%,CPI=2
  - 分支指令:20%,CPI=3
  - 浮点指令:10%,CPI=5
  
  计算:
  (1) 该程序的CPI是多少?
  (2) 如果时钟频率为2GHz,执行10亿条指令需要多少时间?
3. 某程序运行时间为100秒,其中乘法运算占30秒。如果乘法运算速度提高2倍,总加速比是多少?改进后的执行时间是多少?
4. 某程序中可并行部分占75%,串行部分占25%。问:
  (1) 使用4个核能获得多少加速比?
  (2) 使用无限多核,最大加速比是多少?
1. 简述响应时间和吞吐量的区别与联系。
2. 什么是CPI?影响CPI的因素有哪些?
3. 简述Amdahl定律及其在性能优化中的指导意义。
4. 列举三种常用的性能优化技术,并简要说明原理。
5. 什么是功耗墙?为什么会出现功耗墙?
6. 简述暗硅问题及其应对策略。

参考答案

一、选择题:1.B 2.C 3.B 4.C 5.B 6.B 7.C 8.B 9.A 10.B

二、填空题:

1. 指令数、CPI、时钟周期(或 指令数、CPI、1/时钟频率)
2. SPECint、SPECfp
3. 1 / [(1-可改进比例) + 可改进比例/部件加速比]
4. 时间、空间
5. 指令、线程、数据
6. C、V²、f(电容、电压平方、频率)
7. 性能、功耗
8. 动态电压频率调节(Dynamic Voltage and Frequency Scaling)
9. 20%的代码占用了80%的执行时间(或80%的效果来自20%的原因)
10. LINPACK

三、计算题:

1. (1) 性能比 = 10/8 = 1.25倍;(2) 2.5GHz
2. (1) CPI = 1×0.4 + 2×0.2 + 2×0.1 + 3×0.2 + 5×0.1 = 2.1;(2) 1.05秒
3. 加速比 = 1/(0.7+0.15) = 1.18;执行时间 = 85秒
4. (1) 加速比 = 1/(0.25+0.75/4) = 2.29;(2) 最大加速比 = 1/0.25 = 4

四、简答题:

1. 响应时间是单个任务的完成时间,越短越好;吞吐量是单位时间完成的任务数,越大越好。通常减少响应时间会提高吞吐量,但在多处理器系统中,增加处理器可提高吞吐量而不改变单个任务的响应时间。
2. CPI是每条指令的平均时钟周期数。影响因素包括:指令类型、流水线效率、Cache命中率、分支预测准确率等。
3. Amdahl定律指出系统加速比受限于可改进部分的比例。指导意义:优化应集中在占用时间多的部分;优化有极限;并行化受串行部分限制。
4. (1)编译器优化:自动重排指令、内联函数等;(2)算法优化:选择更优算法降低复杂度;(3)Cache优化:改善数据访问模式提高Cache命中率。
5. 功耗墙是芯片功耗密度过高导致散热困难的问题。因为功耗与频率和电压平方成正比,而频率提升需要提高电压,导致功耗急剧增加。
6. 暗硅是由于功耗限制,芯片上部分晶体管不能同时工作。应对策略包括使用专用加速器、近阈值计算、3D堆叠等。

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 计算机操作系统/第七章_计算机性能评估.txt
  • 最后更改: 2026/02/09 23:31
  • 张叶安