基本概念

Foundations

自顶向下,计算机可以分为几个层次:

  • 软件应用:它们规定计算机如何表达并完成某个具体工作,如 OS,编译器等。
  • 指令集架构(Instruction Set Architecture,ISA):它们规定软件可见的机器行为是什么,如指令,寄存器,寻址,异常等。
  • 微架构(Microarchitecture):它们规定硬件如何实现机器行为,如流水线,cache,分支预测等。
  • 技术(Techonology):它们规定实现硬件的物理条件,如晶体管,连线,存储工艺,封装等。

本科期间我接触的主要是最顶层,而现在我则尝试转向最底层(技术映射 technology mapping 就是 EDA 中的一个重要环节),对于其他层次,我的掌握是很不够的。

架构设计是一个非常复杂的多优化问题,它的优化目标包括正确性,可靠性,安全性,性能,通用性,能耗等等。与此同时,不同的工作负载(往往受上层影响)和约束(往往受下层影响)也需纳入考量。

在整个架构发展史上,有这么几条路线。

集成 Integration。比如说所谓的微处理器 microprocessors,实际上就是把原来分散在多颗芯片上的处理功能集成到一颗芯片上,减少跨芯片通信和制造成本。

并行 Parallelism。可说算 Evan 组的一大方向吧。并行可以分为两类:

  • 显式并行(explicit parallelism):即并行通过软件显式地表达。隐式并行(implicit parallelism):即并行通过硬件隐式地发掘。
  • 指令级并行(instruction-level parallelism, ILP)主要是隐式,硬件发掘指令流中的并行机会,如多发射,乱序执行等;线程级并行(thread-level parallelism, TLP)主要是显式,在软件中表达,如多线程编程;数据级并行(data-level parallelism, DLP),如 SIMD,向量运算。

专用化 Specialization。针对特定任务设计架构,提高效率。

Technology

最基础的技术元件:MOSFET。

电路时序

时序(timing)。

电路通常是同步设计(synchronous design)的,通过时钟(clock)协调。同步电路用寄存器保存状态,用组合逻辑计算下一状态。

在一个周期内:时钟沿之后,数据从前级寄存器的输出端出现,经过组合逻辑,在下一个时钟沿之前必须稳定,以便后级寄存器采样并更新保存的数据。电路中所有寄存器之间最慢的组合逻辑路径,被称为 critical path。时钟周期至少要覆盖这条路径的延迟:

Tcycle≥tcritical,f=1Tcycle T_{\text{cycle}}\geq t_{\text{critical}}, \quad f=\frac{1}{T_{\text{cycle}}}

一条路径的延迟主要由逻辑门的传播延迟与连线延迟组成 tpath=∑tgate+∑twiret_{\text{path}}=\sum t_{\text{gate}}+\sum t_{\text{wire}}。

前者,门延迟指的是输入变化传播到输出所需的时间。晶体管的电阻为 RR,电容为 CC,供电电压为 VV,阈值电压为 VtV_t,则有:

tgate∼RCV−Vt t_{\text{gate}}\sim \frac{RC}{V-V_t}

后者,连线延迟指的是信号经过连线所需的时间。对于固定材料、横截面和周围环境的连线,有 R∝L,C∝LR\propto L,C\propto L,所以:

twire∝L2 t_{\text{wire}}\propto L^2

可以在长连线中增加中继器 repeater。若忽略中继器的延迟,把长连线分为 mm 段,总延迟量级变为 m(Lm)2=L2mm(\frac{L}{m})^2=\frac{L^2}{m}。选择合适的间距增加中继器,使得段数 mm 与总长度 LL 成正比,那么总延迟就能改善到近似随长度线性增长。

另外一个改善连线延迟的方法是高带宽通信局部化(keep high-bandwidth communication local)。

电路能耗与功耗

电路的能耗(energy)与功耗(power)与供电,散热等因素密切相关。它们的关系如下:

E=∫0TP(t)dt E=\int_{0}^T P(t)dt

