DSAGEN:综合性可编程的空间加速器

摘要

第一点研究背景:Domain-specific 硬件加速器笔通用加速器效率高,速度快。但理想的加速器生成框架应该是可自动化的。
第二点研究方向:加速器可以通过通过调度硬件搜索空间中的硬件原语来生成。

硬件原语(hardware primitive)的理解:硬件加速器中常用的电路单元。

引言:

三种开发和使用加速器的基本策略:
自动设计(HLS):例如通过C语言自定义硬件。设计空间有限,且不可编程。
特定域:为不同的领域自定义硬件电路。
一般(CPU,GPU):具有灵活的编程接口
问题:需要灵活性但是硬件设计和软件设计价格昂贵
理想的解决方法:由HLS提供自动化水平,并能够在特定域进行专门化,并有统一的编程接口。

结合三种方法优点

可能的解决方法:由所需目标程序的集合中存在的计算和存储器模式引导,在灵活的架构设计空间内搜索。–解耦的空间加速器

上述架构的优点:1、高效 2、领域专门化 3、可以将解耦合的空间原语进行灵活的组合

本文工作:开发出这个框架。输入一个定义功能,可以作为通用性代理的内核(C语言),输出:1、针对输入领域的综合硬件加速器;2、由定制的硬件、软件接口;3、一个针对给定设计的编译器。

在这里插入图片描述
编译器首先将每个输入内核转换成解耦的数据流表示;利用不同的变换集合来创建每个内核的几个不同版本,每个版本针对特定的体系结构特征。然后,硬件映射器将程序分发到硬件资源,并评估效率度量(例如,性能×功率×面积)。选择编译程序的最佳法律的版本。在设计空间探索(DSE)期间,硬件映射的历史被用于修改ADG以提高效率,并且这重复直到收敛。

问题和方法:
足够的设计空间:1、在指令集架构上进行特征选择是有价值的;2、允许不同组件的不规则连接是有价值的
模块化特征的编译:因为每个特性都需要不同的转换。我们的方法是开发一组针对各种硬件功能的转换,并考虑这些映射到硬件的多种组合(消除那些不需要给定的ADG)。
智能设计空间探索:在设计空间探索的每一步都需要决定如何映射ADG到硬件上更加高效。考虑到巨大的设计空间和空间体系结构编译器的缓慢特性。解决方式:1、利用应用感知性能、面积和功率模型来快速评价目标函数;2、使用新的方案将空间架构调度器集成到DSE中,避免冗余编译。
硬件生成:对于任意拓扑,生成配置每个硬件单元的路径是重要的。本文开发了一个架构感知的模拟退火为基础方法。
主要贡献:1、识别一组硬件原语,构成了空间加速器的丰富的设计空间;软硬件协同设计的自动化设计,包括:可组合硬件原语的模块化编译;解决修复空间调度技术;不规则空间拓扑的配置生成。

解耦空间加速器架构背景

解耦空间架构已经证明了在较低功率/面积比率的情况下有较高的性能。
解耦空间架构有两方面特性:
1、解耦意味着将计算和存储访问分开
2、空间意味着低级硬件执行的方面如网络和操作调度
将应用程序映射到解耦空间架构涉及到两方面:
1、将数据访问和计算操作解耦并把存储器访问映射到相应的单元
2、将计算操作映射到PE,并使用片上网络进行通信。
在这里插入图片描述
与传统冯诺依曼模型对比,PE的分布式特性具有高并发性。

解耦空间设计空间

解耦空间原语

原语设计要求:1、可以简单的进行组合;2、可以参数化,足以在定制中产生实质性的好处;3、具有可由编译器理解的明确定义的执行模型

