Skip to main content

*2.5.1 ALU

Multi-level ALU array(多级 ALU 阵列) 是 GenDP 论文中计算单元(CU)的核心结构。它不是简单的“多个 ALU 并排”,而是把多个 ALU 按层级组织成一棵 归约树(reduction tree),让中间结果在 ALU 之间直接传递,而不必频繁写回寄存器文件。

论文第 3.2 节说:

In order to support DP objective functions efficiently in the PE, we design a multi-level ALU array in the compute unit.

第 4.3 节进一步对比了 1 级、2 级、3 级三种方案,最终选择 2 级 ALU reduction tree。

下面从结构、工作原理、对比、应用场景几个方面详细解释。


1. 什么是 ALU 阵列?​

ALU(Arithmetic Logic Unit,算术逻辑单元) 是执行基本运算的硬件单元,比如:

  • 加法、减法
  • 取最大值、最小值
  • 比较(大于、等于)
  • 移位、按位与/或

ALU 阵列 = 多个 ALU 组合在一起,可以同时执行多个操作。

最简单的形式是 1 级 ALU 阵列:只有一个 ALU,所有操作串行执行,每步结果写回寄存器,下一步再读出来。


2. 什么是“多级”ALU 阵列?​

多级 指的是把多个 ALU 组织成 层级结构,每一级的输出作为下一级的输入,形成一棵 归约树。

论文 Figure 7 展示了三种方案:

2.1 1 级 ALU 树(Figure 7c)​

┌─────────┐
输入 ──►│ ALU │──► 输出
└─────────┘
  • 只有 1 个 ALU;
  • 每次操作后结果必须写回寄存器文件(RF);
  • 下一步再从 RF 读出来。

问题:RF 访问次数多,功耗高,可能成为瓶颈。

2.2 2 级 ALU 树(Figure 7d)​

┌─────────┐
输入 ──►│ ALU 1 │──┐
└─────────┘ │ ┌─────────┐
├──►│ ALU 3 │──► 输出
┌─────────┐ │ └─────────┘
输入 ──►│ ALU 2 │──┘
└─────────┘
  • 第一级 2 个 ALU,第二级 1 个 ALU;
  • 第一级的输出直接作为第二级的输入,不需要写回 RF;
  • 总共 3 个 ALU。

优势:减少 RF 访问,面积和关键路径平衡好。

2.3 3 级 ALU 树(Figure 7e)​

┌────┐ ┌────┐ ┌────┐ ┌────┐
输入 ──►│ALU │ │ALU │ │ALU │ │ALU │──┐
└────┘ └────┘ └────┘ └────┘ │
│ │ │ │
▼ ▼ ▼ │
┌────┐ ┌────┐ │
│ALU │ │ALU │────────────┤
└────┘ └────┘ │
│ │
▼ │
┌────┐ │
│ALU │───────────────┘
└────┘
  • 第一级 4 个,第二级 2 个,第三级 1 个;
  • 总共 7 个 ALU;
  • RF 访问最少,但 ALU 数量多,很多 ALU 在单单元格计算中空闲。

3. 为什么需要多级?​

核心原因是 减少寄存器文件(RF)访问。

在 DP 计算中,一个单元格需要多个操作,比如 BSW 的:

H(i,j) = max(0, H(i-1,j-1) + S, E(i,j), F(i,j))

这个公式包含:

  • 1 次加法;
  • 1 次取最大值(可能有多个输入)。

如果只有 1 个 ALU:

1. 读 H_diag, S → 加 → 写回 RF
2. 读 RF, 0, E, F → 取最大值 → 写回 RF

两次读写 RF。每一步都要访问寄存器,功耗和延迟都高。

如果有 2 级 ALU 树:

1. 读 H_diag, S → ALU1 加
读 E, F → ALU2 取最大值
2. ALU1 和 ALU2 的输出 → ALU3 取最大值 → 写回 RF

只需一次 RF 访问,中间结果在 ALU 树内部传递。


4. 论文的对比数据(Table 2)​

论文比较了三种方案在四个 kernel 上的表现:

Kernel级别RF 访问次数CU 利用率
BSW120100%
21160.6%
31028.6%
PairHMM13296.9%
21664.6%
31140.3%
POA15685.7%
25628.5%
35412.7%
Chain12495.8%
22038.3%
32016.4%

结论:

  • 3 级虽然 RF 访问略少,但 ALU 利用率大幅下降(大量 ALU 空闲);
  • 2 级在 RF 访问减少和 ALU 利用率之间取得最佳平衡;
  • 因此论文选择 2 级 ALU reduction tree。

5. 乘法模块为什么独立?​

论文说:

Since multiplication increases the length of the CU critical path, we design it as a separate unit from the ALU reduction tree.

意思是:

  • 乘法器延迟比加法/取最大值长;
  • 如果放在 ALU 树中,会拉长整个 CU 的关键路径,降低时钟频率;
  • 所以把乘法器独立出来,与 ALU 树并行或分时工作。

6. 应用场景​

多级 ALU 阵列不仅用于 GenDP,在很多领域都有应用:

6.1 动态规划加速器​

  • GenDP:BSW、PairHMM、POA、Chain 的目标函数;
  • 其他 DP 加速器:如 DTW、Bellman-Ford 的硬件实现。

6.2 机器学习加速器​

  • TPU:矩阵乘法用脉动阵列 + 归约树;
  • NPU:卷积、池化等操作需要多级归约;
  • GPU:warp 内归约(reduction)用多级 ALU 树。

6.3 信号处理​

  • FFT:蝶形运算天然是多级结构;
  • FIR/IIR 滤波器:乘积累加需要归约树;
  • 音频/图像处理:卷积、池化等。

6.4 编译器与硬件综合​

  • HLS(High-Level Synthesis):把 DFG 映射到多级 ALU 树;
  • 指令调度:把无依赖的操作并行映射到多级 ALU。

6.5 通用处理器​

  • SIMD 单元:多个 ALU 并行;
  • 超标量处理器:多个执行单元并行;
  • VLIW 处理器:一条指令包含多个 ALU 操作。

7. 形象比喻​

把多级 ALU 阵列想象成一个厨房:

  • 1 级:只有一个灶台,每做一步菜都要把半成品端回冰箱(RF),下次再拿出来;
  • 2 级:有三个灶台,第一级两个同时备料,第二级一个汇总。半成品直接在灶台间传递,不用频繁跑冰箱;
  • 3 级:有七个灶台,但菜谱只需要两步,很多灶台闲着。

因此,2 级是“够用且高效”的选择。


8. 一句话总结​

Multi-level ALU array 是把多个 ALU 组织成层级归约树的计算单元结构。
它的核心目的是减少寄存器文件访问,让中间结果在 ALU 之间直接传递。GenDP 选择 2 级 ALU 树(3 个 ALU),在 RF 访问、面积和利用率之间取得最佳平衡。这种结构广泛应用于 DP 加速器、机器学习加速器、信号处理、HLS 和通用处理器中。