总功耗可粗略分成:

Ppower≈Pdynamic+Pstatic P_{\text{power}}\approx P_{\text{dynamic}}+P_{\text{static}}

动态功耗主要来自的晶体管翻转过程。器件数量为 NN,平均有效电容为 CC,供电电压为 VV,频率为 ff,活动因子(active factor,一个周期中翻转的晶体管比例)为 α\alpha,则:

Pdynamic∝αNCV2f P_{\text{dynamic}}\propto \alpha N CV^2 f

静态功耗则来自晶体管的漏电(leakage)。阈值电压 VtV_t:

Pstatic=VIleak∼NVe−Vt P_{\text{static}}=VI_{\text{leak}}\sim NVe^{-V_t}

一些优化功耗的尝试。

降电压 VV。可以提供动态功耗的平方收益,但会增加门延迟,从而增加 critical path 的延迟。

降频率 ff。设某任务需要完整 KK 个周期,则所需的总时间 T=K/fT=K/f。总动态能耗:

Edynamic=PdynamicT∼NCV2fAKf=NCV2AK E_{\text{dynamic}}=P_{\text{dynamic}}T\sim NCV^2 fA\frac{K}{f}=NCV^2 AK

ff 被消掉了。所以,降频率虽然能降低动态功耗,但由于总动态能耗不变,所需的时间还增加了。且由于时间增加,静态功耗几乎不变,总的静态能耗也增加了。

Clock gating。阻止时钟沿进入闲置模块。这能减少动态功耗,但不影响静态功耗(这些模块仍然连接着电源,所以会漏电)。

Power gating。切断闲置模块的供电。这能有效减少功耗,但这些模块重新工作时需要恢复供电,等待稳定,必要时还要恢复状态。

Dual VtV_t。提高阈值电压可以减少漏电,但会增加路径的延迟。Dual VtV_t 在同一设计中混用不同阈值的器件,需要速度的关键路径使用低 VtV_t 单元,时序宽松的位置(如 SRAM)则用高 VtV_t 单元减少漏电。

同时降电压和频率。比如同时把电压与频率降低一半,功耗会变为原来的 1/81/8,动态能耗变为原来的 1/41/4,运行时间则变为原来的 2 倍。对于静态部分,电压减半使得静态功耗减半,但运行时间翻倍,所以静态能耗不变。利用这个观察,我们可以并行多个低频核心,在大幅降低功耗的同时补回处理能力。

动态电压频率调整(dynamic voltage frequency scaling, DVFS)。OS 可以根据负载情况调整电压与频率。急需完成计算时,使用较高频率和所需电压;负载较轻时,降低频率与电压;模块闲置时还可配合 clock 与 power gating。

电路制造

在芯片上雕刻晶体管!

芯片的制造成本包括固定成本(fixed cost)与单位成本(unit cost)。

前者包括设计、验证、掩膜和制造设施等投入,工艺越复杂,相关投入就越高。固定成本通过出货量摊销。后者则包括晶圆制造、封装与测试等,以每平方毫米的投入为单位。

芯片的制造需要从圆形的晶圆(wafer)上切出裸晶片(die)。裸晶片的良率 die yield 描述了一个晶圆切出的 die 中可用的比例。在缺陷密度相近时,面积较大的 die 更容易覆盖到缺陷,且每片晶圆上能切出的 die 的数量更少。

似乎这也鼓励我们走向多核。一方面,多核可以降低单位成本:它比同样面积的单核有更高的良率,因为假如某个核出现了缺陷,我们可以将其关闭,以较低的价格售出剩下的核。另一方面,多核可以降低固定成本中的设计成本,因为其中有很多可复用的设计。

另外一个概念是芯粒(chiplet):将原本集中在一整块 die 上的功能拆分到多个较小的 die 中,再通过高速互连集成到同一封装内。与多核原理相同,它也能提高良率,降低成本。但要注意 chiplet 与核这两个东西概念上的区别:核是执行指令的计算单元,而 chiplet 是制造与封装中的物理组成单元,一个 chiplet 可以包含多个核。