决定通用性和效率之间权衡的一个重要因素就是组件的执行模型:该单元如何决定执行什么动作以及何时执行动作
执行模型参数: 本文允许在以下两个重要维度进行参数化
1、动态调度 vs 静态调度
静态调度所有操作和数据到达的顺序由编译器确定;动态调度操作是根据数据到达动态选择的。 动态调度需要单位面积里更大的功耗来检查操作的就绪状态,这和PE窗口的指令窗口成正比。此外,动态调度还需要通信上的流量控制,以平衡不同速率传入操作数。
2、专用 vs 共享元件:
专用原件,仅支持一个指令或路由决策;而共享原件在时间上复用不同的静态指令或路由决定。专用PE通过避免争用而具有较高吞吐量,并且由于指令缓冲器的较小大小而具有较低功率/面积开销。共享PE以面积/功率为代价实现更多的指令并发性。
PEs:PEs可以指定要支持的指令集。支持功能单元(FUs)将在硬件生成期间生成。
Switches:这种方法的核心是开关的灵活性,可以连接不同位宽的输入和输出。交换机复杂度是复杂度和效率之间的权衡的关键决定因素。复杂网络可以由多个交换机形成,并且交换机可以选择不翻转其输出,使得复合路由级可以在单个周期中执行。
Connections:硬件元件之间的直接通信通过连接来指定,并且这些连接自然地形成ADG的边缘
Delay Elements:延迟元件本质上用于流水线平衡的FIFO,由其深度参数化。可以满足编译器的时序要求。
Synchronization Elements:动态调度元件和静态调度元件的接口。目的是同步大量的输入到计算中。
Memories:存储器由其容量、宽度和并发流的数量参数化。
Control:在这项工作中,我们假设控制单元是一个可编程的核心,具有流数据流 ISA来编码其他单元的命令

组合原则

1、静态调度PE和Switches比动态占用更少的硬件资源,但是需要所有的输入都要在已知的时间里。而同步元件Synchronization Elements刚好能够提供这个支持。
2、专用元件具有较小的硬件开销。然而当输入操作时的时序不匹配,则没有其他工作可以执行,延迟元件允许可适配的延迟来帮助编译器进行补偿。
3、交换机可以连接PE,不论是静态动态调配,还是专用共享。

设计空间功能和限制

表示现有架构的能力
在这里插入图片描述
在拓扑结构之外,可以近似许多现有的加速器,主要是那些被认为是CGRA的加速器。

CGRA (Coarse-Grained Reconfigurable Arrays):粗粒度可配置阵列。一般由多个IS(Issue Slots)和RF(Register Files)组成,这里的IS在很多文章中也常用ALU,FU,PE,RC等术语指代,其实质上是进行数据运算的计算单元。

潜在特征

  • 合并:合并访问内存
  • 灵活总线:目前总线仅在存储器和同步元件之间,并且在处理元件的输出上。
  • 备用控制核心:对不要求可编程性的设计,可以将其替换为更加高效的部件,如RAM
  • 混合核:现有的ADG用于描述一个控制核(分离空间架构),在未来可以增多个不同实例,或者一个定制化的内联网络

基本功能限制

  • 内存一致性:DSAGEN不提供对维持严格的顺序存储器访问语义的支持。因此编译器或程序员负责维护存储器排序的正确性。
  • 推断:DSAGEN不支持猜测执行或通用内存歧义

判断哪条分支最可能被执行,预测执行会执行Fetch那里的执行,并立即执行。

特定领域设计:特定域的设计可以近似。
阐明目标:虽然采用的ADG可以描述现有架构,但是并不打算描述之前的所有工作。我们的目标是构建一个编译器和设计空间探索器,从领域未知的程序表示出发。

模块化解耦空间编译

构建DSE框架的一个关键挑战是将一个单一的、领域中立的程序表示编译成各种硬件单元,每个单元都具有参数和ISA的独特组合。下面们描述了编译器的职责、方法和模块化编译方法

编译器概述

编译包括以下几个步骤
1、区域选择:选择哪一块区域程序进行加载
2、区域并发:哪些可以进行并发运行
3、分析内存:决定哪个访存可以在不影响程序语义的前提下分离出来
4、翻译数据流:将区域翻译成dataflow IR
5、应用循环变化:为了利用时间和空间局部性,对每个域使用通用循环转换
6、应用模块化变化:在ADG中应用特定于所选硬件功能的转换
7、调度计算:将并发程序的资源映射到硬件资源
8、代码生成:生成控制代码和空间硬件配置

编程接口

实现一个加速器的典型方法是使用DSL(领域定制语言)。虽然这适用于一个固定的硬件和领域,但是本文的目标是通过加入不同的编程习语来实现最大的自由度。一个通用高级编程接口适用于我们的目标,我们选择了C。
这些语言的语义通常不是很丰富,我们需要一些更高级别的信息,本文提供了一些简单的杂注。

编译器转换

主要的编译流有四个步骤:解耦内存与计算;模块转换;空间调度和代码生成
内存与计算的解耦:为了解耦计算与内存,编译器一般检查代码块。
数据依赖转换:将控制流映射到空间加速器上需要将控制依赖转换为数据依赖。
在这里插入图片描述

