卷积计算单元(PE)设计:乘累加器(MAC)的微架构
各位同学,咱们今天聊点硬核的。卷积加速器里最核心的部件是什么?说白了,就是PE(Processing Element),也就是计算单元。而PE的心脏,就是乘累加器,简称MAC。
我刚开始做加速器那会儿,总觉得MAC不就是个乘法器加个加法器嘛,有什么好折腾的?后来被现实狠狠教育了一顿——MAC的微架构选型,直接决定了你芯片的面积、功耗和频率。今天咱们就把这块掰开揉碎了讲。
1.1 MAC的微架构:流水线深度怎么定?
MAC的基本操作很简单:D = A × B + C。但实现方式,大有讲究。
我个人习惯把MAC微架构分成三类:
- 单周期MAC:一个时钟周期内完成乘加。面积大,频率低,但控制简单。
- 两周期MAC:第一周期做乘法,第二周期做加法。面积适中,频率不错。
- 多周期流水MAC:乘法器和加法器各自再拆流水级。频率最高,但需要处理流水线冒险。
我在项目中遇到过这样一个坑:为了追求高频率,把MAC拆成了5级流水。结果发现,当连续乘加时,数据依赖导致每拍都要stall一拍,实际吞吐率反而下降了。嗯,这里要注意——流水线深度不是越深越好,得看你的数据流模式。
实战建议:对于卷积加速器这种规则数据流,我建议用2~3级流水。乘法器1级,加法器1~2级。既保证了频率,又不会因为数据依赖浪费太多周期。
来看看一个典型的2周期MAC的RTL代码片段:
// 2-stage pipelined MAC
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
mul_reg <= '0;
acc_reg <= '0;
end else begin
// Stage 1: multiplication
mul_reg <= a * b;
// Stage 2: accumulation
acc_reg <= mul_reg + c;
end
end
assign result = acc_reg;
你看,代码很简单。但实际项目中,你还要考虑饱和处理、舍入模式、溢出标志等等。这些细节,咱们后面再展开。
1.2 定点数 vs 浮点数:选哪个?
这个问题,几乎每个做加速器的人都会纠结。我的观点很明确:卷积加速器,99%的场景用定点数。
为什么会这样?你想想看:
- 面积:一个32位浮点乘法器,面积大约是定点乘法器的3~5倍。
- 功耗:浮点运算的功耗,是定点的5~10倍。
- 延迟:浮点加法器需要对齐阶码,延迟比定点加法器多好几拍。
我曾经在一个边缘AI芯片项目里,团队坚持用FP32做推理。结果芯片面积超标,功耗压不住,最后不得不改成INT8定点量化。嗯,那叫一个折腾。
我的经验:训练阶段用浮点,推理阶段用定点。现在主流做法是INT8甚至INT4量化,精度损失可以控制在1%以内。如果你做的是高精度科学计算,那另当别论。
当然,定点数也有坑。比如数据溢出、精度损失。我建议你做好这几件事:
- 做充分的位宽分析,别拍脑袋定位数
- 加入饱和保护逻辑,防止溢出导致结果异常
- 考虑中间结果的位宽扩展,比如乘完是32位,加完可能到40位
1.3 PE阵列的拓扑结构:三种主流方案
单个PE能干啥?得把它们组成阵列,才能发挥威力。常见的拓扑结构有三种,我一个个说。
1.3.1 脉动阵列(Systolic Array)
这是Google TPU用的结构,也是目前最流行的。数据像心跳一样,在PE之间有节奏地流动。
特点:
- 每个PE只和邻居通信,布线简单
- 数据复用率高,访存压力小
- 适合矩阵乘法这种规则运算
我在设计一款NPU时,用了16×16的脉动阵列。刚开始觉得挺完美,后来发现一个问题:当卷积核不是正方形时,利用率会下降。比如3×3的卷积,在脉动阵列上映射,会有不少PE空转。
避坑指南:我曾经因为没处理好边界情况,导致脉动阵列在最后一列数据时,流水线没排空,结果丢了几个有效结果。调试了两天才找到原因。记住:脉动阵列的启动和排空逻辑,一定要仔细验证。
1.3.2 权值固定(Weight Stationary)
这种结构,权值存在PE本地,输入数据在阵列中广播。适合权值复用率高的场景。
优点:
- 权值不用频繁加载,省带宽
- 每个PE的权值可以独立更新,灵活性高
缺点:
- 输入数据广播,布线压力大
- 不同PE的权值可能不同,存储开销大
1.3.3 输出固定(Output Stationary)
输出结果存在PE本地,输入数据和权值都在阵列中流动。适合输出通道数多的场景。
我个人的偏好:小规模阵列(8×8以下)用权值固定,大规模阵列(16×16以上)用脉动阵列。输出固定结构,我用的比较少,除非有特殊需求。
下面这张图,展示了三种拓扑的核心区别:
选哪种拓扑?没有标准答案。我一般会先问自己三个问题:
- 卷积核多大?3×3还是7×7?
- 输入输出通道数比例如何?
- 带宽瓶颈在哪?权值加载还是输入数据?
想清楚这些,拓扑结构自然就定了。别一上来就抄TPU的脉动阵列,你的场景可能根本不适合。
总结一下:MAC微架构选2~3级流水,定点数优先,拓扑结构看场景。这三个选择,基本决定了你加速器的天花板。下一节咱们聊聊数据流调度,那又是另一番天地。
可可精品资料库