第2章:硬件加速基础——数字电路、并行计算与存储体系

各位同学,欢迎来到Transformer硬件加速的实战课。我是你们的讲师,一个在芯片堆里摸爬滚打了十几年的老兵。

今天咱们聊点硬核的——硬件加速的基础。你可能会问:“我都来学Transformer加速了,为什么还要回头复习数字电路?”

嗯,这个问题我当年也问过我的导师。他回了一句:“你连组合逻辑和时序逻辑都分不清,怎么去优化一个卷积核的流水线?” 后来我踩了不少坑,才明白他说的是对的。

好,咱们不废话,直接开整。

2.1 数字电路基础:组合逻辑与时序逻辑

2.1.1 组合逻辑——瞬间出结果

组合逻辑,说白了就是“输入一变,输出立马变”。没有记忆,没有时钟,纯粹靠门电路搭出来的计算通路。

举个例子:一个加法器。你把两个数扔进去,它瞬间算出和。这就是组合逻辑。

我在项目中遇到过一个问题:一个复杂的组合逻辑链太长,导致信号传播延迟过大,芯片跑不到目标频率。后来怎么解决的?插寄存器,打断长路径。这就是时序逻辑的活儿了。

核心要点:

  • 组合逻辑的输出只取决于当前输入
  • 没有存储能力
  • 延迟由门级路径长度决定

2.1.2 时序逻辑——带记忆的计算

时序逻辑就不一样了。它依赖时钟,每个时钟沿才更新一次输出。说白了,它记住了“上一拍”的状态。

最常见的时序单元就是D触发器。你想想看,如果没有时序逻辑,整个芯片就像一盘散沙,所有信号乱跑,根本没法同步。

我曾经调试过一个bug:一个计数器在仿真时正常,流片回来却乱跳。查了三天,发现是时钟树不平衡,导致触发器的时钟沿没对齐。嗯,时序逻辑的坑,往往藏在时钟和复位上。

避坑指南:

我曾经在设计中把组合逻辑和时序逻辑混在一起,结果综合工具报了一堆“latch inferred”的警告。记住:组合逻辑不要依赖时钟,时序逻辑一定要有明确的时钟域。

2.2 并行计算原理

Transformer模型为什么需要硬件加速?说白了,它太“胖”了。一个Attention层里,矩阵乘法动辄几百G的算力需求。单核CPU跑?等到天荒地老。

所以,我们需要并行。并行计算有三种基本形式,我一个个讲。

2.2.1 数据级并行

数据级并行,就是“一份数据拆成多份,同时处理”。

举个例子:你要算两个向量的点积。传统做法是一个元素一个元素地乘加。数据级并行怎么做?把向量拆成4段,用4个乘法器同时算,最后加起来。

在Transformer里,矩阵乘法天然适合数据级并行。我习惯把一个大矩阵切成多个小块,每个块交给一个处理单元去算。这就是SIMD(单指令多数据)的思想。

2.2.2 任务级并行

任务级并行,就是“不同的任务同时干”。

比如Transformer的Encoder里,有Multi-Head Attention和FFN两个大模块。理论上,它们可以流水起来——一个头在算Attention,另一个头已经在准备FFN的输入了。

但要注意:任务级并行需要处理好数据依赖。我曾经在一个项目里,为了追求并行度,把两个有依赖的任务强行并行,结果算出来的结果全是错的。嗯,教训深刻。

2.2.3 流水线

流水线,是硬件加速里最常用的技巧。没有之一。

你想想看:一个矩阵乘法,可以拆成“取数→乘→加→写回”四个阶段。如果每个阶段用一个时钟周期,那一个乘法需要4个周期。但如果你用流水线,第一个数据在周期1取数,周期2乘法,周期3加法,周期4写回。同时,第二个数据在周期2就可以开始取数了。

这样,虽然单个乘法的延迟还是4个周期,但吞吐量变成了每个周期一个结果。这就是流水线的魔力。