模块化编译:编译器针对给定的ADG硬件特征进行优化。在执行硬件相关的转换之前,编译器首先检查底层硬件是否有相应的功能来支持他,如果没有,要确保总有一个回退程序来保证编译的成功。
空间调度:三个职责:1、映射指令与存储器流到硬件单元;2、将依赖关系映射到网络;3、匹配操作数到达的时间(对静态组件)
必须要扩展前两个职责,以支持混合使用不同执行模型的PE。举例来说数据依赖控制流只能被映射到动态PE中,低速度计算的指令应该被映射到共享PE中。当不同执行模型需要通信时,一定要进行同步
在这里插入图片描述
每个调度迭代尝试通过重新映射一些指令或流来改进目标(参见算法1)。

为了避免在搜索过程中遇到局部最小值,路由和PE资源允许被过度利用。
算法的优化目标是最小化下面三个数值:

  • PE和网络的过度使用
  • 最大化专用PE之间的间隔
  • 循环路径的延迟

结束的条件是:

  • 没有过度使用
  • 对象收敛(稳定几个迭代周期)

代码生成
编译器遍历每个代码转换的每个候选,并选择具有最高估计性能的一个用于代码生成。

常规优化

通过拖延整个空间架构来加强依赖性会严重损害性能。我们发现有两个习惯用法可以很好的避免。
在这里插入图片描述
Producer-Consumer
如图7(a)所示,值v在第一个加载区被产生,在第二个加载区被消耗。当涉及到这种用法时,编译器将直接生成控制代码,直接将生成的值转发给消耗区。这样不仅避免了由于等待生产者阶段完成而引入的同步开销,而且也实现了生产区和消费区的流水线化。
Repetitive In-place Update
如图7(b)所示,数组c[j]正在经历重复原地更新。编译器首先检查每次更新数据的大小(此例中为m),然后,编译器将m与片上同步缓存大小进行比较,如果这个大小能在缓存中存下,编译器将直接在产生区和消耗区直接调度,避免访问内存;否则编译器将进行切片重写该循环以使其跟新的数据大小小于buffer大小。

模块化代码转换

三个关键的模块化代码转换。
资源分配:通过选择向量化的程度来适应硬件的容量。
控制相关内存访问:控制相关的内存访问广泛存在于求交集操作,通俗来讲就是在两个向量上做一些事,如合并排序、数据库连接查询和稀疏向量操作。
在这里插入图片描述
图8(a)是稀疏向量内积。k值为稀疏向量不为0的位置。
一个朴素的映射四项如图b所示,但保留了从控制决策回到指针增量的数据依赖性,图中的反向分支限制了性能。

接下来给出这种稀疏表示一般化的定义。
• 对于任意一个 n 维整数向量 v ∈ Zn,如果其在且仅在 a 个维度上取值不为 0,则可以唯一表示为:
[(index1, value1), (index2, value2), · · · , (indexa, valuea)] • 其中所有的 index 均为整数且满足:
1 ≤ index1 < index2 < · · · < indexa ≤ n
• valuei 表示向量 v 在对应维度 indexi 上的非零值

间接内存访问
间接内存访问和原子更新在许多具有不规则内存模式的关键工作负载中非常常见,例如直方图,图形处理和稀疏矩阵运算。

原子更新是一种新的操作系统更新思想,将系统更新的操作视作原子性操作——若更新包安装成功,则系统完成升级;若系统更新失败,则会回到当前系统环境,保持当前系统环境不被更改。

自动设计空间探索

DSAGEN可以在输入程序和硬件之间执行自动协同设计,选择每个程序的最佳转换集沿着基于迭代图搜索的硬件功能的细粒度选择。协同设计的基本迭代方法如下:

  1. 从一些初始默认ADG开始。
  2. 创建修改后的ADG,其中添加或删除随机数量的组件(具有随机连接性),而不超过功率和面积预算。
  3. 将所有N个输入内核调度到空间架构,其中每个内核具有M个不同版本,对应于不同的展开(即:矢量化)因素。
  4. 估计每个内核的每个版本的性能,基于性能模型。
  5. 选择每个内核的最佳性能版本,并估计目标函数
  6. 如果目标改善,则继续使用新的ADG。
  7. 重复2-6,直到目标收敛

具有修复调度程序的快速DSE (Fast DSE with Repairing Scheduler)

