简介:《计算机体系结构量化分析(第六版)》课后答案PDF面向计算机体系结构课程学习者、考研复习者与自学者,提供课后习题与案例分析的计算参考,帮助核对推导过程、理解量化分析方法。资源为1个PDF文件,大小约3.73MB,内容以章节习题解答和案例推导为主,包含公式、表格与分步计算,便于按章查阅。已有3609人学习。资料围绕芯片制造成本、良品率与多核缺陷概率、芯片面积同成本的关系、电压频率变化对能耗和功率的影响、Amdahl定律及多核能效等典型题目展开,并涉及Phoenix与Red Dragon芯片的盈利比较、单核无缺陷良品率、Phoenix4/2/1的销售取舍,以及降低电压频率时能量与功率的换算,给出晶圆片数、良品率、利润、加速比等关键结果,适合对照课堂进度复习、验算习题,并梳理第一章案例中的成本效益、良品率优化与功耗分析思路。
1. 从一道算错的题说起:体系结构量化分析到底在算什么
几乎每个翻开计算机体系结构教材的人,都会在第一章遇到一道看起来像会计题的计算:一片晶圆能切多少颗芯片、良品率多少、卖多少钱才不亏。很多人第一反应是——我学的是计算机,为什么要算这个?
因为量化分析这四个字,干的正是把“这台机器值不值、这条改进快不快、这版设计省不省电”从拍脑袋变成能算的数。它不研究某个零件怎么造,而是研究“整台机器在成本、性能、功耗三根绳子上怎么找平衡点”。这套第六版的课后解答,真正的用处不是给你一串标准数字,而是把每一步背后的假设摊开:为什么这里要乘良品率,为什么那里要除以串行比例。
搞懂这套账,你看硬件新闻的眼光会变——从“跑分多少”变成“它为了这个跑分,在面积和功耗上付出了什么”。
2. 良品率:为什么芯片越小越便宜,但不是线性的
芯片定价有个反直觉的地方:同一片晶圆上切出来的芯片,面积大一圈,单价可能翻几倍。这不是厂商想多赚,而是两颗“隐形的手”在同时挤压成本——能切几颗,以及切出来有几颗是好的。
2.1 一张晶圆能切出多少颗芯片
把晶圆想成一张圆形披萨,你要把它切成一个个正方形小块。除不尽是必然的:越靠边缘,切出来的块越不完整,只能作废。所以“每片晶圆能出多少颗芯片”从来不是简单的“圆面积除以芯片面积”,而要减掉边缘那一圈的浪费。
案例里用的公式是:
每片晶圆颗数 = π×(直径/2)² ÷ 芯片面积 − π×直径 ÷ √(2×芯片面积)
第一项是理想情况下的总面积除法,第二项是边缘修正,单位都是“颗”。代入直径 450 毫米的晶圆:
- 芯片面积 2.0 平方厘米:理想值约 795 颗,减掉边缘浪费 70 颗,实际约 724 颗;
- 芯片面积 1.2 平方厘米:理想值约 1325 颗,减掉 91 颗,实际约 1234 颗。
面积只缩小到原来的 60%,颗数却涨到原来的 1.7 倍。这是第一重挤压:面积越小,摊到每颗芯片上的晶圆成本越低。
2.2 良品率公式里那个“指数”在管什么
第二重挤压更狠。晶圆上永远飘着肉眼看不见的缺陷,一颗缺陷落在一颗芯片的范围内,这颗芯片就废了。所以良品率不是“有没有缺陷”,而是“缺陷有没有刚好落在你身上”的概率问题。
案例给出的模型是:
良品率 = 1 ÷ (1 + 缺陷密度 × 芯片面积)^指数
缺陷密度取 0.04 个每平方厘米,指数位置上取 14。这个指数反映的是缺陷在晶圆上的聚集程度——缺陷越“抱团”,大面积芯片反而越容易整片报废,指数越大,良品率随面积下降就越陡。
代入面积 2.0:良品率约 0.34;代入面积 1.2:良品率约 0.52。面积小 40%,良品率却高出五成多。两重挤压叠加,就成了“芯片面积是成本放大器”这句话的来历。
用一小段代码把这个账跑一遍,比背公式直观得多:
def dies_per_wafer(diameter_mm, die_area_cm2): # 直径换算成厘米,和芯片面积保持同单位 d = diameter_mm / 10 ideal = 3.14159 * (d / 2) ** 2 / die_area_cm2 # 理想颗数 edge_loss = 3.14159 * d / (2 * die_area_cm2) ** 0.5 # 边缘浪费修正 return ideal - edge_loss def yield_rate(die_area_cm2, defect_density=0.04, exponent=14): # 缺陷密度单位:个/平方厘米;面积单位:平方厘米 return 1 / (1 + defect_density * die_area_cm2) ** exponent for area in (2.0, 1.2): n = dies_per_wafer(450, area) y = yield_rate(area) print(f"面积 {area} cm²:{n:.0f} 颗,良品率 {y:.3f},好片 {n * y:.0f} 颗")参数说明:diameter_mm是晶圆直径,工业界常见 200 毫米和 300 毫米,案例里用的是 450 毫米的大尺寸;die_area_cm2是单颗芯片面积;defect_density是工艺线的洁净度指标,数值越小说明产线越成熟;exponent是良品率模型里的聚集因子。跑完你会发现,两组参数的“好片数”差距比颗数差距还大——这就是为什么老工艺线把缺陷密度磨下去之后,同样的设计能凭空多出利润。
| 芯片 | 面积(cm²) | 每片颗数 | 良品率 | 好片数 | 单价 | 每片晶圆收入 |
|---|---|---|---|---|---|---|
| 模拟芯片甲 | 2.0 | 724 | 0.34 | 约 246 | 30 美元 | 约 7385 美元 |
| 模拟芯片乙 | 1.2 | 1234 | 0.52 | 约 641 | 15 美元 | 约 9602 美元 |
表格里最值得盯的一列是“好片数”:乙的单价只有甲的一半,但每片晶圆的总收入反而更高。这解释了为什么很多厂商宁可在成熟工艺上做中等面积的芯片,也不急着追最先进的那条线。
2.3 坏掉几个核心,为什么还能卖钱
到这里有个绕不开的矛盾:既然大面积芯片良品率低,那多核处理器岂不是越做越亏?答案是“部分可用”这四个字救了一半的命。
一颗八核芯片,如果要求八个核心全部完好才算合格,那颗芯片的单核面积其实不大,单核良品率能到 0.87——案例里单核面积 0.25 平方厘米,算下来正是这个数。但八核全好的概率是 0.87 的八次方,只剩 0.33 左右。要是只有这一档产品,三分之二的晶圆等于白扔。
于是厂商把“核心数”当成可裁剪的规格:八核里坏了一两个,就标成六核、四核卖。案例里按“至少四个核心完好”这道门槛去累加各种组合的概率,得到的可用率明显高于全好那一档;而把门槛压到两核、一核时,累计概率掉到千分之一以下,产品线根本开不起来。
这背后还有一笔定价账。一颗八核芯片占的面积,够切出 1.73 颗四核芯片,所以八核版的价格要能盖住“少卖掉的 1.73 颗四核”的收入:30 + 1.73 × 25 = 73.25 美元。低于这条线,把大芯片降级成小芯片卖反而更划算。
注意:这里讨论的“良品率”是统计期望,不是某一颗芯片的命运。同一片晶圆上不同位置的芯片,缺陷命中概率并不均等,越靠边缘越容易中招,这也是边缘修正项存在的原因之一。
3. 省电的真相:电压平方项与 Amdahl 天花板
如果说良品率管的是“造得起”,功耗管的就是“用得起”。这一块的公式不多,但单位一混就全错——很多踩坑的推导,错在把瓦特和焦耳当成一回事。
3.1 能量是“一共花了多少”,功率是“花得多快”
打个比方:能量是一整箱水,功率是水龙头的流速。你关心手机续航,关心的是这箱水够不够用一天;你关心散热和电源规格,关心的是流速有多猛。
动态功耗的经典模型是:
功率 ≈ 活动因子 × 电容 × 电压² × 频率
而“每完成一次操作消耗的能量”是:
单次操作能量 ≈ 活动因子 × 电容 × 电压²
差别就在那个频率上。功率是能量乘以频率——同样一次开关动作,做得越快,单位时间耗得越猛。
案例里那组数字正好把这个区分摊开给你看:电压降到原来的八分之一,单次操作的能耗降到六十四分之一(平方关系);如果同时把频率也降到八分之一,功率就降到原来的 1/64 × 1/8 ≈ 0.002。这两个数字常常被抄串,一个是 0.0156,一个是 0.00195,差着八倍,说的是不同口径。
3.2 电压是平方项,频率只是一次项
既然电压是平方项,直觉上应该拼命降压才对。案例里也给了例子:电压减半、频率同时降到四分之一时,单次操作能量降到 0.25,功率降到 0.0625。看上去降压是省电的最大杠杆。
但现实里有三道坎:
第一道是阈值电压。晶体管的开启电压摆在那儿,供电电压压得太低,开关速度和噪声容限一起垮掉,芯片直接不稳。这是物理限制,不是设计水平问题。
第二道是漏电占比。电压降下来,动态功耗是降了,但漏电流带来的静态功耗不会等比例下降,占比反而升高,省下来的可能被吐回去一部分。
第三道是时序。频率和电压是一对绑在一起的参数,想跑高频就得给足电压,降压往往意味着降频。所以工程上做的不是“把电压压到最低”,而是在性能目标给定的前提下,找那条能耗最低的电压-频率组合曲线。
案例里那个“四核各降频到原来的 1/2.5”的算法,就是这套思路的体现:四颗核心同时降频降压,总能量变成 4 × (1/2.5)² ≈ 0.64,总功率再乘以 1/2.5,约 0.256。也就是说,用四颗慢核替代一颗快核,在性能持平的前提下,总功耗只有原来的四分之一左右。多核之所以能普及,省电是比“快”更硬的驱动力。
3.3 Amdahl 定律:加核之前先看串行部分
多核不是免费的午餐,卡住它的是一个叫 Amdahl 定律的东西:
加速比 = 1 ÷ ((1 − 可并行比例) + 可并行比例 ÷ 核心数)
举个案例里的数:80% 的工作可以并行,20% 必须串行。四核时加速比是 1 ÷ (0.2 + 0.8/4) = 2.5。就算核心数涨到无穷,加速比也只能逼近 1 ÷ 0.2 = 5。
这条定律最反直觉的地方在于:串行部分的比例决定天花板,核心数只决定你离天花板多近。从一核到四核,加速比从 1 涨到 2.5;从四核到十六核,可能只从 2.5 涨到 4。加核的边际收益是断崖式下跌的。
更麻烦的是,串行部分不只来自代码逻辑。锁、缓存一致性协议、任务调度、内存带宽,都会在核心变多时变成新的“隐形串行段”。真实系统的加速曲线,往往比公式给出的还保守。
还有一个功耗视角的推论:如果你把四颗核心的频率都降下来换取并行,性能不变但功耗大降;反过来,如果任务本身串行度很高,多核里大部分核心在空转,那省电优势就只剩下“闲置核心不开工”这一条了。案例里算过一笔账:四个核心只有一个在工作时,它占总功耗的 25%、占总时间的 25%,其余时间其余核心的功耗降到两成左右,加权下来总能量约 0.11。
3.4 专用加速器的甜区和雷区
通用处理器、图形加速器、专用加速单元,这三者的差别可以类比成“瑞士军刀、菜刀、专用开罐器”。
案例给出的对比很能说明问题:在两段特定工作负载上,图形加速器的加速比是 16.7 和 7.7,专用加速单元则能到 41 和 21 这个量级。把功耗也纳入考量后,通用处理器满载约 335 瓦、图形加速器约 711 瓦、专用单元约 371 瓦——专用单元在能效比上几乎是碾压式的。
但雷区就在下一页。当负载从两段变成三段、权重变成 0.4 / 0.1 / 0.5 时,专用加速单元的综合加速比掉到 0.33,也就是比通用处理器还慢。原因很直白:它在第三段负载上慢了六倍,而这段负载占了半壁江山。
这就是专用化的本质——它把宝押在“负载不变”上。负载结构一漂移,原本的优势立刻变成包袱。现实里没有哪种架构能通吃,只有“在你的负载分布下,哪条曲线更划算”。
4. 存储层次:为什么“加个缓存”不一定变快
成本、功耗之后,第三个把人绕晕的地方是存储。缓存这层东西的坑特别隐蔽:参数调好了,跑分反而下降,而且下降得毫无道理。这一章的几个案例,讲的就是这些“反直觉”。
4.1 分块矩阵转置:让数据在被赶出缓存前用完
矩阵转置看起来简单,写出来却常常慢得离谱。原因是缓存按“行”取数据:一次搬 64 字节,刚好装 8 个双精度浮点数。你按列读,每次只能用到其中 1 个,剩下 7 个白搬。
更要命的是容量。案例里说得很清楚:按列遍历时,一列数据要占 64 字节 × 256 行 = 16 KB,远超一级缓存的容量,所以刚读进来的数据还没等用上,就被后来的数据挤出去了。结果是每处理 8 个元素,就要吃 9 次缓存缺失(1 次同行 + 8 次跨列),而分块版本只需要 2 次。
解法是把大矩阵切成小块,让每块塞得进缓存,读完一块再换下一块:
// 分块矩阵转置:把 input 的 i 行 j 列搬到 output 的 j 行 i 列 // B 是块大小,需满足 B*B*8 字节能装进一级缓存 for (i = 0; i < 256; i += B) { for (j = 0; j < 256; j += B) { for (m = 0; m < B; m++) { for (n = 0; n < B; n++) { output[j + n][i + m] = input[i + m][j + n]; } } } }参数说明:B是块边长,案例里取 8 到 32 之间,取决于一级缓存大小;最内层两重循环的顺序不能随便换,m在外、n在内是为了让input按行连续访问、output按行连续写入,两头都吃到缓存行的红利。外两层循环负责“换块”,保证同一时刻只有一块数据在缓存里打转。
代码后面那个判断很关键:分块版每个输入输出元素只取一次,未分块版每 8 个元素就要多取一次整行。倍数不大,但在内存墙面前,这点倍数就是几倍的运行时间差。
4.2 相联度越高越好吗:一次反直觉的对比
缓存有个参数叫相联度,说的是“一个数据能放到几个位置”。直接映射只能放一个位置,两路、四路、八路依次放宽。直觉上,路数越多冲突越少、命中率越高,应该更快。
案例的数据把这个直觉按在地上摩擦:
| 组织方式 | 访问时间 | 缺失率 | 平均访存时间 |
|---|---|---|---|
| 直接映射 | 0.86 ns | 2.2% | 1.20 ns |
| 两路组相联 | 1.12 ns | 1.2% | 1.60 ns |
| 四路组相联 | 1.37 ns | 0.33% | 1.69 ns |
| 八路组相联 | 2.03 ns | 0.09% | 2.37 ns |
平均访存时间的公式是:命中时间 + 缺失率 × 缺失代价。八路组相联的缺失率只有 0.09%,是直接映射的二十五分之一,但它的访问时间涨了一倍多,而命中时间是在每一次访问上都要付的,缺失代价只在少数情况下付。算下来,直接映射反而最快。
这就是缓存设计里最经典的一对矛盾:命中率买的是“少跑远路”,代价是“每次出门都变慢”。当你优化的是延迟敏感的代码(比如指针追逐、链式结构),低相联度往往更讨巧;当你优化的是吞吐(比如大数组批处理),高相联度才划算。
4.3 DRAM 的 bank:延迟没降,为什么平均反而快了
再往下是内存。这一层的数字更硬:一次行缓冲缺失要经过预充电、行激活、列选通三道关,13 + 13 + 13 + 传输 4 纳秒,一共 43 纳秒;行缓冲命中则省掉前两道,只要 13 + 4 = 17 纳秒。
单看单次访问,延迟是物理决定的,改不了。案例里做过一个计算:单 bank 情况下,连续的读请求只能排队,第一次 43 纳秒、第二次 82 纳秒、第三次 121 纳秒,四次平均下来 101.5 纳秒;如果四个请求分别落在四个 bank 上,时间点变成 43、47、51、55 纳秒,平均只要 49 纳秒。
延迟一个都没变,平均延迟却砍了一半。变的是并行度。
更极端的数字是通道利用率:单 bank 时,每 39 纳秒才能启动一次读,通道只忙 4 纳秒,利用率约 10.3%。要把通道喂饱,至少需要 10 个 bank 轮流上。如果行缓冲命中率能到 50%,一次缺失加一次命中总共占 43 纳秒、通道忙 8 纳秒,利用率翻到 18.6%,6 个 bank 就够了。
所以内存条上那些密密麻麻的颗粒和 bank 划分,不是为了增加容量,而是为了把“等”这件事并行化。代价是每个 bank 都要配一圈外围电路,面积和成本跟着涨,最终在 8 到 16 这个数量级上停住。
提示:看内存性能数据时,一定要分清标的是“延迟”还是“带宽”。同一颗芯片,延迟可能十几年没怎么变,带宽却能翻几十倍,原因是并行度在涨,不是单个单元变快了。
5. 易混概念:良品率、功耗、加速比最容易被搅混的地方
这一章专门拆几组初学者最容易混的词。它们的共同点是:名字像、单位像、用起来也像,但混一次,后面整段推导都白算。
5.1 良品率和缺陷率:一个是结果,一个是参数
易混点:把“良品率 0.34”和“缺陷密度 0.04”当成同一类东西,甚至互相换算。
为什么混:两个词都带“率”,都跟“坏”有关,而且在公式里同框出现,看着像同一个量的两种叫法。
怎么区分:看单位和角色。缺陷密度是工艺线的输入参数,单位是“个每平方厘米”,属于制造能力;良品率是输出结果,是一个 0 到 1 之间的比例,属于统计结论。缺陷密度固定的情况下,芯片面积越大,良品率越低——这也是为什么同一产线做小芯片特别赚钱。判断时问一句:这个数能脱离芯片面积单独谈吗?能,就是缺陷密度;不能,就是良品率。
5.2 功耗和能耗:瓦特和焦耳不能混着说
易混点:看到“功耗降低 45%”就默认“省电 45%”。
为什么混:日常口语里“费电”既指瞬时功率大,也指总用电多,中文里这两个意思经常共用一句话。
怎么区分:看有没有时间维度。瓦特是功率,描述“此刻花得多快”;焦耳是能量,描述“一共花了多少”。降频能显著降功率,但如果任务需要跑更久,总能量未必同比例下降;降压则同时改善两者,因为电压在能量公式里是平方项。判断时问:这个数字乘上时间,才是账单上的度数吗?是,就是功率。
5.3 加速比和能效比:快 41 倍的机器可能更费电
易混点:认为加速比高的方案一定更划算。
为什么混:厂商宣传常用“快 N 倍”,而“省 N 倍”很少同时给出来,读者容易默认两者同向。
怎么区分:把性能、功率、时间三个数放在一起看。案例里专用加速单元在某段负载上加速 41 倍,但它的满载功率是通用处理器的两倍多;只有在任务密集、利用率高的场景下,快出来的时间才抵得过功率的上涨。空转的时候,专用单元的固定开销反而成了负担。判断时问:这台机器大部分时间是满载还是闲着?闲着的加速器,加速比再高也是纸面数字。
5.4 命中率和平均访存时间:缓存不是越大越相联越好
易混点:看到“命中率 99.9%”就认为这个缓存配置最优。
为什么混:命中率是最容易被单独拿出来的指标,而它确实直观——命中就是快,没命中就是慢。
怎么区分:命中率只是分子,分母里还藏着命中时间。四路组相联的缺失率能压到直接映射的七分之一,但访问时间涨了六成,最后平均访存时间反而更差。判断时问:这个命中率是在多大的访问开销下换来的?把两个数乘起来算平均,才是真实体感。
5.5 带宽和延迟:多开几个 bank 到底改善了什么
易混点:认为“延迟降不下来,加 bank 就没意义”。
为什么混:单次访问的物理延迟
本文还有配套的精品资源,点击获取