数据流架构是低功耗AI芯片设计的核心,它决定了数据在计算单元间的移动方式和计算的并行度。本章深入探讨脉动阵列、空间计算等经典数据流架构,分析数据重用策略对功耗的影响,并介绍片上网络设计的关键技术。通过Google TPU等工业案例,读者将理解如何设计高能效的数据流架构,实现计算与数据传输的最优平衡。
脉动阵列(Systolic Array)是一种规则的处理单元阵列,数据像心脏泵血一样有节奏地在阵列中流动。每个处理单元(PE)执行简单的操作,并将结果传递给相邻单元,实现高度并行的计算。
脉动阵列的核心思想是通过规则的数据流动模式最大化数据重用,减少对外部存储器的访问。其主要优势包括:
以矩阵乘法 $C = A \times B$ 为例,其中 $A$ 是 $M \times K$ 矩阵,$B$ 是 $K \times N$ 矩阵。输出固定(Output Stationary)脉动阵列的工作原理如下:
b₀₀ b₀₁ b₀₂
↓ ↓ ↓
┌────┬────┬────┐
a₀₀→│PE₀₀│PE₀₁│PE₀₂│
├────┼────┼────┤
a₁₀→│PE₁₀│PE₁₁│PE₁₂│
├────┼────┼────┤
a₂₀→│PE₂₀│PE₂₁│PE₂₂│
└────┴────┴────┘
每个PE执行乘累加操作: \(c_{ij} = \sum_{k=0}^{K-1} a_{ik} \cdot b_{kj}\)
数据流动遵循以下规则:
脉动阵列的总功耗可以分解为:
\[P_{total} = P_{compute} + P_{local} + P_{global}\]其中:
对于 $N \times N$ 的脉动阵列执行 $M \times K \times N$ 的矩阵乘法:
\[P_{compute} = N^2 \cdot E_{MAC} \cdot f\]其中 $E_{MAC}$ 是单次乘累加能耗,$f$ 是工作频率。
数据传输功耗取决于数据重用度: \(P_{local} = 2N^2 \cdot E_{wire} \cdot f\) \(P_{global} = \frac{MKN}{N^2} \cdot E_{mem} \cdot f\)
根据数据流动和固定模式,脉动阵列可分为:
为支持不同规模的计算,脉动阵列需要考虑:
时间复用:当矩阵维度超过阵列大小时,通过分块计算:
对于 M×K×N 的矩阵乘法,阵列大小为 P×P:
- 时间步数:⌈M/P⌉ × ⌈K/P⌉ × ⌈N/P⌉
- 利用率:min(M,P) × min(N,P) / P²
空间分割:将大阵列分割为多个小阵列并行计算,需要考虑:
空间计算架构将计算映射到物理空间上的处理单元,每个单元执行特定操作,数据在单元间流动完成整体计算。与时间复用的处理器不同,空间架构通过并行化和专用化实现高能效。
空间计算的核心原则:
CGRA是空间计算的典型代表,由可编程处理单元(PE)和可配置互连网络组成:
┌────┐ ┌────┐ ┌────┐
│ PE │──│ PE │──│ PE │
└──┬─┘ └──┬─┘ └──┬─┘
│ │ │
┌──┴─┐ ┌──┴─┐ ┌──┴─┐
│ PE │──│ PE │──│ PE │
└──┬─┘ └──┬─┘ └──┬─┘
│ │ │
┌──┴─┐ ┌──┴─┐ ┌──┴─┐
│ PE │──│ PE │──│ PE │
└────┘ └────┘ └────┘
每个PE包含:
功耗优化策略:
将神经网络映射到空间架构需要解决:
1. 图分割问题 将大的计算图分割为可映射到硬件的子图:
最小化目标函数:
E = α·Ecomp + β·Ecomm + γ·Emem
Ecomp:计算能耗
Ecomm:通信能耗
Emem:存储访问能耗
2. 调度优化 确定操作在PE上的执行顺序:
3. 布局布线 将操作映射到具体PE,确定数据路由:
现代AI芯片采用多级空间架构:
芯片级
├── Cluster级(多个Core)
│ ├── Core级(多个PE阵列)
│ │ ├── PE阵列(脉动阵列/CGRA)
│ │ └── 本地存储(L1 Cache)
│ └── 共享存储(L2 Cache)
└── 全局存储(L3 Cache/HBM)
各层次的功耗特性:
支持运行时重配置以适应不同工作负载:
部分重配置
上下文切换
自适应映射 根据运行时特征动态调整:
if (sparsity > threshold):
use_sparse_dataflow()
else:
use_dense_dataflow()
数据移动是AI芯片功耗的主要来源,优化数据重用和缓存层次设计对降低功耗至关重要。本节分析不同的数据重用模式及其对缓存设计的影响。
神经网络计算中存在三种数据重用:
1. 权重重用(Weight Reuse)
2. 输入重用(Input Reuse)
3. 部分和重用(Partial Sum Reuse)
通过调整循环顺序最大化数据局部性:
// 原始循环顺序
for(n=0; n<N; n++) // batch
for(k=0; k<K; k++) // output channel
for(h=0; h<H; h++) // height
for(w=0; w<W; w++) // width
for(c=0; c<C; c++) // input channel
for(r=0; r<R; r++) // kernel height
for(s=0; s<S; s++) // kernel width
out[n][k][h][w] +=
in[n][c][h+r][w+s] * weight[k][c][r][s];
不同循环顺序的功耗影响:
典型的三级缓存架构:
寄存器文件 (RF)
├── 容量:1-4 KB
├── 访问能耗:~1 pJ
└── 带宽:>1 TB/s
L1缓存 (私有)
├── 容量:16-64 KB
├── 访问能耗:~10 pJ
└── 带宽:100-500 GB/s
L2缓存 (共享)
├── 容量:256 KB-2 MB
├── 访问能耗:~50 pJ
└── 带宽:50-200 GB/s
片外DRAM
├── 容量:GB级
├── 访问能耗:~1000 pJ
└── 带宽:10-100 GB/s
循环分块(Loop Tiling) 将大循环分解为嵌套的小循环:
for(ko=0; ko<K; ko+=Kt) // outer loop
for(ho=0; ho<H; ho+=Ht)
for(ki=ko; ki<min(ko+Kt,K); ki++) // inner loop
for(hi=ho; hi<min(ho+Ht,H); hi++)
// computation
分块大小优化: \(Kt \times Ht \times Wt \leq L1\_size\)
双缓冲(Double Buffering) 隐藏数据传输延迟:
Buffer A: 计算当前块
Buffer B: 预取下一块
每次迭代交换A和B
功耗收益:
动态缓存分区 根据工作负载调整缓存分配:
if (layer_type == CONV):
allocate_more_for_weights()
elif (layer_type == FC):
allocate_more_for_activations()
旁路机制 跳过缓存直接访问下一级:
压缩缓存 在缓存中存储压缩数据:
片上网络(NoC)是连接多个处理核心和存储单元的通信基础设施。高效的NoC设计对于降低数据传输功耗和提高系统性能至关重要。
1. 网格(Mesh)拓扑
┌─┬─┬─┬─┐
├─┼─┼─┼─┤
├─┼─┼─┼─┤
└─┴─┴─┴─┘
2. 环形(Ring)拓扑
○──○──○──○
│ │
○──○──○──○
3. 树形(Tree)拓扑
○
╱ ╲
○ ○
╱ ╲ ╱ ╲
○ ○ ○ ○
维序路由(Dimension-Order Routing)
路由功耗模型: \(E_{route} = E_{switch} \times hops + E_{link} \times distance\)
其中:
自适应路由 根据网络拥塞动态选择路径:
if (congestion[X_path] > threshold):
use_Y_first_routing()
else:
use_X_first_routing()
虚拟通道(Virtual Channel)
信用流控(Credit-Based Flow Control)
发送方维护信用计数器
接收方返回信用
无信用时停止发送
功耗优化:
1. 动态电压频率调节(DVFS)
低负载:降低电压和频率
高负载:提高性能
功耗节省:30-50%
2. 电源门控
3. 数据编码 减少链路切换活动:
性能功耗评估指标:
延迟 = 头部延迟 + 序列化延迟 + 传输延迟
吞吐量 = 注入率 × 包大小
功耗效率 = 吞吐量 / 功耗
优化目标函数: \(minimize: α \cdot Latency + β \cdot Power + γ \cdot Area\)
约束条件:
Google TPUv4代表了脉动阵列在工业界的成功应用,其设计在功耗效率和计算性能之间达到了优秀的平衡。本节深入分析TPUv4的架构特点和功耗优化技术。
TPUv4采用双芯片封装,每个芯片包含:
关键规格:
峰值性能:275 TFLOPS (BF16)
内存带宽:1.2 TB/s
TDP:170W
能效:1.6 TFLOPS/W
TPUv4的MXU采用二维脉动阵列:
128 列
┌─────────────┐
1 │ ○ ○ ○ ... ○ │
2 │ ○ ○ ○ ... ○ │
128 │ ○ ○ ○ ... ○ │
行 │ : : : ... : │
│ ○ ○ ○ ... ○ │
└─────────────┘
○ = MAC单元(BF16/INT8)
数据流特点:
功耗优化策略:
TPUv4的存储层次:
HBM2e (32GB)
↓ 1.2 TB/s
L3 Unified Buffer (96MB)
↓ 4 TB/s
L2 Vector Memory (16MB×4)
↓ 16 TB/s
L1 Accumulator (4MB×4)
↓ 64 TB/s
MXU Registers
数据编排优化:
TPUv4引入结构化稀疏支持:
2:4稀疏模式
原始权重:[0.1, 0.8, 0.0, 0.3]
稀疏表示:[0.0, 0.8, 0.0, 0.3] + 索引[0,1,0,1]
功耗节省:
1. 编译器协同
2. 批处理优化
# 动态批大小调整
if latency_critical:
batch_size = 1 # 低延迟
else:
batch_size = 128 # 高吞吐
3. 多芯片并行
在典型工作负载下的功耗分布:
MXU计算: 45% (76.5W)
HBM访问: 25% (42.5W)
片上传输: 15% (25.5W)
控制逻辑: 10% (17W)
泄漏功耗: 5% (8.5W)
优化效果对比(相对于TPUv3):
可重构数据流架构通过动态调整计算和互连模式,适应不同的工作负载特征,实现更高的能效。本节探讨先进的CGRA优化技术。
动态数据流切换
根据层类型和数据特征选择最优数据流:
def select_dataflow(layer_config):
if layer_config.is_depthwise():
return "weight_stationary" # DW卷积权重少
elif layer_config.batch_size > 32:
return "output_stationary" # 大批次重用激活值
elif layer_config.has_residual():
return "row_stationary" # 残差连接优化
else:
return "hybrid_dataflow" # 混合模式
运行时重配置开销
配置切换的功耗模型: \(E_{reconfig} = N_{PE} \times (E_{context} + E_{route})\)
其中:
多粒度处理单元
Cluster级(粗粒度)
├── 矩阵运算单元(16×16 MAC)
├── 向量处理单元(SIMD)
└── 标量处理单元
Tile级(中粒度)
├── 4×4 MAC阵列
├── 本地存储器
└── 可编程互连
PE级(细粒度)
├── ALU
├── 寄存器文件
└── 路由器
不同粒度的功耗权衡:
静态分析与映射
编译时确定最优映射策略:
动态调度支持
运行时自适应调整:
// 硬件性能计数器
if (stall_cycles > threshold) {
trigger_rebalancing();
adjust_dataflow_pattern();
}
可变并行度
根据功耗预算动态调整:
高性能模式:所有PE激活,最大并行度
平衡模式: 75% PE激活,DVFS调节
低功耗模式:50% PE激活,激进电源门控
负载均衡机制
工作窃取(Work Stealing):
1. 近数据CGRA 将计算单元集成到存储器附近:
2. 异构CGRA 混合不同类型的PE:
3. 量子-经典混合CGRA 集成量子处理单元:
Roofline模型扩展
考虑可重构开销的性能上界: \(Performance = min(Peak\_Compute, BW \times Intensity - Reconfig\_Cost)\)
多目标优化
Pareto最优前沿:
目标:性能、功耗、面积、灵活性
约束:热设计功耗、延迟要求
方法:遗传算法、模拟退火
数据流架构是低功耗AI芯片设计的核心,本章系统介绍了从脉动阵列到可重构架构的关键技术:
核心概念:
关键公式:
设计要点:
习题7.1 设计一个4×4的输出固定(OS)脉动阵列,计算两个4×4矩阵的乘法。画出数据流动图,标注每个时钟周期各PE的输入和计算结果。
Hint:考虑数据延迟输入的时序安排,确保正确的乘累加对齐。
习题7.2 给定一个卷积层:输入32×32×64,卷积核3×3×64×128,stride=1,padding=1。计算在8×8脉动阵列上执行需要多少个时钟周期?假设采用权重固定模式。
Hint:计算总的MAC操作数,然后除以脉动阵列的计算能力。
习题7.3 比较三种数据流模式(WS、OS、RS)在执行批大小为1和批大小为128的全连接层时的数据重用率。假设权重矩阵为1024×1024。
Hint:分析每种模式下权重和激活值的读取次数。
习题7.4 设计一个自适应NoC路由算法,能够根据网络拥塞情况动态选择XY路由或YX路由。分析该算法的死锁避免机制和功耗开销。
Hint:考虑使用虚拟通道来避免死锁,评估额外的控制逻辑功耗。
习题7.5 给定功耗约束为10W,设计一个AI加速器的存储层次。要求支持ResNet-50推理,批大小为1,目标延迟<10ms。给出各级缓存的容量、带宽和功耗分配。
Hint:先分析ResNet-50的数据重用特征,然后根据roofline模型设计存储层次。
习题7.6 分析在CGRA上映射Transformer注意力机制的挑战。提出一种优化的映射策略,包括PE分配、数据流模式选择和存储管理。估算相比GPU的功耗优势。
Hint:注意力机制包含矩阵乘法、softmax和element-wise操作,需要考虑不同算子的特征。
习题7.7(开放性思考题)未来的数据流架构可能如何演进以支持大语言模型(LLM)的高效推理?考虑内存墙、稀疏性和动态性等挑战。
Hint:思考存内计算、近数据处理、动态稀疏等新技术的应用。