第七章:计算机性能评价
章节概述
本章介绍计算机系统性能的评测方法和优化技术,包括CPU性能指标、系统性能评测方法、性能优化策略以及功耗与能效分析。通过本章学习,理解计算机性能的评价标准,掌握性能分析和优化的基本方法。
学习目标:
- 理解计算机性能的主要评价指标
- 掌握CPU性能的计算方法
- 理解Amdahl定律及其应用
- 了解常用的基准测试程序
- 掌握常见的性能优化技术
- 理解功耗与性能的关系
本章重点:
- CPU性能指标及其计算方法
- Amdahl定律及其应用
- 基准测试程序的选择和使用
- 性能优化技术
本章难点:
- CPU时间计算和性能比较
- Amdahl定律的理解和应用
- 系统瓶颈分析
- 功耗墙和暗硅问题
7.1 计算机性能指标
计算机性能评价是计算机系统设计、选型和优化的重要基础。不同的应用场景对性能的要求不同,因此需要多个指标来全面评价计算机性能。
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 CPU性能分析
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 系统性能评测
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 性能优化技术
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 功耗与能效
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%的晶体管可以同时工作
7.6 练习题
一、选择题
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堆叠等。