摩尔定律

大名鼎鼎的摩尔定律(Moore's Law)描述了集成电路上的晶体管数量随时间快速增长的经验趋势,常见表述是大约每两年翻倍。技术缩放 technology scaling 致力于缩小器件的尺寸,长期以来是支持这一趋势的重要手段。

摩尔定律带来了以下几个影响。

首先是,晶体管的数量大大增加,单个晶体管的成本下降了。如何利用数量庞大的晶体管持续提升处理器的性能成了架构师面临的一个重要设计问题。

其次,RC delay 也降低了。这是因为降低栅极长度(gate length)能有效减少门延迟。但现在栅极的长度已经很难再继续降下去了。并且,连线延迟没有同步改善。

摩尔定律对制造成本的影响是混合的。总的来说,单位成本有升(复杂化使得良率降低)有降(单位面积的性能与功能都更好),但固定成本看来是上升了。

最后就是功耗与能耗了。Dennard Scaling 发现,在理想恒定电场缩放中,尺寸和电压共同减小,使器件更密、更快,但功率密度 大致不变。但是,Dennard Scaling 带来的收益开始被电压限制了。电压一直无法按理想比例降低,使得每个晶体管的功耗无法有效降低,由此带来的是功率密度的增加,从而更容易升温。与此相关的一个现象是 dark silicon:晶体管无法全部同时以最高频率运行。

现在怎样了?摩尔定律正在越来越接近它的物理/经济/技术极限。在此之前,还有这些能做的:

  • 怎样继续扩大集成规模?=> die stacking, chiplets, wafer-scale computing
  • 怎样更好的利用这么多的晶体管?=> 并行,专用化
  • 怎样缓解 memory wall?(逻辑速度越来越快,但 memory 与 cross-chip wire 的速度没跟上)=> 缓存,near-data computing,局部通信

Performance

如何评价一个架构的表现?

性能:两个考量

延迟 delay,或执行时间 execution time:完成单个任务所需的时间

吞吐量 throughput,或带宽 bandwidth:单位时间完成的任务数

在不同的场景下,这两个考量可能会有完全不同的重要性。比如,对于某个用户而言,他可能关心的是 delay;而对某个需要处理大量请求的服务器而言,throughput 是一个更好的评估。

统计:三种平均

在 benchmark 上评估一个系统的性能,有这三种平均:

算术平均 arithmetic mean:(1/N)∑P=1..Nlatency(P)(1/N)\sum_{P=1..N}\text{latency(P)}。适合与时间成正比的统计量如延迟。

调和平均 harmonic mean:N/∑P=1..N1/throughput(P)N/\sum_{P=1..N}1/\text{throughput}(P)。适合与时间成反比的统计量如吞吐量。

几何平均 geometric mean:∏P=1..Nspeedup(P)N\sqrt[N]{\prod_{P=1..N}\text{speedup}(P)}。适合无单位(归一化后的)的统计量如加速。

性能铁律

T=IC×CPI×Tcycle=IC×CPIf T=IC\times CPI\times T_{\text{cycle}}=\frac{IC\times CPI}{f}

也就是说,程序执行的时间 TT 由 ICIC:动态执行的指令数、CPICPI:平均每条指令所需的周期数、与 TcycleT_{\text{cycle}}:周期长度共同决定。

ICIC 的主要影响因素是算法、程序、编译器与 ISA,CPICPI 同样受编译器影响,还与依赖、访存、微架构有关。TcycleT_{\text{cycle}},如我们之前讨论的那样,与电路、微架构、工艺与连线相关。

如果只考虑后面两项,有 MIPSMIPS(millions of instructions per seconds,每秒百万指令数)与 MFLOPS(只考虑浮点运算的 MIPS,因为它们通常有较长的延迟,且无法被编译器优化)。这两个指标在 MLSys 中比较常见。

本节课中我们主要关注优化 CPICPI 的因素。