领域专用架构(DSA)
几十年来,“我想让程序跑得更快”的答案很简单:等下一代 CPU 就行。每一代主频更高、每个周期做的事更多,你的代码不用改就自动变快。这顿免费午餐在撞上功耗墙时结束了(Dennard 缩放在 2006 年前后失效):你仍然能在一颗芯片上塞进更多晶体管,但已经无法让它们全部全速翻转而不把芯片烧坏。那些剩下来、供不起电的晶体管,就叫做暗硅。领域专用架构正是针对这个难题给出的架构层面答案。与其造一颗什么都能勉强跑的通用 CPU,不如把这些晶体管花在一台为某一类工作负载量身打造的专用引擎上,并且只点亮这类负载真正需要的那部分硅。
这笔交易是用通用性换效率。一颗通用 CPU 的大部分能量并没有花在你真正要算的数学上,而是花在各种开销上:猜测下一条指令是什么、重排工作顺序、在层层缓存之间搬运数据、一次只解码一条指令。DSA 把这些统统砍掉。它为目标任务把数据通路直接硬连线,采用与该负载访问模式相匹配的内存布局,让成千上万个简单运算并行执行,并且常常降到“够用就好”的低精度数字。结果是,针对那一个领域,即便在同一工艺节点上,每瓦性能也往往能比 CPU 高出十到一百倍。代价正是同一枚硬币的另一面:DSA 在它那一件事上出类拔萃,在其他一切事情上一无是处。
那些耳熟能详的例子全都是 DSA。GPU 为图形那种大规模并行的算术而调优,如今也用于神经网络训练。TPU 和 NPU 则专门为 AI 推理中铺天盖地的乘累加运算而调优。正因如此,一颗现代手机或数据中心芯片已不再是一颗大处理器,而是一组专用模块的集合,每个模块都靠把一件事做到极致高效来挣回自己占用的那块硅。随着全面的晶体管缩放放慢脚步,专用化正越来越成为真正性能提升的来源。
general CPU domain-specific (e.g. NPU) +---------------------+ +---------------------------+ | fetch / decode | | tiny control | | branch predict | | | | out-of-order sched | | +---------------------+ | | 1-4 wide ALU | | | thousands of MAC | | | deep L1/L2/L3 cache | <--> | | units, in parallel | | | | | +---------------------+ | | (overhead dominates)| | data path matched to | +---------------------+ | the one workload | good at everything, +---------------------------+ great at nothing great at ONE thing/watt
通用 CPU 把大部分面积和功耗花在灵活性上(预测、调度、缓存);领域专用架构则几乎把这些全都花在某一个工作负载的实际计算上,以通用性换取每瓦性能。
专用化是个移动的靶子:DSA 只有在它的工作负载保持稳定时才划算,因为正是那份硬连线的高效率,让它在算法发生变化时极难改作他用。