挑战:DSE步骤的长度:每次迭代最耗时的方面是评估目标函数的性能。原因:1、空间架构的性能只能在程序映射到硬件后才能确定;2、映射会影响内存和资源征用,以及任何关键依赖项的延迟。
Insight:每次迭代的ADG并不完全不同:可能添加一些边以增加网络连接性,可以添加处理元件以增加性能,并且可以删除上述的一个小子集以改善面积/功率开销。对于许多递增变化的助理总干事,以前的时间表仍然有效。即使删除了程序区域所使用的硬件组件,调度的剩余部分仍然有效。
Repairing Spatial Scheduler
因此我们提出了使用一个修复空间调度器的DSE方法。在ADG修改后,更新已经被探索过的调度来反映新的硬件。尤其是,输入程序中使用已删除ADG组件的部分同样从调度中删除。然后开始调度修复,其尝试修复不完整的调度,以及尝试利用新加入的硬件特征。调度修复同随机迭代空间调度器十分兼容,因为这个算法也是迭代的,修复需要定义为一种不完整的调度。
在这里插入图片描述
图9示出了DSE步骤的示例,其中正在探索输入程序(密集和稀疏向量乘法)。图9(B)显示ADG修饰步骤;在这种情况下,ADG修改器随机选择删除左下PE;这使稀疏乘法的累加的位置和定时无效。然后,调度器将对其数据流执行调度修复,将其累积移动到另一个可用PE。

Performance Modeling Approach(性能建模方法)

通过评估IPC实现其性能度量。IPC = Insts x Activity Ratio.

IPC英文全称"Instruction Per Clock",翻译过来就是每个时钟的指令

activity ratio受到带宽的限制,或者受到程序区域内或程序区域间依赖性的限制。
因此,模型性能评估需要计算:1、实现完全流水线执行所需的存储器带宽;2、如果存在依赖,这些依赖对activity radio的影响。
存储器带宽活动比率被计算为针对每个存储器的带宽请求/带宽供应的最小比率。
依赖活动比率计算管道的并发计算实例的数量可以隐藏每个依赖/依赖延迟。

功率/面积建模方法

给出的DSE方法需要快速获取给定硬件的功耗/面积评估。传统的综合工具太慢。因此我们使用了一个分析回归模型用于功耗/面积评估。一个所有硬件模块的数据集,加上对可能参数的采样(IO连接的数量,数据宽度,寄存器文件大小等)综合到一起来构建分析模型。对于PE来说,功耗面积开销包括其功能单元组成。至于优化方面,我们开发了一个支持多功能的功能单元(如32bit加法器,同样能执行减法,也能分解为两个16bit加法器)

缺点

我们假设了片上网络拓扑的改变和每个组件参数的改变不会对最终实现硬件的时钟频率产生影响,因为评估综合时序和违反十分困难。因此我们将每个交换单元暂存其输出,这样每个交换单元就成为一个流水栈。这使得其难以对关键路径产生影响。

其它DSE期间的固定特征:即时ADG可以表达一些特征,我们还是将固定了。包括内存的数量和scratchpad的数量。同样并不改变控制核的参数。

硬件生成

硬件生成器不仅生成RTL,而且形式化了软件/硬件接口。
bit流编码:每个组件有自己的本地寄存器用于保存可编程信息,交换单元用于保存路由信息;PE用于保存指令操作码,执行时间(静态PE),指令标志(共享PE);同步单元用于保存延迟的周期数。空间架构通过加载这些bitstream来实现配置。

配置:使用一个bit来给出配置信号,该信号会由硬件生成决定的静态路径传播。会存在多条配置路径,组件至少存在于一条路径上。配置数据同样包括目的组件的ID。

配置路径生成:DSAGEN支持任意拓扑,因此需要构造多条配置路径,以最小化配置时间。该问题可形式化为,找到至少一条路径,覆盖所有节点,且总长度最短。本文方法中,首先使用类似生成树的算法来获取初始路径。然后使用一个启发式方法,从最长的路径上剪去一个节点,并连接到其它节点上。算法运行直到收敛。

缺点:硬件生成器限制了每个模块的编码方式。更进一步的优化是,基于总体寄存器的数量,削减明确一个寄存器所使用的配置比特位。另一个优化方向,是在门级实现同样功能,但是可以满足延迟/吞吐量/频率权衡的结构。(如将进位传递加法器替换为超前进位加法器)

生成器重用硬件电路来实现不同功能的能力也受到限制。举例来说,现阶段可以实现重用一个64bit加法器构建一个8bit SIMD加法,但是并不能实现使用浮点除法器来完成移位操作的能力。在电路和功能单元组成级别的优化是未来的工作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值