ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

系统结构期末复习:Amdahl定律、流水线与Cache考点梳理

系统结构期末复习:Amdahl定律、流水线与Cache考点梳理 每到大三期末总有不少人被“计算机系统结构”这门课折腾得够呛。它不是计算机组成原理的简单加长版——计组讲的是硬件内部怎么工作系统结构研究的是软硬件交界面上如何通过架构设计获得更高性能。我当年复习的时候也踩过不少坑概念背了一堆但一做流水线冲突题就懵Amdahl定律公式明明记住了可题目换个说法就不会用。这篇笔记想做的就是把这座知识山重新梳理成一张能走通的地图课程核心考什么、哪些题型最容易白丢分、复习和实验分别该怎么准备。适合期末冲刺的同学也适合正在补基础、想把系统结构真正学明白的读者。1. 先把这门课的坐标系拉出来它和计组到底有什么不同1.1 系统结构的“问题域”性能、并行、资源调度计算机系统结构这门课很多学校把它放在计算机组成原理后面于是不少人默认“就是计组第二遍”。这个默认非常坑。计组的重点在于“硬件如何实现”比如ALU怎么做加法、寄存器文件怎么读写、数据通路怎么连而系统结构的关键词是“性能”“并行”“层次”。它研究的不是某个部件本身而是部件之间的组织和调度方式指令集怎么设计才能又好译码又方便编译器优化流水线怎么处理冒险才能让吞吐率更接近理想值Cache放到哪一级、用什么替换策略才能让平均访存时间最短。换句话说计组是在说“车是怎么造出来的”系统结构是在说“同样一台车怎么调教才能在赛道上跑出更好的圈速”。理解这个定位复习时就不会把大量时间耗在门电路细节上也不会觉得课程内容散成一盘沙。后面所有章节其实都围绕同一条主线在资源有限的前提下把“性能”这个目标拆解成可优化的指标再用架构手段去优化它。把这条主线抓在手里那些看似零散的概念就会自动挂到同一棵树上。1.2 用一张考点地图给复习排优先级我复习前做的一件事是把教材目录和老师PPT章节列成一张表按考频标优先级。这里给一个通用版本大家可以根据自己学校的考纲调整知识块典型题型复习优先级性能公式与Amdahl定律计算题极高流水线冒险与分支预测计算分析题极高Cache映射/替换/写策略计算简答极高虚拟存储与TLB计算简答高指令系统设计选择/简答/编码题中高I/O方式与中断选择/简答中Flynn分类与并行结构名词解释/简答中互连网络拓扑选择/简答中这张表的意思是先花大精力把性能、流水线、存储层次这三块拿下这三块能占到考试的一半以上而且计算题套路很固定是性价比最高的部分。后面的指令系统和并行结构主要是记忆性内容适合考前一周集中过。我不建议一上来就捧着课本从头读到尾也不建议只刷题不看体系。比较靠谱的节奏是先花半天把知识链路画出来——性能公式 → 指令集 → 流水线 → 存储层次 → I/O → 并行结构然后按链路逐段攻克。链路画完你会发现每章之间是有因果的指令集复杂了译码就慢流水线就不好做流水线冒险多了CPI就上去了CPI上去了前面学的性能公式马上就有了用武之地。这门课最忌讳“背了前面忘了后面”因为考点之间根本就是连着的。往年试卷的用法也不是拿来猜题而是用来检验这条链路哪些环节还没打通做错的题回溯到链路里的具体节点再回头翻教材对应章节这样复习两三轮知识自然就织成网了。2. 性能计算题不能靠背公式Amdahl定律与CPU性能公式的运用细节2.1 两个公式的物理含义比公式本身更重要Amdahl定律是所有性能题的地基。公式长这样加速比 S 1 / ((1 - Fe) Fe / Se)。其中 Fe 是可改进部分占原执行时间的比例Se 是这一部分的改进倍速。先别急着背。我想帮你建立一个直觉把程序执行时间看成一块饼其中 Fe 这块饼可以被改进改进后它的时间变成 Fe/Se剩下 (1-Fe) 这块饼改不动。那么改进后的总时间就是 (1-Fe) Fe/Se原来的总时间是 1两者一比就是上面的公式。用这种“饼图思维”去理解比死记硬背强得多而且考试时不会因为记错分子分母翻车。这个公式有四个高频丢分点我一个个说Fe 是“占原执行时间的比例”不是占改进后时间的比例。题目如果绕一个弯说“改进后某部分占比为多少”你得先推回原时间占比。Se 是“加速到多少倍”。某操作从2ns优化到1nsSe2不是1。注意这里最容易和“减少比例”搞混。当 Se 趋向无穷大时加速比的极限是 1/(1-Fe)。所以并行加速不可能超过串行部分决定的瓶颈这就是这门课反复强调“串行瓶颈”的理论来源。如果题目说“某部分时间减少了a%”则 Se1/(1-a%)Fe 仍是该部分原时间占比。不少同学直接把 a% 当 Fe 代入一道送分题就没了。CPU性能公式同样重要CPU时间 指令数IC × 平均CPI × 时钟周期时间T也可以写成 IC × CPI / 频率。这套公式解决的是“硬件参数变了性能变了多少”的问题。理解公式时要把三个变量分清楚IC由编译器和指令集架构决定CPI由微架构和程序行为共同决定时钟周期由工艺和设计决定。三者是相乘关系任何一项变差都会线性拖累性能这也是后续章节优化思路的总源头。2.2 两道典型题把解题框架走一遍直接看第一道题。某CPU原CPI为4其中一条指令占程序执行时间的20%把这条指令的CPI优化到2求整体加速比。解Fe20%即0.2Se4/22代入 S1/(0.80.2/2)1/0.9≈1.111。也就是说整体性能只提升了11.1%。很多同学第一反应是“这条指令快了一倍整体应该快不少”实际却只有十分之一——这正是Amdahl定律反直觉的地方。考试中这种题如果出成选择经常有人选“接近20%”或“接近50%”就是因为没有真正理解Fe是占比而不是简单相加。再看难一点的版本。优化前某程序执行时间为100s其中浮点运算占60s整数运算占20s其他操作占20s。若浮点运算速度提升2倍、整数运算提升1.5倍求新的执行时间和总加速比。解法是分项算新时间新时间 60/2 20/1.5 20 30 13.33 20 63.33s加速比 100/63.33 ≈ 1.579。这道题考的就是“分项改进要分项算”别把Fe合成一个数然后套简单公式那样会把各部分的改进系数搅在一起算错。遇到这种多段改进的题目我的习惯是把每一段“原时间→新时间”写清楚再汇总过程清晰不容易错。再补充一个CPU时间公式的例题某程序指令数1000条平均CPI1.5主频2GHz求执行时间。答案是 1000×1.5/(2×10^9) 0.75微秒。如果题目改成“每条指令的CPI和占比给出”就先用加权平均CPI Σ(占比_i × CPI_i)再代入总公式。这类题目没有技巧唯一要盯紧的是单位换算主频给GHz时时间一般用ns或微秒记别把2GHz直接写成分母里的2。2.3 复习时怎么练这类题千万别只背公式性能计算的题我复习时是把历年题里所有涉及加速比、CPI、执行时间的题目摘到一起连着刷了两轮。第一轮求做对第二轮求“能不能用更快的路径做出来”。刷完我发现这类题的错误基本上都集中在“读题不清”上Fe找错、Se算反、把时间减少比例直接当倍速。所以我建议你准备一个小本子不抄题只记录每道错题的“题目说人话版本”。比如“题目说的改进比例是占总时间的20%”“这里的1.5倍是新频率/旧频率”。考前翻一遍这本避雷本比再做十套题都有用。另外还有一个实际操作中的小技巧做Amdahl题时先把“饼图”画在草稿纸上标出哪一块被优化、优化成多少再套公式。画图看起来慢但实际上能帮你避免绝大多数低级失误。3. 流水线风险判断的核心是“翻译”从相关到冒险的完整分析链条3.1 相关、冲突、冒险三个概念一串讲透教材上先讲相关再讲冒险最后讲解决手段。很多同学只记住了“三种冒险结构冒险、数据冒险、控制冒险”但题目一变就判断不出来。我自己的方法是把这条逻辑链记牢电路中存在“相关”才会在流水线重叠执行时引发“冒险”冒险的本质是某条指令在某个时钟周期需要的数据或部件还不满足预期。相关有三类数据相关、名称相关、控制相关。对应到冒险数据相关引发RAWread after write先写后读类数据冒险名称相关引发WAR和WAW类数据冒险控制相关引发控制冒险另外部件不够用会引发结构冒险。把这条对应关系理清考试里很多“给定义”的题就不用临时编答案了。下面这张表是我复习时整理的基本能覆盖大部分考点冒险类型根因典型解决手段结构冒险硬件资源冲突资源重复设置、指令调度数据冒险RAW后一条指令读前一条还没写出的寄存器转发/旁路、插入气泡、编译调度数据冒险WAR/WAW乱序/多发射下名称复用寄存器重命名、stall控制冒险分支/跳转改变PC分支预测、延迟槽、预测失败清空这张表为什么重要因为考试简答题爱问“什么是冒险有哪些解决方式”而分析题喜欢反过来给你一段指令让你说出哪里有冒险并画出解决后的流水线时空图。能把上面的表默写出来基本上这两类题都能应对。3.2 实际指令序列中怎么判断数据冒险来看一段最常见的5级流水线示例LW R1, 0(R2) # R1 - Memory[R20] ADD R3, R1, R4 # R3 - R1 R4 SW R3, 0(R5) # Memory[R50] - R3 SUB R6, R7, R8 # 与前面无数据相关先说结论ADD 需要读 R1而 R1 是上一条 LW 写出来的存在 RAW 相关SW 需要读 R3而 R3 是 ADD 写出来的同样存在 RAW 相关SUB 和前面没有数据相关理论上是可以在流水线中比较舒服地跟跑的。如果在5级流水线IF、ID、EX、MEM、WB里不考虑转发ADD 在 ID 阶段要读 R1但此时 LW 才刚到 EX 或 MEMR1要等 LW 走到 WB 阶段才写回所以必须停顿两个周期这就是教科书里经典的“气泡”。加了转发forwarding/旁路后ALU 结果可以直接从 EX/MEM 或 MEM/WB 段寄存器送回给 ID/EX 段使用大多数 RAW 冒险只需要一个周期甚至不需要停顿就能解决。所以考试题里如果让你画时空图一定要看清题目有没有“支持转发”这个前提这是最容易丢分的隐含条件。WAR 和 WAW 在顺序执行的单流水线里基本不会出现因为它们要求后一条指令比前一条先读或先写顺序流水线天然不满足只有在乱序执行、多发射机制下才需要认真对付。判断冒险的顺序建议是这样先把每一条指令“写哪个寄存器、读哪个寄存器”列出来再逐条配对找到“后面读前面写”的RAW然后再看有没有资源冲突和控制流跳转。按这个流程走不容易漏。我在期末阶段帮同学讲题时发现绝大多数判断失误都是因为跳过了“列读写寄存器”这步直接凭感觉看指令序列一旦指令超过三条就眼花。3.3 分支冒险和超标量的常见考法分支指令带来的控制冒险考试一般有两种考法。第一种是概念题比较静态预测和动态预测。静态预测通常在编译期决定比如“预测不跳转”或“预测跳转”实现简单但对分支行为敏感准确率不稳定。动态预测用分支历史表或BTB记录跳转历史准确率高但需要额外硬件支持。答题时最好能带一句“现代处理器普遍采用多级自适应预测器用历史信息修正预测方向”这句话能显示你不是只背了概念。第二种是计算题而且套路非常固定。假设分支指令占20%分支预测正确率80%预测错误时会清空3条已经进入流水线的指令求平均CPI。答案就是 1 20%×20%×3 1.12。这里“1”是流水线理想情况下每条指令一个周期“20%×20%”是分支指令遇到预测错误的概率“3”是每个错误的惩罚周期。这个公式几乎每本教材都会出现理解后很划算分支比例、错误概率、惩罚周期三个量题目怎么变都只是换数字。再往上走超标量多发射也会考理想发射宽度为2实际平均IPC却达不到2原因是什么回答就是结构冒险、数据冒险、控制冒险共同限制了发射宽度加上Cache缺失也会造成停顿。考到这里已经是课程里比较深的内容复习时掌握“瓶颈来自冒险和访存”这一层就够了不必陷入现代处理器的复杂微架构细节。核心是把原理能讲清、简单计算会做这两点做到分数就能拿到手。4. 存储层次是绝对的大头Cache与虚拟存储的拿分要点4.1 三种映射方式用一张表理解Cache的三种映射方式最直观的理解方式就是画表格对比。映射方式主存块可存放位置地址字段优点缺点直接映射唯一固定块Tag Index Offset硬件简单、访问快冲突率高全相联任意块Tag Offset冲突率低比较电路复杂、慢组相联固定组内任意块Tag Index Offset折中折中很多同学背了“直接映射冲突大全相联速度慢”就以为够了但考试真正考的是地址字段的计算。给你一个例子主存32位地址Cache容量64KB块大小32B4路组相联。先把Cache能放多少块算出来64KB/32B2048块4路组相联表示每4块一组所以组数2048/4512组索引Index需要log2(512)9位块内偏移Offset是log2(32)5位剩下的Tag就是32-9-518位。这个计算步骤是固定动作练两遍就能拿全分。最容易错的地方有两个一是算组数时用的是“块数/路数”不是其他什么上下颠倒的算法二是有不少题目给的是“主存块大小”而不是“Cache块大小”其实Cache块大小就等于主存块大小别被绕进去。遇到这类题我会先在草稿上写三个问号块大小给了没有几路组相联地址总共多少位三个问号填完位数字段基本就出来了。4.2 替换算法与写策略选择题与简答题的常客替换算法考得最多的是LRU和FIFO。用一道经典题走一遍Cache有4块访问块号序列是1,2,3,4,1,2,5,1,2,3,4,5。FIFO的命中次数是2次LRU是4次。FIFO把最先进入的块1替换掉结果后续访问块1时要重新调入而LRU每次替换最久未使用的块保留近期高频访问的块命中率明显更高。这个例子能直接说明“LRU利用时间局部性”简答题里也经常要你分析为什么LRU通常优于FIFO。复习要点是LRU替换的是“最久没有被访问”的块不是“最早被装入”的块。FIFO的“先进先出”和LRU的“最久未用”在访问模式稍微复杂一点时就会产生差异很多同学就是因为把两者混为一谈才做错。题目要求“给出替换过程”时我建议画一个四行队列每次命中把该块移到队列尾未命中且满时替换队头。这种画法一目了然也不容易数错命中次数。写策略的考点是个四象限写直达写分配、写直达写不分配、写回写分配、写回写不分配。写直达是同时写Cache和内存能保持内存最新但带宽开销大写回是只写Cache、替换时才写回内存性能好但一致性维护复杂。多核系统还会引出一致性问题教材一般会讲MESI协议考试通常只要求知道四个状态名的含义Modified被修改、Exclusive独占、Shared共享、Invalid失效。复习时不必背协议的每个状态转换细节但要说得出“写回型Cache通过状态标记同步多核副本”这个方向简答题基本就够了。4.3 虚拟存储与TLB不要把它当成“大号Cache”虚拟存储和Cache最大的区别不只在于“容量不同”而在于作用对象不同。Cache缓解的是CPU和内存之间的速度差距虚拟存储解决的是内存容量不够以及程序隔离、保护的问题。页式管理把地址空间切成页缺页时需要访问磁盘代价比Cache缺失大好几个数量级所以页替换策略更倾向于LRU的近似算法。考试里常见的综合题是算平均访存时间题目会给TLB命中率、TLB访问时间、Cache命中率、Cache访问时间、内存访问时间、缺页代价。我的做题习惯是先画一条路径树TLB命中与否是第一个分叉Cache命中与否是第二个分叉缺页是第三层然后按分支概率乘时间加起来。很多同学一上来就列式子结果少乘一个概率或者漏掉题目“TLB访问和Cache访问同时进行”的设定。实际考试中如果题目说“TLB和Cache并行访问”那TLB访问时间就不该单独加一遍如果是串行访问则每层都要算。读题时圈出“并行”“串行”这两个词基本就不会错。页表本身还藏着几个小考点两级页表、页表项格式、TLB缺失时的处理流程。复习时至少要把“虚拟地址→页号/页内偏移→查页表→得到物理页框→拼出物理地址”这条路径默写一遍考试时无论是给图填字段还是算页表大小都能顺着路径往下推。5. 碎片考点收拢指令系统、I/O与并行体系结构怎么复习不丢分5.1 指令系统设计是“开胃菜”也是“陷阱题”指令系统部分高频考点是CISC和RISC对比、寻址方式、指令编码。对比题很好拿分CISC指令复杂、变长、以微程序控制为主RISC指令精简、定长、以硬布线控制为主、Load/Store结构、寄存器数量多。关键是别只背结论要能解释“为什么RISC更容易做流水线”指令长度规整、操作数统一来自寄存器译码简单数据冒险种类减少控制逻辑也更规整。把“RISC→定长→易译码→流水线友好”这条因果链写出来简答题的分数基本就稳了。寻址方式常考立即数寻址、寄存器寻址、直接寻址、间接寻址、变址寻址等。复习时不用背每一种的英文全称但要能给出“操作数在哪”和“访存几次”这两个关键信息。比如寄存器寻址不访存直接寻址访存一次取操作数间接寻址访存一次取地址再访存一次取操作数。考试给一条指令问“用了哪种寻址方式”本质上就是考这个“操作数定位过程”。指令编码题主要考“给定寄存器个数和寻址方式数算字段位数”。比如32个通用寄存器需要log2(32)5位8种寻址方式需要3位如果操作码固定8位每条定长指令长度就是各字段之和。变长指令则要你设计指令格式考虑“高频指令用短操作码低频指令用长操作码”的霍夫曼思想。系统结构课一般不考编码算法的数学细节掌握“短操作码优先给高频指令”这个原则就够用。5.2 Flynn分类与并行结构把碎片考点连成线并行体系结构这一块看起来考点零碎其实可以串成一条线。Flynn分类按指令流和数据流把计算机分为SISD、SIMD、MISD、MIMD四种考试最常见的是SIMD和MIMD的辨析。SIMD是同一指令作用于多份数据典型代表是向量机和GPUMIMD是多个处理器各跑各的指令流典型代表是多核CPU。复习时可以各配一个例子SIMD想到“数组每个元素同时加1”MIMD想到“多个核心分别跑不同进程”。互联网络是高频填空或选择题点总线共享实现简单但带宽瓶颈明显交叉开关带宽高但成本随端口数平方增长多级互联网络是折中方案。这一块不需要会画复杂拓扑只要能说清三种方式的“带宽—成本”权衡就行。延迟、带宽、可扩展性这三个词是答互联网络题的关键词无论题目问什么从这三个维度展开都不容易偏。还有两个容易混淆的概念是超线程和双核。超线程是让一个物理核心同时处理多个线程本质上是在一个核心内部复用流水线空闲资源双核是两个物理核心并行执行。考试如果问“并行粒度谁更细”要回答超线程更接近线程级并行里的资源复用多核则是标准的线程级并行MIMD的典型实现。这些说法在教材里都有影子但需要自己整理成一句能写出来的话临考时才能快速输出。6. 实验和上机最容易白丢的分其实有固定套路6.1 课程实验平台的常见坑系统结构课程通常配实验很多学校用的是教学版模拟器或实验箱比如不少院校的课程实验环境里会看到STAR COP2018这类软件一般还配了对应的使用手册。这类教学软件的好处是图形化、能单步看流水线和寄存器变化坏处是它的“脾气”你得摸汇编语句格式、寄存器命名、内存初值设置、文件保存路径都会成为卡住你一小时的坑。我的经验是先看一遍软件自带的使用手册不要上来就敲代码。手册里通常会写清楚“指令助记符和教材不一样”“数据输入格式用十进制还是十六进制”这类关键信息。第一次实验课花半小时把环境熟悉一遍比后面返工省很多时间。另一个常见坑是初始状态实验说明里默认的Cache策略、分支预测策略、甚至寄存器初值都可能和你手写的代码预期不一致导致结果对不上。拿到实验环境后第一件事就是去选项设置里确认这些默认值。做实验时最容易出现的问题是“照着PPT敲完代码结果和理论预期对不上”。这时候先别怀疑理论按顺序排查先看汇编指令有没有被正确加载再看Cache/寄存器初始状态是否和实验说明一致最后单步执行观察是哪一条指令开始和预期出现分叉。绝大多数“实验现象不对”都不是动手能力问题而是某个初始条件没配对。把单步调试当成找证据的过程而不是瞎试很快就能定位问题。6.2 把实验现象翻译成理论考点实验除了要写出“能跑的结果”还要能说出“结果为什么是这样”这恰恰和笔试考的是同一种能力。比如流水线实验中你会在时空图里看到一些本来不该有的空档那些空档要么是数据冒险导致的气泡要么是分支预测失败后的清空周期。考试考你“判断冒险”实验是在让你“看见冒险”。如果你在实验里用单步方式观察过一条LW后面紧跟一条ADD时的停顿那道题就算出得再灵活你也能一眼看出来它在考什么。做Cache实验时同理替换算法换成LRU和FIFO之后命中率曲线的差异其实就是前面替换算法计算题的可视化版本。报告里不要只贴截图和代码把理论对应写进去这个曲线为什么在这个访问模式下差距明显换成全相联会怎样把这些问题回答清楚实验报告的质量会明显上一个档次。上机考试或答辩时老师最喜欢问的就是“你这段代码为什么这么写”“这个结果怎么解释”能答上来这门课的实验分就稳了。另外提醒一个细节无论是模拟器实验还是实验箱操作做完一步就随手保存版本文件名带日期或版本号。我见过不少同学快上机结束时软件崩溃结果所有配置全丢。虽然这个问题听起来和“系统结构”没啥关系但课堂时间有限这种低级意外造成的损失一点都不低级。实验报告里的截图、时空图也一定要加图题和必要标注比如图中哪个周期是气泡、哪个信号是分支预测错误这些标注本身就是拿分点。最后讲点个人体会。计算机系统结构这门课难不是难在单个知识点而是知识点之间像血管一样连在一起。我复习时最有用的动作是考前把每个章节用一张A4纸画成一条链路性能公式算出来的加速比最后会落在流水线哪一级Cache替换策略会影响平均访存时间的哪个变量指令集的设计选择又如何决定了流水线处理的难度。把这些“翻译”画完考试时不管是计算题还是简答题你都能很快定位到考点。这门课值得你多花点时间它会在以后写代码、调性能、选硬件时反复回来找你。
返回列表