1. NX-CGRA架构设计解析
NX-CGRA采用了一种创新的异构计算架构设计,专门针对边缘设备上的Transformer推理任务进行了优化。其核心思想是通过粗粒度可重构阵列(CGRA)实现硬件资源的动态配置,在保持高效能计算的同时提供足够的编程灵活性。
1.1 阵列拓扑与执行模型
NX-CGRA的计算核心采用4×6的二维异构阵列布局,其中包含16个处理单元(PE)和8个内存操作块(MOB)。这种设计通过switchless mesh torus互连网络连接各个单元,实现了高效的数据通信。与传统的SIMD架构不同,NX-CGRA采用了MIMD(多指令多数据)执行模型,每个核心可以独立执行自己的微码指令。
这种设计特别适合Transformer模型中常见的非均匀计算图。例如,在处理自注意力机制时,QKV矩阵乘法、softmax和注意力权重相乘这三个阶段可以分别映射到不同的PE上并行执行,而MOB则负责中间结果的存储和传输。
1.2 异构处理单元设计
NX-CGRA的创新之处在于其异构处理单元设计:
处理单元(PE)特点:
- 支持多精度整数运算(8/16/32位)
- 包含专用MAC单元(4个8位融合乘加)
- 三个专用寄存器文件(微码指令RF、内联常量RF、临时值RF)
- 时钟门控和核心睡眠单元实现动态功耗管理
内存操作块(MOB)特点:
- 专用Load-Store单元(LSU)
- 地址生成单元(AGU)
- 支持OBI协议的内存接口
- 与PE相同的控制流指令支持
这种异构设计实现了计算与数据移动的明确分离。在实际运行中,MOB可以预取数据到PE的本地寄存器,同时PE执行计算任务,有效隐藏内存访问延迟。测试数据显示,这种设计在MobileBERT模型上实现了高达92.23%的PE利用率。
2. 关键技术创新点
2.1 软件定义的数据流架构
NX-CGRA采用了一种创新的数据流执行模式,编译器在编译时静态调度数据移动路径。这种方式带来了几个显著优势:
数据局部性优化:编译器可以分析变量的生命周期,将频繁访问的数据保留在PE寄存器中。例如,在计算注意力分数时,Q矩阵可以保持在源PE的寄存器中,而K矩阵通过互连网络广播。
无冲突路由:通过静态调度避免了运行时仲裁开销,实测显示这种设计比动态网络节省约23%的功耗。
确定性执行:消除了内存访问不确定性带来的性能波动,这对实时边缘应用至关重要。
2.2 多精度计算支持
Transformer模型的不同层对计算精度有不同需求。NX-CGRA的PE支持从8位到32位的多种精度:
- 8位:用于大多数矩阵乘法操作
- 16位:用于部分累积操作
- 32位:用于层归一化和softmax中的高精度计算
这种灵活性使得NX-CGRA在TinyViT模型上实现了比固定精度加速器高1.8倍的能效比。特别值得注意的是其8位MAC阵列设计,四个MAC单元可以独立工作,也可以组合执行更大的矩阵块。
2.3 内存子系统优化
NX-CGRA集成了专门优化的内存子系统:
分布式上下文存储:4KB的上下文内存分布在各个PE和MOB中,支持快速配置切换。
256KB共享L1缓存:采用8个32KB的交叉存储体设计,匹配8个MOB的并行访问能力。
零拷贝数据交换:通过地址重映射实现PE与主机CPU之间的直接数据共享。
在Whisper Tiny模型上的测试表明,这种内存架构将数据移动能耗降低了37%,这对于内存密集型的自注意力计算尤为关键。
3. 编译器工具链设计
3.1 编译流程概述
NX-CGRA的编译器工具链基于LLVM框架构建,主要处理阶段包括:
- 前端处理:将模型描述转换为LLVM IR
- 数据流图生成:识别并行模式和算子融合机会
- 静态调度:分配计算资源,规划数据路由
- 微码生成:为每个PE/MOB生成优化后的指令序列
3.2 关键优化技术
编译器实现了多项针对Transformer模型的优化:
算子融合:将相邻的线性层和激活函数(如GEMM+GELU)合并为单一内核,减少中间数据存储。在DistilBERT上,这种优化带来了15%的性能提升。
稀疏模式利用:识别注意力矩阵中的稀疏模式,生成跳过零值计算的指令序列。与密集计算相比,稀疏执行可节省高达40%的能耗。
流水线编排:重叠MOB的数据搬运和PE的计算操作。基准测试显示,这种优化使硬件利用率提高了28%。
4. 性能评估与对比
4.1 实验设置
评估平台基于22nm FD-SOI工艺实现,工作频率200MHz,电压0.8V。测试套件包含从实际边缘Transformer模型提取的六类核心算法:
- 二维卷积(代表视觉Transformer的patch嵌入)
- 通用矩阵乘法(自注意力核心)
- GELU激活函数
- 层归一化
- 量化操作
- Softmax函数
4.2 能效表现
NX-CGRA在不同类型算子上的能效表现:
| 算子类型 | GOPS/mm² | TOPS/W | 面积占比 |
|---|---|---|---|
| GEMM | 17.08 | 2.01 | 45-70% |
| Conv2D | 10.68 | 1.28 | 25-65% |
| Softmax | 6.19 | 0.68 | 3-5% |
| GELU | 3.57 | 0.39 | ~5% |
特别值得注意的是其在GEMM运算上的表现,达到11.29 TOPS/W/mm²的能效密度,比同类方案如OpenGEMM(7.55)和Gemmini(0.68)有显著优势。
4.3 与SOTA对比
与专用加速器相比,NX-CGRA展现了出色的平衡性:
线性运算对比(SIGMA/Gemmini等):
- 面积效率高16.6倍
- 能效密度高3.2倍
- 支持更广泛的算子类型
非线性运算对比(SpAtten/SoftAct等):
- 面积效率相当
- 编程灵活性显著提升
- 支持端到端模型执行
这种平衡性使得NX-CGRA在完整的Transformer模型推理中表现出色。例如,在TinyBERT上,NX-CGRA实现了端到端1.8ms的延迟,功耗仅1.51mW,显著优于分离式加速方案。
5. 实际应用考量
5.1 部署工作流程
在实际边缘设备上部署NX-CGRA的工作流程:
- 模型准备:使用标准框架(PyTorch/TensorFlow)训练模型
- 图优化:应用标准优化(剪枝、量化)
- NX编译:将模型转换为NX-CGRA可执行格式
- 硬件配置:通过APB接口加载配置上下文
- 执行监控:利用EoE(执行结束)管理单元控制流程
5.2 资源权衡建议
基于不同边缘场景的配置建议:
- 超低功耗场景:关闭部分PE,降低电压至0.65V
- 高吞吐场景:启用所有PE,提高时钟至250MHz
- 混合精度模式:对敏感层使用16位,其余使用8位
- 内存受限场景:增加MOB比例,优化数据复用
5.3 典型性能数据
在实际模型上的表现:
| 模型 | 精度 | 延迟(ms) | 功耗(mW) | 能效(TOPS/W) |
|---|---|---|---|---|
| TinyViT | int8 | 2.1 | 1.62 | 1.87 |
| MobileBERT | int8 | 1.9 | 1.58 | 1.92 |
| Whisper Tiny | int16 | 3.5 | 1.71 | 1.45 |
这些数据表明NX-CGRA非常适合边缘设备上常见的紧凑型Transformer模型。