计算机体系结构 胡伟武 课后习题期末题库重点选集解析Ⅲ(8-12章)
第8章 转移预测
第一题 转移猜测结构图
1.附表8.1是转移猜测的 Yeh 和 Patt 分类中根据转移历史表 (BHT) 和模式历史表 (PHT) 的不同组合形成的转移猜测种类。PC 中用来索引 BHT 表的位数为低 6 位,索引 PHT 表的位数为低 8 位,BHT 表每项 9 位,请画出 SAs 转移猜测的结构图,说明其基本原理,并计算该结构使用的存储单元位数。
附表8.1 转移猜测的不同组合
Global PHT | Per address PHT | Per set PHT | |
---|---|---|---|
Global BHR | GAg | Gap | GAs |
Per-address BHR | PAg | PAp | PAs |
Per-set BHR | SAg | SAp | SAs |
解析:
计算存储单元位数
-
BHT 表
- BHT 使用 PC 的低 6 位索引,共 \(2^6\) 项,每项 9 位。
- 存储需求: \(2^6 \times 9 = 576 \, \text{bits}\)
-
PHT 表
- PHT 使用低 8 位索引,每项 2 位,有 \(2^8\) 项,并与 2 个分支相关联。
- 存储需求: \(2^8 \times 2 \times 2 = 262144 \, \text{bits}\)
-
总存储需求
\(576 + 262144 = 262720 \, \text{bits}\)
基本原理
- BHT(Branch History Table):
利用 PC 地址的低 6 位选择一个 9 位的分支方向量。 - PHT(Pattern History Table):
将选出的 9 位方向量与 PC 地址的低 8 位联合,用于索引到 PHT 表,从而选择分支的预测值。
结构图:
根据描述画出如下结构图:
- 输入:PC 地址
- 低 6 位索引 BHT,选出分支方向历史位。
- 低 8 位和分支方向位联合索引 PHT。
- 输出:预测值
- PHT 表中的预测值(2 位)。
我将根据以上描述生成一份结构图,请稍等。
已生成结构图,包含:
- PC地址输入 分为低6位(索引BHT)和低8位。
- BHT表 输出“全局历史”。
- PHT表 使用BHT输出及低8位索引,输出分支预测值。
存储总需求计算为262720位,图形展示预测过程与存储结构。
第六题 软件流水循环展开
6.假设流水线延迟如附表8.2所示,分支延迟为1个周期,有延迟槽。
附表8.2 流水线延迟
产生结果的指令 | 使用结果的指令 | 延迟周期数 |
---|---|---|
FP ALU op | Another FP ALU op | 4 |
FP ALU op | Store double | 3 |
Load double | FP ALU op | 2 |
Load double | Store double | 1 |
(1) 下面程序段实现对数组元素增值,R1
和 R2
的初始值满足 R1 = 8n + R2
,n
为循环次数。
L1: LDC1 F0,0(R1)
ADD.D F2,F0,F1
SDC1 F2,0(R1)
ADDIU R1,R1,-8
BNE R1,R2,L1
NOP
写出完整的软件流水循环代码,包括装入代码和排空代码,并且计算软件流水循环完成所有操作需要的总时钟周期数表达式。
(2) 分析比较软件流水和循环展开两种方案的区别。
解答:
(1) 软件流水代码
装入代码:
LDC1 F0, 0(R1)
ADD.D F2, F0, F1
LDC1 F0, -8(R1)
ADDIU R1, R1, -24
主体循环:
L1: SDC1 F2, 24(R1) // Loop i-2
ADD.D F2, F0, F1 // Loop i-1
LDC1 F0, 8(R1) // Loop i
BNE R1, R2, L1
ADDIU R1, R1, -8
排空代码:
SDC1 F2, 24(R1)
ADD.D F2, F0, F1
SDC1 F2, 16(R1)
总的执行周期数:
(2) 分析比较
- 软件流水: 无法降低分支频率,但代码量小。
- 循环展开: 可以减少分支指令,但会导致代码膨胀。
简要解析:
- 装入代码 提前完成初始的数据加载,确保后续循环运行流畅。
- 主体循环 保持流水线满载运行,同时通过软件流水减少冲突。
- 排空代码 处理剩余的指令,确保所有数据均被正确处理。
- 执行周期公式清晰表明了装入、循环和排空各部分的贡献,最终简化为 \(5n\)。
- 两种方法区别:
- 软件流水适用于指令数量受限且注重存储占用的小型程序。
- 循环展开则适用于需要优化执行效率的大型程序,但代价是较大的代码膨胀。
第9章 功能部件
第二题 加法器延迟
2.假设每个“非门”“与非门”“或非门”的扇入不超过4个且每个门的延迟为T,请给出使用茹下不同算法的16位加法器的延迟。
①串行进位加法器;
②先行进位加法器;
③说明为何先行进位加法器能比串行进位加法器快。
参考答案:
(1) 串行进位加法器
- 每一级进位传递的延迟为 \(2T\),因此生成 \(c_{16}\) 需要 \(32T\)。
- 每一级生成结果的延迟为 \(3T\),因此生成 \(s_{15}\) 需要 \(30T + 3T = 33T\)。
(2) 先行进位加法器
- 参照课本图 9.6 的方式搭建:组内并行、组间并行,4 位一组。
- 延迟计算如下:
- \(2 T\)(产生 \(p, g\));
- \(+ 2T\)(产生每组 \(P, G\));
- \(+ 2T\)(产生组间进位);
- \(+ 2T\)(产生组内进位);
- \(+ 3T\)(全加器逻辑)。
- 总延迟为 \(11T\)。
(3) 先行进位加法器能比串行进位加法器快的原因
- 关键原因:先行进位加法器能更快地生成第 \(i\) 位的 \(c\),而不需要依赖于第 \(i-1\) 位的 \(c\)。
简要解析
- 串行进位加法器: 每一位的进位需要等待上一位完成,导致总延迟较大,适合简单但低效的实现。
- 先行进位加法器: 通过分组并行计算有效减少延迟,组内并行、组间并行和逻辑并行设计显著提升了速度,延迟从 \(33T\) 降至 \(11T\)。
- 结论: 先行进位加法器通过提前生成部分结果(如 \(P, G\)),避免了串行依赖,因此更加高效。
第三题 加法树算法
3.假设每个“非门”“与非门”“或非门”的扇入不超过4个且每个门的延迟为T,请给出使用如下不同算法的把4个16位数相加的延迟。
①使用多个先行进位加法器:
②使用加法树及先行进位加法器。
解答:
(1) 使用多个先行进位加法器
- 采用先行进位加法器两两相加。
- 每个先行进位加法器延迟为 \(11T\),需要两次相加。
- 总延迟:\(2 \times 11T = 22T\)。
(2) 使用加法树及先行进位加法器
- 使用加法树将四个数相加变成两个数相加,需要 \(2\) 级全加器延迟(\(6T\))。
- 再使用先行进位加法器(\(11T\))计算最终结果。
- 总延迟:\(6T + 11T = 17T\)。
简要解析
- 多个先行进位加法器: 两次串行计算,延迟叠加,效率较低,适合简单实现。
- 加法树及先行进位加法器: 通过加法树结构并行化初步计算,显著减少延迟。最终使用先行进位加法器计算更复杂的部分,综合效率最高。
- 结论: 加法树结合先行进位加法器在结构复杂性和延迟之间取得了最佳平衡,延迟降低到 \(17T\),相较直接使用多个加法器的 \(22T\) 更优。
第10章 高速缓存
第一题 页着色地址数
1.一个处理器的页大小为4KB,一级数据cache大小为64KB,cache块大小为32B,指出在直接相联、二路组相联,以及4路组相联的情况下需要页着色(page coloring)的地址位数
题目背景
- 页大小:\(4KB = 2^{12}B\),页内地址为 \([11:0]\)。
- 一级数据 cache 大小:\(64KB = 2^{16}B\),地址范围为 \([15:0]\)。
- cache 块大小:\(32B = 2^5B\),地址范围为 \([4:0]\)。
参考答案
-
直接相联:
- cache 索引位数为地址的 \([15:5]\),需要页着色的是地址 \([15:12]\)。
- 共 \(4\) 位。
-
二路组相联:
- cache 索引位数为地址的 \([14:5]\),需要页着色的是地址 \([14:12]\)。
- 共 \(3\) 位。
-
四路组相联:
- cache 索引位数为地址的 \([13:5]\),需要页着色的是地址 \([13:12]\)。
- 共 \(2\) 位。
简要解析
-
直接相联:
- 直接相联时,cache 块数量决定索引的位数。\(64KB \div 32B = 2048\) 块,对应 \(11\) 位索引 \([15:5]\)。页大小 \(4KB\) 提供的页内地址 \([11:0]\),超出页内地址范围的部分 \([15:12]\) 需页着色。
-
二路组相联:
- 二路组相联时,每组包含两个块,组数减半:\(2048 \div 2 = 1024\),对应 \(10\) 位索引 \([14:5]\)。需页着色的部分为 \([14:12]\)。
-
四路组相联:
- 四路组相联时,每组包含四个块,组数进一步减半:\(2048 \div 4 = 512\),对应 \(9\) 位索引 \([13:5]\)。需页着色的部分为 \([13:12]\)。
总结
- 页着色地址位数取决于 cache 的组相联程度,组数越少,索引位数越少,需要页着色的位数也越少。
- 页着色的作用是避免页与 cache 冲突,提高 cache 命中率。
第二题 二级Cache不命中损耗
2.根据以下数据,计算采用不同相联度的二级cache时,一级cache不命中的损耗。采用直接相联时,L2命中时间为4个时钟周期,采用2路组相联和4路组相联时,L2的命中时间将分别增加1个时钟周期和2个时钟周期,直接相联、2路组相联、4路组相联的局部失效率分别为25%、20%、15%,L2的不命中损耗(从L2失效到数据返回L2)是60个时钟周期。
参考答案
计算公式:
1 直接相联:
2 路组相联:
4 路组相联:
简要解析
-
直接相联:
- L2 的命中时间为 \(4\) 个时钟周期,局部失效率为 \(25\%\)。
- 损耗计算包括直接的 L2 命中时间和从 L2 到内存的不命中损耗按比例计算。
-
2 路组相联:
- 相较直接相联,L2 的命中时间增加 \(1\) 个时钟周期至 \(5\)。
- 局部失效率降低至 \(20\%\),因此总损耗减少。
-
4 路组相联:
- 相较 2 路组相联,L2 的命中时间再增加 \(1\) 个时钟周期至 \(6\)。
- 局部失效率进一步降低至 \(15\%\),总损耗最小。
总结
- 相联度的影响: 增加相联度可以降低局部失效率,但命中时间也会相应增加。
- 权衡关系: 计算 MissPenalty 时需要综合考虑命中时间与失效率的折中。
第11章 存储管理
第一题 Linux操作系统的异常次数
1.在一台运行 Linux 操作系统(页大小为 4KB) 的 MIPS 计算机上执行如下 C 语言程序。在该程序执行过程中共发生了多少次例外?说明其过程。
void cycle(double* a) {
int i;
double b[65536];
for (i = 0; i < 3; i++) {
memcpy(a, b, sizeof(b));
}
}
参考答案
解释: 题目中没有明确给出 TLB 项数和替换算法,参考答案按以下两种假设情况进行计算。
- 第一种假设:物理内存充足 假设程序运行时,物理内存充足,所有页都能够映射到物理内存,且不会发生页面替换。
a
和b
数组的大小为65536 × 8B = 512KB
,每个数组各需占用512KB ÷ 4KB = 128
个页。- 每次访问
a
和b
的 128 个页均会触发一次TLB refill
例外。 - 共 3 次循环,因此总计例外次数为: 128×2×3=256128 \times 2 \times 3 = 256 即 256 次例外。
- 第二种假设:有限 TLB 表项 假设 TLB 表项数量为 128 项,采用 LRU 替换策略。
- 每次访问
a
和b
时,因其相邻奇偶页项交替访问,每次循环会触发 128 次 TLB 替换。 - 共 3 次循环,因此总计例外次数为: 128×1=128128 \times 1 = 128 即 128 次例外。
- 每次访问
最终答案
根据上述两种假设:
- 假设 1:物理内存充足,总例外次数为 256 次。
- 假设 2:有限 TLB 表项,总例外次数为 128 次。
两种假设条件下均为合理答案,需结合实际运行条件而定。
第三题 虚拟地址与物理地址的 Cache Tag 大小
3.假定在某一个 CPU 的 Cache 中需要 64 位虚拟地址,8 位的进程标识,而其支持的物理内存最多有 64GB。请问,使用虚拟地址比使用物理地址作为索引的 Tag 大多少?这个值是否随着 Cache 块大小的变化而发生改变?
参考答案:
-
虚拟地址的 Tag 大小计算:
- 虚拟地址为 64 位,包含 8 位进程标识。
- 物理地址最大为 64GB,即需要 $ \log_2(64 \text{GB}) = 36 $ 位物理地址。
- 使用虚拟地址作为索引时,Tag 比物理地址索引多 $ 8 + (64 - 36) = 36 $ 位。
-
是否随 Cache 块大小变化:
- 改变 Cache 块大小会影响 Cache 的低位部分索引,但虚拟地址和物理地址索引的低位长度相同,因此对 Cache 的 Tag 大小而言,两种索引方式的相对差值保持不变。
简要解析:
- Tag 的额外位数来源:虚拟地址包含了进程标识的额外信息(8 位),同时虚拟地址比物理地址多出地址转换所需的位数(\(64 - 36\))。
- Cache 块大小的影响:改变 Cache 块大小仅改变地址索引部分,与 Tag 的大小无关,因此虚拟地址与物理地址索引的 Tag 差值不会随块大小改变。
答案总结
- 使用虚拟地址比物理地址作为索引的 Tag 大 \(36\) 位。
- 这个值不会随着 Cache 块大小的变化而发生改变。
第12章 多处理器系统
第六题 Cache 状态变化
6.假设在一个双 CPU 多处理器系统中,两个 CPU 用单总线连接,并且采用监听一致性协议(MSI),cache 的初始状态均为无效。然后两个 CPU 对内存中同一数据块进行如下操作:CPU A 读、CPU A 写、CPU B 写、CPU A 读。写出每次访问后两个 CPU 各自的 cache 的状态变化。
参考答案:
MSI 协议表
事件 | A 状态 | B 状态 |
---|---|---|
初始状态 | I | I |
CPU A 读 | S | I |
CPU A 写 | M | I |
CPU B 写 | I | M |
CPU A 读 | S | S |
简要解析
-
MSI 协议基本规则:
- M(Modified):数据块在当前 cache 中是已修改的,且为唯一有效副本。
- S(Shared):数据块可以在多个 cache 中存在,但与内存中的数据一致。
- I(Invalid):数据块在当前 cache 中无效。
-
状态变化分析:
- 初始状态:所有 cache 块无效(I)。
- CPU A 读:数据从内存加载到 A 的 cache,状态为共享(S)。
- CPU A 写:A 的 cache 独占数据并标记为已修改(M)。
- CPU B 写:A 的 cache 状态变为无效(I),B 的 cache 变为已修改(M)。
- CPU A 读:数据从 B 的 cache 加载到 A 的 cache,状态变为共享(S)。
-
一致性维护:
- 每次写操作会通知总线其他处理器以更新或失效其 cache 中的相关数据。
- MSI 协议通过监听总线操作实现缓存一致性。
答案总结
本题展示了 MSI 一致性协议如何通过状态转换来维护双 CPU 系统中的 cache 数据一致性。
参考文献
本文作者:孤飞
本文链接:https://www.cnblogs.com/ranxi169/p/18566049
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步