流水线设计的关键:

  • 平衡各阶段延迟,避免“短板效应”
  • 处理好数据冒险(RAW、WAR、WAW)
  • 流水线深度不是越深越好,太深了控制逻辑会爆炸

2.3 存储层次结构

做硬件加速,最头疼的不是算力,而是“喂数据”。

你算得再快,数据搬不过来,一切都是白搭。这就是存储层次结构要解决的问题。

2.3.1 SRAM——快但贵

SRAM,静态随机存取存储器。它的特点是快——几个纳秒就能读出数据。但缺点也很明显:面积大,成本高。

在芯片里,SRAM通常用作缓存。比如CPU的L1/L2 cache,或者NPU的片上buffer。

我习惯把Transformer的权重矩阵放在SRAM里,因为权重需要频繁读取。但SRAM容量有限,一个7B模型光权重就14GB(FP16),片上根本放不下。怎么办?往下看。

2.3.2 DRAM——大但慢

DRAM,动态随机存取存储器。容量大,成本低,但速度慢——访问延迟在几十纳秒级别。

DRAM需要定期刷新,否则数据会丢失。这也是“动态”二字的由来。

在Transformer推理时,DRAM通常用来存模型权重和中间激活。但每次从DRAM读数据,都要等几十个周期。所以,我们要尽量减少DRAM访问次数。

2.3.3 HBM——高带宽的救星

HBM,高带宽存储器。它是把多个DRAM die堆叠起来,通过硅通孔(TSV)连接,带宽极高。

一块HBM2E的带宽可以到460GB/s,而普通DDR4只有25GB/s左右。差了将近20倍。

在AI芯片里,HBM几乎是标配。比如NVIDIA的A100有80GB HBM2E,带宽超过2TB/s。没有HBM,大模型推理根本跑不动。

我的经验:

我曾经在部署一个BERT模型时,发现推理速度卡在DRAM带宽上。后来把权重从DDR4搬到HBM,速度直接翻了4倍。嗯,存储层次的选择,直接影响系统性能。

2.4 片上网络(NoC)基础

芯片越来越大,核心越来越多。传统的总线结构已经撑不住了——所有核心抢一条总线,带宽不够,延迟爆炸。

于是,片上网络(Network-on-Chip,NoC)应运而生。

NoC的思想很简单:把芯片当成一个微型网络,每个核心是一个节点,通过路由器和链路连接。数据以“包”的形式在网络里传输。

常见的NoC拓扑有:

  • 网格(Mesh):每个节点只连上下左右,简单但延迟随跳数增加
  • 环形(Ring):所有节点连成一个环,适合广播
  • 树形(Tree):层次化结构,适合局部通信

在Transformer加速器里,NoC用来连接多个计算单元和存储单元。比如,一个矩阵乘法单元算完结果,要通过NoC发给下一个单元做激活函数。

我参与过一个项目,NoC的设计没做好,导致两个计算单元之间的通信延迟比计算本身还长。后来重新设计了路由算法,才把延迟降下来。

注意事项:

NoC不是万能的。对于小规模芯片(比如4-8个核心),总线可能更简单高效。NoC的功耗和面积开销也不小,设计时要权衡。

本章知识体系

下面这张图,是我手绘的本章知识体系。你可以看到,数字电路是基础,并行计算是方法,存储层次和NoC是支撑。四者缺一不可。

硬件加速基础:知识体系 硬件加速基础 数字电路基础 并行计算原理 存储层次结构 片上网络(NoC) 组合逻辑 时序逻辑 数据级并行 任务级并行 流水线 SRAM DRAM HBM 拓扑结构 路由算法

好了,这一章的内容就到这里。数字电路是硬件的“砖瓦”,并行计算是“图纸”,存储层次和NoC是“水电管道”。四者结合起来,才能搭出高效的Transformer加速器。

下一章,我们会深入Transformer的计算模式,看看它到底“吃”什么硬件资源。到时候,你会发现今天讲的基础知识,全都能用上。


公众号:蓝海资料掘金营,微信deep3321