1. 项目概述:为什么我们需要粗粒度可重构处理器?
在嵌入式系统和移动计算领域,我们一直在性能、功耗和灵活性之间走钢丝。传统的路子无非两条:要么用专用集成电路(ASIC),性能强、功耗低,但一颗芯片只能干一件事,流片成本高,算法一升级就可能过时;要么用通用处理器(GPP)或数字信号处理器(DSP),编程灵活,但面对视频解码这类计算密集、数据并行的任务,往往力不从心,为了达到实时性能不得不拉高主频,功耗就上去了。
这时候,可重构计算(Reconfigurable Computing)就成了一条有吸引力的中间路径。它的核心思想是,硬件不再是“死”的,而是可以在运行时根据软件任务的需求,动态改变自身的结构和功能。你可以把它想象成一个乐高积木搭建的计算平台,基本的处理单元(PE)和连接它们的线路(互连网络)都是可编程的。当需要做运动补偿(MC)时,我就把积木搭成一个并行度很高的矩阵乘法器;下一秒需要做反离散余弦变换(IDCT)了,我又可以快速把积木重新排列成一个适合蝶形运算的结构。
粗粒度可重构阵列(CGRA)是这个领域的主流。与FPGA那种比特级(细粒度)的可编程不同,CGRA的处理单元通常是16位或32位的算术逻辑单元(ALU),粒度更粗。这意味着它的配置信息量更小,配置速度更快,更适合应对视频解码这种需要频繁在不同计算内核间切换的场景。然而,早期的CGRA设计往往过于追求峰值性能,忽视了配置开销带来的巨大能量损耗。你想想,一个包含上百个PE的大阵列,每切换一次任务就要重新灌入成千上万的配置比特,这个过程中数据搬移和寄存器翻转消耗的能量,有时甚至能赶上计算本身。这成了制约CGRA在能量敏感的移动设备上广泛应用的一个关键瓶颈。
我们团队当时接到的任务,就是设计一个面向多标准视频解码的粗粒度可重构处理单元(RPU),核心目标就俩字:能效。不仅要跑得快,更要在有限的功耗预算下跑得久。最终流片的芯片,一个高性能版本(REMUS_HPP)在200MHz下能解码1080p@30fps的H.264视频,功耗仅280mW;另一个低功耗版本(REMUS_LPP)在75MHz下实现同样帧率,功耗更是低至24.5mW。这背后是一系列从架构到电路级别的协同设计,而不仅仅是工艺进步的功劳。
1.1 核心需求解析:视频解码的计算特征与挑战
要设计一个高效的加速器,首先得把负载吃透。视频解码流程虽然标准各异(H.264, MPEG-2, AVS等),但核心步骤大同小异:熵解码、反量化(IQ)、反变换(IDCT)、运动补偿(MC)/帧内预测、重建、去块滤波(Deblocking)。我们对一个典型的H.264解码任务在通用处理器上做了剖析,发现超过75%的计算量都集中在MC、Deblocking和IDCT/IQ这几个模块。它们有一个共同特点:面向块(Block)或宏块(Macroblock)的规则数据并行计算。
以运动补偿为例,为了预测当前块,需要从参考帧中取出一个或多个候选块进行加权求和。这个操作本质上是对内存中一片连续的图像数据做大量的乘加运算(SAD, SATD等),数据依赖关系简单,非常适合在PE阵列上展开并行。去块滤波虽然逻辑稍复杂,涉及边界判断和滤波强度选择,但其核心操作仍然是针对像素行/列的加减、比较和饱和运算,具有很高的数据局部性和并行潜力。
这就为我们指明了设计方向:RPU的架构必须高效支持这种规则的数据并行、以乘加为核心的算术运算、以及频繁的局部数据交换。同时,视频解码是流水线作业,不同模块(如MC和Deblocking)理论上可以并行执行以提升吞吐率。因此,架构还需要具备一定的任务级并行能力。
另一个容易被忽视但至关重要的挑战是配置效率。视频解码过程中,算法内核切换频繁。例如,处理完一个宏块的MC,紧接着就要处理其IDCT,然后可能是Deblocking。如果每次切换都需要数百甚至上千个周期来重新配置整个PE阵列,那么宝贵的计算资源将大量时间浪费在“等待”上,有效吞吐率大打折扣,能效比自然难看。因此,如何减少配置信息量、加速配置过程,成为提升整体能效的关键。
2. 架构核心设计:如何打造一个高能效的RPU?
基于上述分析,我们提出了RPU的整体架构。它不是一个孤立的计算阵列,而是一个包含完整数据通路和配置通路的协处理器。其核心思想是将计算密集部分卸载到可重构阵列上,而控制密集、不规则的部分(如熵解码、码流解析)仍由主控处理器(如ARM)处理。RPU的架构框图清晰地划分了这两条路径。
2.1 数据通路:异构PE阵列与创新的互连网络
数据通路的核心是一个可重构处理单元阵列(PEA)。我们并没有采用常见的同构大规模阵列,而是基于视频解码的算子特征,设计了一个异构阵列。
2.1.1 处理单元(PE)的精细化设计每个PE的核心是一个16位算术逻辑单元(ALU),支持26种操作,包括加、减、逻辑运算、移位、比较、饱和、绝对值等。关键洞察来自于对H.264/MPEG-2/AVS解码代码的静态和动态分析:乘法及相关操作(如乘加)的出现概率总和不到7%。在视频解码中,乘法主要用于运动补偿中的像素插值(涉及滤波系数)以及变换中的少量系数乘法,大部分计算是加、减、比较和饱和操作。
因此,我们做了一个大胆的优化:并非所有PE都配备硬件乘法器。在由4个RCAs(可重构单元阵列)组成的PEA中,只有位于第二行的PE集成了16x16定点乘法器。这样,整个芯片的乘法器数量从256个减少到32个。你可能担心这会影响性能,但由于乘法操作本身占比低,且可以通过编译调度将乘法任务集中映射到这些“富资源”PE上,实际性能损失微乎其微。但带来的收益是巨大的:PE的总面积减少了约80%。在芯片设计里,面积就是成本,也是静态功耗的主要来源之一。
此外,PE的配置寄存器设计也考虑了功耗。我们使用5位固定长度的操作码(OPCODE)。通过分析大量解码任务的配置序列,我们优化了OPCODE的编码,使得在典型任务切换时,配置比特的跳变(0->1或1->0)概率最小化且分布均匀。这直接降低了配置网络上的动态功耗。
2.1.2 线交换网格互连(LSMC):在灵活性与面积间取得平衡PE之间的互连网络是CGRA面积和延迟的大头。传统的全互连(Full Mesh)虽然灵活,但每个PE都要与所有I/O端口相连,随着阵列规模增大,连线数量和开关数量呈平方级增长,导致布线拥塞、面积膨胀、功耗激增。
我们提出了线交换网格互连(Line-Switched Mesh Connect, LSMC)。其核心思想是化“全连接”为“线连接”。具体来说,我们将一个RCA内的8x8 PE组织成8行。在任一时刻,只有特定的一行PE通过一个共享的I/O总线与外部256位宽的FIFO(二级FIFO)直接相连。PE行内的数据交换则通过一个高效的层内网格网络完成。当需要访问不同行的数据时,可以通过配置,动态切换哪一行PE连接到I/O总线。
这样做的好处非常明显:大幅减少了长距离、高扇出的全局连线。实际综合评估显示,在阵列规模较大时,LSMC的互连部分面积相比全互连方案可减少超过50%。有人可能会问,这会不会成���性能瓶颈?我们通过将MC、Deblocking、IDCT等核心内核映射到两种互连结构上进行周期精确仿真,发现LSMC带来的性能损失不超过5%。这是因为视频解码的数据访问模式具有很强的空间局部性,连续的数据块往往被映射到相邻的PE行上,LSMC结构完全能够满足其带宽需求。用面积换来的能效提升是极其划算的。
2.1.3 层次化存储结构:匹配数据流光有计算单元不够,还得喂得饱数据。RPU设计了多级缓冲存储结构来匹配PE阵列的吞吐率:
- 二级FIFO:每个RCA配有输入和输出二级FIFO(深度分别为32和4),宽度为256位(对应16个16位数据)。这用于缓冲从外部内存涌入的突发数据流,平滑访存延迟。
- 宏块缓冲区(Macro Buffer):一个128x16位的单端口内存,用于RCA之间的中间结果交换。例如,一个RCA处理完IDCT的结果,可以暂存于此,供另一个RCA进行运动补偿时读取。
- RCA内部内存(RIM):一个64x16位的双端口内存,用于单个RCA内部不同计算阶段之间的数据暂存,减少对外部存储的访问。
- 交换内存(EM):一个128x16位的双端口内存,作为两个RPU核心(在双核配置中)之间的共享数据交换区,采用乒乓缓冲机制,实现计算与数据搬运的重叠。
这种层次化的存储设计,确保了数据在计算单元周围高效流动,避免了因等待数据而导致的PE闲置,是提升硬件利用率和能效的关键。
2.2 配置通路:分层配置上下文(HCC)大幅削减配置开销
如果说数据通路是肌肉,那么配置通路就是神经。如何快速、低功耗地“告诉”硬件下一步要做什么,是CGRA设计的灵魂。
传统的CGRA配置模式可以看作“平铺式”:每个任务内核(Kernel)对应一个完整的、独立的配置比特流(Context)。切换任务时,需要将一整个新Context全部加载到PE的配置存储器中。这对于视频解码这种由众多小内核组成的应用来说,效率极低。
我们提出了分层配置上下文(Hierarchical Configuration Context, HCC)方案。它将配置信息抽象为三个层次:
- 核心上下文(Core Context):最底层,包含PE的ALU操作码、层内互连配置位、数据加载/存储命令。它定义了PE阵列在一个小计算步骤中的具体形态。
- 组上下文(Group Context):中间层,由一系列核心上下文的索引组成。它描述了一个稍大的、数据相关的计算序列。例如,一个宏块的运动补偿可能包含多个相似但数据不同的子块补偿操作,它们可以使用相同的PE阵列结构(核心上下文),只是数据不同。组上下文通过重复调用同一个核心上下文的索引,避免了重复存储和传输相同的配置信息。
- 完整上下文(Complete Context):最高层,由组上下文的索引和同步命令组成。它由主机处理器动态生成,描述了整个任务(如一帧的解码)流程。
HCC的优势在于极高的数据压缩率。对于H.264解码应用,采用HCC后,需要存储和传输的配置信息总量相比非分层方案减少了76%。这意味着配置缓存可以更小(节省面积和静态功耗),配置总线上的数据搬运量大幅减少(降低动态功耗),配置速度也更快。
硬件上,我们为RPU配备了专用的全局核心上下文内存(GCCM)和全局组上下文内存(GGCM)。主机处理器只需要下发轻量级的完整上下文,RPU内部的配置解析器会根据索引从GGCM和GCCM中取出实际的配置位流。实测表明,采用HCC后,配置时间在RPU总执行时间中的占比从传统架构(如XPP40)的24%以上,降低到了4%-13%。这意味着硬件资源有更多时间是在实实在在地做计算,能效自然得到显著提升。
2.3 阵列规模探索:多大的PEA才够用?
设计初期,一个关键问题是:PEA到底要做多大?不是越大越好,面积和功耗会线性增长。我们需要找到满足性能需求的最小规模。
我们的性能约束是:在200MHz下,能实时解码1080p视频(每秒30帧,每帧8160个宏块)。算下来,平均处理每个宏块的周期预算约为816个周期。我们以RCA的高度(H)固定为8(匹配最小计算块4x4),变化其宽度(W)从4到32,进行周期精确仿真。
仿真结果显示,去块滤波(Deblocking)是其中最耗时的子任务。当W=8时,四个RCA并行工作,处理一个宏块的所有子任务(Pred, IDCT, DeB)的总周期数开始低于816的预算。继续增大W,性能提升的边际效应递减,而面积开销却线性增加。当W从8增加到32时,PEA面积增长超过3倍。因此,8x8的RCA(四个组成一个PEA)被确定为最优解,在满足性能目标的同时,实现了硬件资源的最经济利用。
实操心得:架构探索中的权衡在芯片架构定义阶段,这种基于周期精确仿真和面积评估的探索至关重要。不能只盯着峰值性能。我们建立了快速的SystemC模型,将关键算法内核映射上去跑仿真,同时集成面积预估工具。这个过程中,要敢于做“非对称”的异构设计(如减少乘法器),也要善于利用应用的特征(如数据局部性)来简化互连。LSMC和HCC这两个核心创新,都源于对视频解码这一特定领域负载的深刻理解,而不是追求通用的、面面俱到的灵活性。在嵌入式领域,“够用就好”的设计哲学往往能带来最佳的能效比。
3. 从算法到硬件:映射流程与编译支持
再好的硬件,如果没有高效的编程工具链,也只是一堆硅沙。为了让算法工程师能利用RPU,我们开发了一套基于C语言的编译框架。
3.1 编译流程概述
整个流程是源到源的:
- 前端处理:使用修改版的SUIF2和Mach-SUIF工具链对标准C代码进行解析和优化。编译器会识别出其中计算密集的循环嵌套(通常是视频解码的内核),将其提取为数据流图(DFG)。剩余的控制密集型代码则被标注并保留为C代码,由主控处理器执行。
- 循环变换与映射:这是最关键的一步。我们建立了一个基于多面体模型(Polyhedral Model)的总执行时间(TET)分析模型。这个模型同时考虑了配置开销、数据通信开销和计算开销。传统的映射工具往往只优化计算,忽略了CGRA中巨大的配置成本。我们的工具PolyMAP将循环嵌套的映射问题转化为一个约束优化问题,通过启发式算法搜索最优的循环变换(如循环分块、展开、交换)方案,在三种开销间取得最佳平衡。测试表明,相比当时先进的EPIMap和PolyCOM方法,PolyMAP在PolyBench测试集和H.264内核上平均能带来22%到32%的性能提升。
- 后端处理与代码生成:优化后的DFG通过一个改进的、基于模板的子图同构映射方案,映射到具体的PE阵列结构上。这个阶段会充分利用HCC的特性,识别出重复的计算模式,生成共享的核心上下文,进一步压缩配置信息量,最终生成可供RPU加载执行的配置流。
3.2 映射效果:以H.264解码内核为例
我们将H.264解码中最关键的三个内核——IDCT、运动补偿(MC)和去块滤波(Deblocking)——映射到RPU上,并与商业可重构处理器XPP40进行对���。
| 算法内核 | 性能指标 | XPP40 (最坏情况) | RPU (典型情况) | RPU (最坏情况) |
|---|---|---|---|---|
| IDCT | 周期/宏块 | 120 | 85 | 102 |
| MC | 周期/宏块 | 180 | 132 | 158 |
| Deblocking | 周期/宏块 | 480 | 305 | 366 |
从上表可以看出,RPU在各个内核上的性能均优于XPP40。这得益于更高效的PE架构、LSMC互连带来的高数据带宽,以及HCC大幅减少的配置时间。特别是在最耗时的Deblocking滤波上,RPU的优化最为明显。
注意事项:映射的局限性我们的编译器和架构并非万能。对于控制密集型、含有大量不规则分支和回溯的算法(如N皇后问题),其数据流图难以高效映射到规则的PE阵列上,强行映射会导致配置频繁切换和存储开销激增,性能甚至可能不如通用处理器。RPU的强项在于规则数据并行和流式处理。因此,在系统划分时,必须由工程师或高级编译器判断,将合适的任务卸载到RPU,其余部分留在主控CPU。
4. 芯片实现、测试与全面评估
设计最终要落在硅上。我们采用TSMC 65nm LP工艺,实现了三款芯片来验证RPU。
4.1 芯片系列与系统集成
- CHAMELEON:这是一个纯RPU核心的原型验证芯片,用于大量算法映射和性能 profiling。
- RHINOCEROS (SoC):这是一个面向高性能应用的系统级芯片。它集成了两个RPU核心(构成REMUS_HPP处理器)、一个RPU微控制器(RMC)、一个主控微控制器(MMC)、DMA、视频预处理单元(VPP,负责熵解码等比特级操作)以及丰富的外设。双RPU设计允许并行处理MC和Deblocking,进一步提升吞吐率。
- REINDEER (SoC):这是一个面向低功耗便携设备的SoC。它集成了单RPU核心(REMUS_LPP处理器)和必要的外设,主打高能效。
4.2 性能与能效评估:视频解码
我们在真实芯片上测试了多标准视频解码性能:
高性能版本 (REMUS_HPP @ 200MHz):
- H.264 HP@1080p:稳定30 fps,功耗280mW。
- 对比XPP-III:性能提升25%,能效(MB/s/mW)提升高达14倍。
- 对比一款专用多格式视频编解码ASIC:解码性能相当,但能效约为其一半。这符合预期,ASIC在专用任务上的能效通常优于可重构架构,但RPU赢得了灵活性。
- 对比一款众核处理器:性能相近,但能效是其两倍。
低功耗版本 (REMUS_LPP @ 75MHz):
- H.264 BP@720p:稳定35 fps,功耗仅24.5mW。
- 对比ADRES可重构处理器:功耗降低76%,能效提升3.8倍。
- 对比一款DSP芯片:解码速度快16%,能效优势巨大。
这些数据充分验证了RPU架构在能效上的显著优势。其高性能并非来自疯狂的频率提升,而是源于架构创新(LSMC, HCC)与领域定制化设计(异构PE,层次化存储)的协同作用。
4.3 灵活性验证:超越视频解码
为了证明RPU并非视频专用加速器,我们将其应用于更广泛的领域:
通用计算内核:选取了涵盖计算密集(如GEMM矩阵乘、SPMV稀疏矩阵乘、FFT)、控制密集(如Floyd-Warshall)、带宽受限(如BFS广度优先搜索)等类型的13个经典算法内核进行测试。与Intel Atom 230和ARM Cortex-A8处理器对比,在计算密集型内核上,RPU获得了数倍到数十倍的加速;在控制密集型内核上,凭借HCC减少配置开销,也能获得可接受的性能。而整个REMUS_HPP在运行这些内核时功耗约100mW,远低于Atom的4W和Cortex-A8的300mW。
数据加密:实现了AES和DES算法。通过将算法核心轮函数展开并流水线化映射到PE阵列,实现了高吞吐率。与当时先进的众核处理器和FPGA方案相比,RPU在达到相近吞吐率的同时,能效高出1-2个数量级。
GPS基带处理:将捕获(Acquisition)和相关性计算(Correlation)等计算密集型任务映射到RPU,跟踪环路和定位解算由主控处理器完成。最终芯片可同时捕获跟踪9颗卫星,功耗仅23.75mW,定位精度1.24米,完全满足便携设备需求。
这些实验表明,RPU的架构对于一类具有规则数据流、可并行化、计算密集特征的算法具有普适的高能效加速能力。
5. 常见问题与设计反思
在实际流片和测试过程中,我们也遇到并解决了一系列问题,这里分享一些核心的经验和思考。
问题一:如何确定PE阵列的最佳规模?是不是PE越多越好?绝对不是。PE数量增加会线性增加面积、功耗和布线复杂度。我们的方法是以应用需求为锚点。通过周期精确仿真,找到满足目标性能(如1080p@30fps)的最小阵列规模。仿真时要考虑最坏情况(如高速运动场景),并留有一定余量。此外,异构化是控制面积的有效手段。分析目标应用的算子频率分布,对低频但面积大的算子(如乘法器)进行资源复用。
问题二:LSMC互连会不会成为数据交换的瓶颈?这取决于应用的数据访问模式。我们通过分析视频解码的典型数据流发现,其具有强烈的空间局部性。LSMC的“线交换”机制恰好匹配了这种按行/列访问数据块的特征。对于需要完全随机访问所有PE的应用,LSMC可能不是最优选择。因此,互连网络的设计必须与目标领域耦合。通用、全连接的互连固然灵活,但代价巨大。我们的经验是,牺牲一点通用性,换取面积和能效的巨大收益,在嵌入式领域是值得的。
问题三:HCC方案是否增加了编程和编译的复杂性?确实增加了一层抽象。程序员或编译器需要将算法识别并组织成“核心上下文-组上下文-完整上下文”的层次。但这部分工作可以通过自动化工具链完成。我们开发的编译器前端和PolyMAP工具能够自动进行循环变换、内核识别和上下文生成。对于程序员来说,他们仍然主要编写标准的C代码,只是需要添加一些编译指导语句(如#pragma)来标识可并行循环。工具链的成熟度是可重构计算能否落地的关键。
问题四:在真实系统中,RPU与主处理器如何高效协同?这是一个系统级问题。在我们的SoC设计中,RPU作为协处理器,通过高带宽、低延迟的接口(如AXI总线)与主控CPU和共享内存相连。关键点在于:
- 任务划分清晰:将规则并行部分(MC, IDCT, Deblocking)卸载给RPU,不规则控制部分(熵解码、码流解析、帧管理)留给CPU。
- 数据搬运优化:利用DMA在RPU的本地缓冲(如EM)和系统主存之间搬运数据,与RPU计算重叠进行。
- 配置预取与缓存:利用HCC的层次性,主机可以提前将组上下文和核心上下文加载到RPU的GGCM/GCCM中,运行时只需发送轻量级的完整上下文指令流,极大减少了实时配置延迟。
问题五:这套架构对未来更复杂的编解码标准(如HEVC/VVC)是否依然有效?从计算模式上看,HEVC虽然计算量激增,但其核心算法(运动补偿、帧内预测、变换量化)的本质仍是块级的规则并行计算,与H.264一脉相承。因此,RPU的PE阵列和互连结构仍然适用。挑战可能在于:
- 更大的配置上下文:HEVC的预测单元和变换单元尺寸更多样,可能导致配置模式增加。这可以通过扩展HCC的组上下文层次,或增加核心上下文存储容量来解决。
- 更高的数据带宽需求:HEVC支持更大的预测块和更多的参考帧,需要更大的片上缓冲和更高的内存带宽。这可以通过优化存储层次(如增大RIM、EM容量)和使用更宽的内存接口来应对。
- 更复杂的控制:虽然计算主体仍适合RPU,但控制逻辑的复杂度增加,需要主控CPU承担更多调度工作。
总的来说,RPU的架构理念——针对领域特征设计异构可重构计算单元,并通过创新的互连和配置管理来最大化能效——具有很好的前瞻性和可扩展性。它不仅成功应用于多标准视频解码,也为其他计算密集型嵌入式应用(如视觉处理、无线通信基带)提供了一种高能效的硬件加速方案。最终的芯片数据告诉我们,在追求极致能效的路上,精妙的架构设计远比单纯依靠先进工艺更有潜力。