简介:面向学习计算机体系结构、准备课程作业或考研复习的读者,这份《计算机体系结构量化分析第六版》课后答案聚焦第一章习题与案例,可用来核对芯片制造成本、良品率、多核缺陷率、功耗与Amdahl定律等计算过程。整包为1个PDF文件,约3.73MB,篇幅紧凑,适合在电脑或平板上直接查阅,也可打印后与教材对照批注。已有3609人学习下载,说明其在体系结构习题核对场景中具有一定参考度。内容按案例与题号组织,除给出Phoenix、Red Dragon晶圆利润、Phoenix4/2/1良品率等结果外,还保留公式推导与中间数值,便于读者复盘每片晶圆芯片数、缺陷率修正和成本分摊;功耗部分则涉及电压频率缩放、单核与多核能效对比,以及并行化受限时的加速比估算。对需要逐题对照、理解量化分析思路的读者较实用。
1. 从一张晶圆开始:计算机体系结构量化分析的计算地图
《计算机体系结构:量化分析方法》第六版的课后题,很多人第一反应是公式多、数字零碎、对不上答案。把案例按模块摊开看,整本书的计算骨架其实只有三条主线:成本、功耗、时间。成本从晶圆面积一路算到裸片数、良品率、单芯片成本和产品组合利润;功耗从电压、频率推到能量、功率与多核闲置浪费;时间由 Amdahl 定律、AMAT、DRAM 行缓冲时序共同构成天花板。三条线最后在存储层次交汇——缓存分块和 bank 并行,本质都是拿面积和功耗换时间。这份笔记按这三条线重排了答案里的案例和习题,适合正在系统学、临时想靠课后题查漏补缺的人。
2. 成本与良品率:从晶圆面积算到利润表
2.1 每片晶圆能切出多少颗裸片
课后第一章最先碰到的公式就是每片晶圆裸片数(dies per wafer)。它的思路很朴素:先用圆的面积除以单颗裸片面积,得到“理论上能塞多少颗”,再减掉边缘那些被圆周切掉、不完整的裸片。
DPW = π(d/2)² / S − πd / √(2S)
其中 d 是晶圆直径,S 是单颗裸片面积,两项必须用同一套单位(通常是毫米或厘米,别一边 mm 一边 cm)。答案里凤凰芯片(S=2)算出 795 − 70.7 = 724.5,取整 724;红龙芯片(S=1.2)算出 1325 − 91.25 = 1234。这里最容易忽略的是第二项:它不是一个可以随手抹掉的小修正,面积越小,边缘损耗占的比例反而越明显,S=1.2 时这一项吃掉了 7% 左右的产出。
把公式写成代码更不容易抄错:
import math def dies_per_wafer(diameter, die_area): """diameter 与 die_area 必须同单位;返回整片晶圆可切出的完整裸片数""" radius = diameter / 2 gross = math.pi * radius ** 2 / die_area # 圆面积除以单颗面积,理论最大值 edge_loss = math.pi * diameter / math.sqrt(2 * die_area) # 圆周切不完整的边缘损耗 return math.floor(gross - edge_loss) # 只能取整,半颗不算钱 print(dies_per_wafer(45, 2)) # 凤凰:724 print(dies_per_wafer(45, 1.2)) # 红龙:1234参数说明只记两条:diameter 是整片晶圆直径,不是半径;die_area 填的是裸片面积,不是边长。改这两个参数就能复算书里任何一个 DPW 小题,比翻答案快。
2.2 良品率:指数 14 是固定的
裸片数只解决“能切几颗”,真正决定成本的是良品率。教材采用的负二项模型长这样:
Yield = 1 / (1 + 缺陷密度 × 裸片面积 / 2)^14
答案里缺陷密度取 0.04(每单位面积缺陷数),凤凰面积 2:1/(1+0.08)^14 ≈ 0.34;红龙面积 1.2:1/(1+0.048)^14 ≈ 0.519。两个数字一比就能看出这条曲线的脾气——面积只差 1.67 倍,良品率差了 1.5 倍以上,而且是面积越大跌得越快。
梳理下来会发现,这个指数 14 在整章里从来不变,它代表工艺成熟度模型的经验常数,不是让你根据题目自由调整的。真正的自变量只有两个:缺陷密度和面积。缺陷密度对应的是产线新旧——答案里提到老厂反而缺陷率会随时间下降,因为工艺被反复调试过;面积则直接对应设计选择,芯片做大一圈,良品率是按次方级别掉的。
2.3 多核良品率:二项分布,不是简单乘方
从单核跨到多核,题目换了问法:一颗 8 核芯片,允许坏掉几个核还能当 4 核卖?这就要用二项分布,而不是把单核良品率连乘八次。
单核无缺陷概率:1/(1+0.04×0.25)^14 ≈ 0.87。8 个核里恰好有 N 个可用的概率是 C(8,N) × 0.87^N × 0.13^(8−N)。答案给出的分布大致是:
| 可用核心数 N | 组合数 | 概率 |
|---|---|---|
| 8 | 1 | 0.328 |
| 7 | 8 | 0.392 |
| 6 | 28 | 0.205 |
| 5 | 56 | 0.061 |
| 4 | 70 | 0.011 |
| 3 | 56 | 0.0014 |
| 2 | 28 | 0.0001 |
| 1 | 8 | 约 4e-6 |
至少 4 个核可用的累计概率,答案给到 0.57 这个量级——这就是 Phoenix4 值得单独包装出售的理由。再往下掉,Phoenix2 只剩 0.0011,Phoenix1 只剩 0.000004,概率低到单独测试、封装、打标的成本都收不回来,所以答案的结论是“只卖 Phoenix4,另外两种不值得卖”。
提示
这里要理解的是“降级销售”的经济学:不是技术上做不到,而是良品率低到分摊测试成本后不划算。答题时把概率算出来只是第一步,还要补一句成本判断,否则拿不到结论分。
2.4 成本拆分与最优产品组合
最后落到钱上。答案里一颗 Phoenix4 的成本是这么拼的:晶圆成本 30 美元,加上多晶硅等材料成本 25 美元,但一颗 Phoenix8 的面积能切出约 1.73 颗 Phoenix4(答案用的比例是 57/33),所以单颗 Phoenix4 的成本是 30 + 1.73 × 25 = 73.25 美元。
这套拆法的关键在于区分“整片成本”和“单颗成本”:晶圆成本是整片付的,不随良品率变化;材料与封装成本是按颗付的,良品率越低,摊到每颗好芯片上的固定成本越高。两条成本曲线一个平一个陡,交点就是该不该做大芯片的判断点。
产品组合那题更典型:凤凰需求 25000 颗、红龙需求 50000 颗,先分别除以各自的 DPW 得到 34.5 片和 40.5 片,再在晶圆产能约束下排出 40 片红龙加 30 片凤凰的组合。答案的取舍逻辑是单晶圆利润而不是单颗利润——红龙单颗只卖 15 美元,但一片晶圆能出 1234 颗且良品率 0.519,算下来 1234 × 0.519 × 15 ≈ 9601 美元;凤凰 724 × 0.34 × 30 ≈ 7384 美元。单颗贵不等于单晶圆赚,这是成本题里最反直觉的一步。
3. 功耗与能效:电压、频率和 Amdahl 的三本账
3.1 能量和功率必须分开算
第一章案例二几乎每一小题都在考同一个区分:能量(Energy)是总共消耗了多少焦耳,功率(Power)是瞬时消耗多快。动态能量约等于电容 × 电压²,动态功率约等于电容 × 电压² × 频率。
所以“运行时间缩短到 1/8”这种改动,功率完全不变,只是能量降到 1/8——因为同样的功率只开了 1/8 的时间。而“电压降到 1/2”这种改动,能量直接变成 1/4,因为电压在公式里是平方项。这两类改动在答案里交替出现,谁把时间和电压混为一谈,后面的数值就全错。
3.2 电压和频率同时缩放时的连锁反应
答案里最密集的一组计算,就是电压和频率一起往下调。按 E ∝ V²、P ∝ V²f 逐项代进去:
| 改动 | 能量比 | 功率比 | 说明 |
|---|---|---|---|
| 只把运行时间缩到 1/8 | 1/8 | 1 | 功率不变,省的是时间 |
| 电压缩到 1/2 | 1/4 | 1/4 | 平方项起作用 |
| 电压 1/2、频率再 1/8 | 1/4 | 1/32 | 功率要再乘频率比 |
| 电压缩到 1/8 | 1/64 量级 | 更小 | 平方之后量级掉得极快 |
注意
电压缩放这一步是翻车高发区。答案纸上经常出现 0.156 这样的数字,实际把 (1/8)² 老老实实算一遍是 0.0156,差了整整一个数量级。复习时不要背结论数字,代公式验一遍量级,能省掉考场上最冤的失分。
频率那一列也一样:功率比等于能量比再乘频率比,漏乘这一步,答案就会大 8 倍。梳理下来会发现,这类题只有两个动作——先算电压的平方,再乘频率的比值,其余都是算术。
3.3 多核闲置:部分核心不干活时的能效账
答案里有一道很容易被跳过的题:四核系统里只有一个核心在工作,功耗是原来的 25%,运行时间也是原来的 25%,总能耗是多少。算法是 0.25 × 0.25 + 0.25 × 0.2 × 0.75,前一项是忙时能耗,后一项是空闲时那部分核心仍然漏电、仍然吃 20% 功率的能耗,加起来约 0.1。
这道题的价值在于提醒:多核系统的能耗不是“用了几个核就乘几”,空闲核心的静态功耗照样计入。题目里那个 0.2 的系数就是常说的空闲功耗比,它决定了“关核”到底能省多少——系数越小,动态关核越划算;系数接近 1,关不关区别不大。答题时把这两项分开写,比直接给个总数更能体现你懂公式结构。
3.4 Amdahl 定律的三种问法
Amdahl 定律在答案里出现了至少三种变体,每种问法的加权方式都不同。
第一种是固定负载求加速比:不可并行部分占 20%,四核之后是 1/(0.8/4 + 0.2) = 2.5。注意分母里 0.8/4 是并行部分被分摊,0.2 原样不动,这一步写反的人不少。
第二种是“为了达到某个加速比,需要多高的并行比例”,本质是把公式反解。答案里那道 2 = 1/((1−x) + x/20) 解出 x ≈ 52.6%,含义是只要一半多一点的代码能并行到 20 倍,整体就能翻倍。
第三种是混合负载:多个程序各自加速比不同,不能取算术平均。答案用的是按时间占比加权再取倒数,比如 1/(0.4/2.46 + 0.1/2.76 + 0.5/1.25) ≈ 1.67。这里 0.4、0.1、0.5 是各负载占总时间的比例,分母里每一项都是“这部分时间被压缩到了多少”。
还有一种更隐蔽的问法:给多核降频来省电。答案里四核各跑到 1/2.5 的频率和电压时,能量是 4 × (1/2.5)² = 0.64,功率再乘 1/2.5 得 0.256。这题的关键是核心数要乘进去——四个核,每个都按平方缩,别只算一个。
4. 缓存与内存层次:分块、AMAT 和行缓冲时序
4.1 缓存行决定了分块尺寸
第二章第一道案例就从矩阵转置切入。已知每个元素 8 字节、缓存行 64 字节,一行正好装 8 个元素;矩阵 256×256。按列访问时,每读一个元素就要换一条缓存行,转置的输入输出两块加起来最少需要 128 × 8 字节 = 1KB 才能让工作集同时驻留。
这个 1KB 不是随便给的数字,它是“输入块 + 输出块都能待在缓存里”的下限。未分块版本每次列访问都 miss,一行加八列一共 9 次缺失;分块版本每个元素只取一次,两次缺失就够。答案里那句“9 比 2”就是整道题的题眼。
4.2 分块转置:循环次序写反就全白算
分块版本的标准写法是四层循环,外层按块跳,内层块内遍历:
/* 256x256 矩阵转置,B 为分块边长,通常取缓存行元素数的整数倍 */ 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++) { /* 注意下标是 [j+n][i+m],转置发生在写入端 */ output[j + n][i + m] = input[i + m][j + n]; } } } }这段代码有三个参数要盯住:B 是分块边长,取太小循环开销大,取太大块本身又装不进缓存,经验值是让 B×B×8 字节明显小于一级缓存;i、j 是块坐标,m、n 是块内坐标,两套变量不能混用;写入端必须写成 output[j+n][i+m],写反就变成了原样拷贝,跑得飞快但结果是错的。
答案还追问了直接映射和 2 路组相联的差别:直接映射下,输入块和输出块可能映射到同一组互相踢,2 路组相联给了容错空间。这一问考的是“分块能不能生效,取决于冲突缺失而不只是容量缺失”,只看容量不看相联度,分块也可能白分。
4.3 AMAT:相联度不是越高越好
答案里那张表把“命中时间”和“缺失代价”放在一起算平均访存时间 AMAT = 命中时间 + 缺失率 × 缺失代价:
| 组织 | 访问时间 | 周期 | 缺失率 | 缺失代价(周期) | AMAT |
|---|---|---|---|---|---|
| 直接映射 | 0.86 ns | 2 | 2.2% | 20 | 1.20 ns |
| 2 路 | 1.12 ns | 3 | 1.2% | 20 | 1.60 ns |
| 4 路 | 1.37 ns | 2 | 0.33% | 13 | 1.69 ns |
| 8 路 | 2.03 ns | 3 | 0.09% | 13 | 2.37 ns |
结论有点反直觉:相联度越高、缺失率越低,AMAT 反而越差。原因是相联度推高了命中时间,而命中时间在每次访问都要付,缺失代价只在少数访问里付。梳理下来会发现,这题真正考的是“高频小成本”和“低频大成本”谁更划算,而不是“缺失率越低越好”。
算这张表时有两个坑:一是周期数要向上取整(2.03 ns 在 0.79 ns 周期下是 3 个周期,不是 2.57);二是缺失代价要先换算成周期再乘,别把纳秒和周期混在一行里加。
4.4 DRAM 行缓冲:43 ns 和 17 ns 的差别
内存部分的计算围绕四个时序参数展开:预充电 tRP = 13 ns、行激活 tRCD = 13 ns、列选通 CL = 13 ns、数据传输 4 ns。
行缓冲缺失(换一行)要付 tRP + tRCD + CL + 传输 = 13 + 13 + 13 + 4 = 43 ns;行缓冲命中(同一行再取)只要 CL + 传输 = 17 ns。两个数字一摆,就能看出为什么内存控制器拼命想把访问排成“同一行连续取”。
更关键的是通道利用率。连续两次读操作之间必须隔 tRP + tRCD + CL = 39 ns,而这 39 ns 里通道真正被占用只有 4 ns,利用率 4/39 ≈ 10.3%。要让通道跑满,就得让 10 个 bank 轮流上;如果访问是行命中与行缺失交替,43 ns 里通道忙 8 ns,利用率 18.6%,6 个 bank 就够。答案里那句“至少 10 个 bank”不是拍的,是 100% 除以 10.3% 得来的。
延迟那题更能说明 bank 并行的价值:单个 bank 连续服务四个请求,完成时间分别是 43、82、121、160 ns,平均 101.5 ns;四个请求分散到四个 bank,平均降到 49 ns。物理延迟一点没变,变的是排队时间——这也是为什么 DRAM 厂商在 DDR3 上放 8 个 bank、DDR4 上放 16 个,而不是无限加。
4.5 DRAM 功耗与容量选型
功耗部分的表格给的是不同芯片组织下的芯片功耗和 rank 功耗。答案的结论很干脆:同样容量下,用更少、更大的芯片更省电——4Gb 颗粒工艺更好,组一个 rank 用的颗粒少,外围电路和 I/O 的重复开销就少。这跟“多放几颗小芯片更便宜”的直觉相反,因为这里比的是功耗不是面积成本。
看这类表要盯三列:单颗芯片功耗、整 rank 功耗、rank 容量。只比较单颗功耗会得出错误结论,因为不同组织的颗粒数不一样,必须归一到同一容量再比。
5. 易错点盘点:五个最容易在复习时漏掉的坑
5.1 公式与量级上的三个坑
易漏点一:良品率的指数和面积单位。为什么漏:公式长得像普通幂函数,抄的时候容易把指数 14 写成 4 或者干脆按 2 算,面积也常常忘了和缺陷密度对齐单位。怎么补:把“指数 14 固定、缺陷密度按单位面积、面积按同一单位”写成一行注释贴在公式旁边,每道题先检查这三项再看数字。
易漏点二:能量和功率的缩放差一个平方。为什么漏:两个词在中文里经常混用,题目又喜欢在电压、频率、时间三种缩放之间来回切换。怎么补:固定一个顺序——先写 E ∝ V²,再写 P ∝ V²f,最后看题目改的是时间还是电压,改时间只动能量,改电压动平方。每算完一步用数量级反查一次。
易漏点三:混合负载用算术平均。为什么漏:多个加速比摆在一起,直觉就是加起来除以个数。怎么补:只要题目给的是“各负载占总时间的比例”,就必须用按比例加权再取倒数,也就是 1/(Σ 时间占比/加速比)。看到“比例”两个字就换公式,形成条件反射。
5.2 时序与拆分上的两个坑
易漏点四:分块转置的循环次序和下标。为什么漏:四层循环看着对称,i/j 和 m/n 很容易写串,写完还能跑出结果,只是结果不对或者根本不快。怎么补:写完先用 2×2 的小矩阵手推一遍,确认 output[j+n][i+m] 的转置关系;再把 B 设成缓存行元素数的整数倍,跑一次对比未分块版本的耗时,速度没变化就说明分块没生效。
易漏点五:DRAM 时序混用和 bank 数算反。为什么漏:43 ns、39 ns、17 ns 三个数长得像,bank 数又容易用“延迟除以传输”去算。怎么补:把三个数各自对应的场景写死——换行 43、连续读间隔 39、同行命中 17;bank 数一律用“100% 除以通道利用率”来推,不要凭感觉估。
6. 复习清单:把整章计算题收进一张自查表
6.1 按题型排的自查表
考前时间有限,按题型过一遍比按页翻答案有效得多。下面这张表左边是题型,中间是要默出来的式子,右边是自检动作:
| 题型 | 核心式子 | 自检动作 |
|---|---|---|
| 每片晶圆裸片数 | π(d/2)²/S − πd/√(2S) | 两项单位是否一致,结果是否取整 |
| 良品率 | 1/(1 + D×A/2)^14 | 指数是不是 14,面积和缺陷密度是否同单位 |
| 多核良品率 | C(n,N)p^N(1−p)^(n−N) | 是否累加了“至少 N 核可用” |
| 单颗成本 | 晶圆成本 + 面积比 × 材料成本 | 面积比是切出的颗数比,不是面积直接相除 |
| 能量/功率缩放 | E ∝ V²,P ∝ V²f | 电压是否平方,频率比是否补乘 |
| Amdahl | 1/(串行比例 + 并行比例/加速倍数) | 分母里串行项是否原样保留 |
| 混合负载加速比 | 1/(Σ 时间占比/加速比) | 有没有误用算术平均 |
| AMAT | 命中时间 + 缺失率 × 缺失代价 | 周期数是否向上取整,单位是否统一 |
| DRAM 行缺失 | tRP + tRCD + CL + 传输 | 三个 13 是否都加上了 |
| bank 数 | 100% / 通道利用率 | 用的是利用率倒数,不是延迟相除 |
6.2 三步复盘,控制在半小时内
第一步,只看表里的“核心式子”一列,把每个式子默写一遍,写不出来的打星号,回到对应章节补。第二步,挑三道带星号的题重算,重点验量级而不是验数字——比如电压缩到 1/8,先判断结果应该在 0.01 量级还是 0.1 量级,再对答案。第三步,把这一章所有“反直觉结论”单独抄一页:单颗贵不等于单晶圆赚、相联度高不等于 AMAT 低、bank 多不改变单次延迟但改变平均延迟。这三条是最容易在考场上被题目绕进去的地方。
# 三步复盘里的量级自检,改参数即可复用 def scale_check(v_ratio, f_ratio): energy = v_ratio ** 2 # 能量只看电压平方 power = energy * f_ratio # 功率再乘频率比 return round(energy, 6), round(power, 6) print(scale_check(0.5, 0.125)) # (0.25, 0.03125):电压减半、频率 1/8 print(scale_check(0.125, 1.0)) # (0.015625, 0.015625):电压 1/8,量级是 0.01代码只做一件事:把电压和频率两个比值代进去,先出能量再出功率,用结果反查自己手算的量级有没有跑偏。参数改一个,就能验证一整类小题,比逐题对答案快。
我自己最早的教训是:把答案从头到尾抄了一遍,觉得自己会了,结果一合上书,良品率公式的指数、AMAT 的取整、bank 数的推法三处全记混。从那以后每次复习这套内容,我都强制走一遍“默式子—验量级—抄反直觉结论”的三步,宁可少做几道新题。希望帮到你。
本文还有配套的精品资源,点击获取