特定于域的硬件加速器

2020-06-19 22:28:19

威廉·J·达利,雅蒂什·图拉基亚,宋涵通信的ACM,2020年7月,第63卷第7期,第48-57页10.1145/3361682评论从洗衣机中的简单嵌入式处理器到数据中心服务器中的强大处理器,今天的大多数计算都是在通用可编程处理器或CPU上进行的。CPU之所以有吸引力,是因为它们易于编程,而且它们有大量的代码库。CPU的可编程性源于它们执行诸如加法或分支之类的简单指令序列;然而,获取和解释指令所需的能量比执行诸如加法之类的简单操作所需的能量多10倍到4000倍。当处理器的性能和效率根据摩尔定律进行扩展时,这种高开销是可以接受的。32只需等待,现有的应用程序就会运行得更快、更高效。我们的经济已经变得依赖于这些计算性能和效率的提高来实现新功能和新应用。今天,摩尔定律在很大程度上已经结束了,12我们必须寻找开销更低的替代体系结构,例如特定领域的加速器,以继续扩展性能和效率。有几种方法可以实现特定于域的加速器,如关于加速器选项的侧栏中所讨论的。

特定于域的加速器是专用于特定应用程序域的硬件计算引擎。加速器已被设计用于图形、26个深度学习、16个模拟、2个生物信息学、49个图像处理、38个和许多其他任务。与通用计算机相比,加速器可以在性能/成本和性能/功率方面提供数量级的改进。例如,我们的生物信息学加速器Darwin,49在基于参考的长读汇编中比CPU快15,000倍。加速器的性能和效率得益于专门的操作、并行性、高效的内存系统和降低的开销。特定领域的加速器7正变得更加普遍和明显,因为摩尔定律已经结束,它们是为数不多的继续提高性能和效率的方法之一。22。

大多数应用程序需要修改以在特定于域的加速器上实现高速。这些应用程序经过高度调整,以平衡传统处理器与其存储系统的性能。当专门化将处理成本降低到接近于零时,它们就会受到内存限制。必须修改应用程序,使用加速器共同设计应用程序,以减少内存带宽和内存占用。即使在返工之后,许多特定于域的加速器仍然以内存为主。

一个设计良好的加速器可以覆盖最广泛的应用程序空间--加速一个域而不是一个单独的应用程序。将特定于域的指令添加到可编程处理器提供了专用指令的效率,同时保持了灵活性。复杂指令提供了更好的效率,因为它们摊销了可编程性的高开销。从特定于域的处理元素构建并行计算机还可以加速大范围的应用程序,而只会造成很小的效率损失。

特定于域的加速器的设计实际上是并行编程的一种形式,但其成本模型与大多数程序员使用的非常不同。算术和逻辑操作几乎是免费的,并且内存访问的成本是被访问内存大小的函数。设计加速器的大部分工作是重构应用程序,以在此模型下优化效率。我们展望未来的编程系统,在那里程序员指定算法,并在空间和时间上映射到硬件。从这个描述中,加速器的详细设计将在很大程度上是自动化的。这样的工具将促进对加速器设计空间的快速探索,并消除当今加速器设计的许多障碍。

本文的其余部分描述了特定于域的加速器的当前技术水平。我们首先讨论加速器用来实现性能和效率的四种技术:专门化、并行性、本地和优化内存以及降低开销。然后,我们将探索应用程序和加速器的协同设计过程,并讨论大多数加速器是如何由内存控制的。我们研究了平衡专门性和通用性的挑战,稍后我们描述了加速器设计如何可以被视为设计具有反映现代硬件的一组成本的并行程序。

数据专门化:特定于域的数据类型的专门化操作可以在一个周期内完成,这在传统计算机上可能需要数十个周期。执行内循环功能的专用逻辑可同时提高性能和效率

本地和优化的内存:通过将关键数据结构存储在许多小的本地内存中,可以以低成本和低能耗实现非常高的内存带宽。对全局内存的访问模式进行了优化,以获得尽可能大的内存带宽。关键数据结构可以被压缩以倍增带宽。内存访问跨内存通道进行负载平衡,并仔细安排以最大限度地提高内存利用率。

专门化和并行化带来的加速收益是成倍增加的。例如,与传统处理器相比,这里描述的动态编程引擎通过专门化获得了37倍的加速,通过并行性获得了额外的4034倍的加速,净加速为150,000倍。其中一些因素也是相互依存的。例如,实现高度的并行性取决于位置。动态编程引擎中的4096个处理单元仅引用小的本地回溯存储器。如果需要全局内存引用,则不可能实现这种程度的并行性。优化内存还可能依赖于专门化。只有当有专门的逻辑可用来执行压缩时,压缩数据结构才有意义。

数据专业化。许多特定于域的加速器的定义功能是一组专用于应用程序域的硬件操作。许多要求苛刻的应用程序的内部循环仅使用非常本地的内存引用执行数十到数百次算术和逻辑操作。在许多情况下,专用逻辑可以用很小的面积和功耗在单个周期内执行整个内循环。该逻辑由专门的寄存器和通信链路馈送,这些寄存器和通信链路以非常低的能量提供和消耗数据。例如,考虑具有仿射间隙惩罚的Smith-Waterman算法44。14该算法广泛应用于基因组分析中,对两个基因序列进行比对。内部循环的每次迭代都会计算以下递归公式:

这里H(i,j)是结束于(i,j)的对齐的最大分数,o和e是打开和扩展插入或删除的惩罚,W(r,q)是用基数r代替基数q的成本。该计算以16位整数算术进行。

在没有SIMD矢量化的传统x86处理器上执行此计算需要大约35次算术和逻辑操作以及15次加载/存储操作。在Intel Xeon E5-26204问题无序14 nm CPU上,每次迭代大约需要37个周期,消耗81nJ。在我们的40 nm达尔文加速器上,每次迭代需要一个周期,加速37倍,消耗3.1pJ,能量减少26,000倍。在3.1pJ中,只有0.3pJ用于计算递归方程。剩余的2.8pJ用于单个存储器访问,以存储4位回溯指针,该指针标识使用了哪个前面的单元来计算值。

专业化认证节省的很大一部分面积和能源都归功于管理费用的消除。x86处理器消耗的81nJ及其大部分面积都花在了获取、解码和重新排序指令上。专业化在很大程度上消除了这种开销。计算递归方程的处理元件在40 nm工艺中仅占用0.004mm2的芯片面积。尽管该加速器落后于14 nm CPU三个技术节点,但其专门的操作在性能、功耗和面积方面都有数量级的改进。

专门化还通过降低内存压缩成本来增强局部性。在我们的EIE稀疏神经网络加速器中,16我们以压缩稀疏列(CSC)格式存储10%-30%的密集网络。我们进一步使用游程编码将行指针压缩为4位,并使用16条目码本压缩网络权重。网络权重的压缩稀疏表示导致大小减少到原来的1/30,从而允许大多数网络的权重适合高效的本地片上存储器,其访问所需的能量比片外存储器少两个数量级。

在传统处理器上,遍历稀疏矩阵数据结构的指针所需的额外操作使得这种表示对于密度高于1%的情况是低效的。类似地,游程长度和码本压缩的开销在通用处理器上是令人望而却步的。使用专门的逻辑,指针遍历在专用的流水线阶段完成,指针从专用的本地内存中获取。用于游程长度指针编码和码本查找的解压缩也是在专用流水线阶段中完成的。用专门的逻辑支持稀疏和压缩所需的面积相对较小:16条目权重解码器占用的面积不到芯片面积的1%;指针RAM占用大约20%的面积和功耗。在通用处理器上,开销是令人望而却步的。

并行性。大多数特定于域的加速器在一个或多个级别利用并行性。通过将并行性专门化到应用领域,大大简化了处理单元之间的同步和通信。只需要支持正在加速的应用程序中的通信和同步模式。通过消除开销,并行处理单元可以变得非常简单和非常小。例如,我们的达尔文加速器的对准部分在两个级别上利用了并行性。在外环级别,A=64个处理元件的脉动阵列并行地处理64个单独的对准问题。子问题之间没有通信,唯一需要的同步是在每个子问题完成后。典型的基于引用的程序集执行数十亿次对齐,因此有足够的外环并行性。

在内循环级别,每个数组由并行计算H、I和D矩阵的64个元素的P=64个处理元素组成。计算是沿着最初在Lipton和Lopresti中建议的矩阵的对角线进行的。30在周期t上,处理元素p计算(p,t-p)处的矩阵元素。具有多于P行的矩阵一次以带状P行进行处理。因为矩阵元素(i,j)仅依赖于直接在上面(i-1,j)、直接在左边(i,j-1)、在上面和左边(i-1,j-1)的元素,所以只需要处理单元之间的脉动最近邻通信。与所有脉动阵列一样,同步是隐式的。

由专用加速器利用的并行性通常具有非常高的利用率。外环级别的利用率接近100%。在计算结束之前,总会有另一个子问题一完成就要处理。通过双缓冲输入和输出,阵列可以连续工作。在内循环级别,利用率为98.5%。计算是在512x512平铺中执行的。在每个平铺的开始处,只有一个位于左上角的PE处于活动状态。每个周期,另一个PE变为活动状态,直到所有64个PE都在运行。同样,在右下角,活动PE的数量从64线性下降到0。虽然可以让空闲的PE立即开始下一次校准,但这在达尔文是不能做到的。在开始和结束时空闲PE使平均PE利用率达到98.5%,并且由于并行度为4034倍而总体加速。这种并行性带来的加速与专业化带来的37倍加速相乘,从而使对齐的总体加速提高了150,000倍。

在EIE中,我们通过将矩阵的行划分为256个PE来并行化稀疏矩阵x稀疏向量乘法。每个非零输入激活及其列被广播到所有PE。在接收到每次激活时,每个PE在其行子集中遍历该列的非零行条目,在本地累加行和。除了激活广播之外,PE之间没有通信。每个PE负载的待决输入激活的FIFO队列可跨PE平衡工作,从而将PE利用率从没有FIFO时的50%提高到使用FIFO时的90%。

本地和优化的内存。专门化和并行化带来的收益依赖于保持由较小的本地内存提供计算。每个周期,达尔文对齐引擎中的4096个PE中的每个PE都存储一个指向内存的回溯指针,从而实现近2TBps的净写入带宽。当动态规划完成时,这些指针用于构建最优对齐。如果将回溯指针存储到全局内存,则计算将受到内存带宽的瓶颈。取而代之的是,回溯指针存储在4096个小型SRAM中,与每个PE关联一个。传统的存储器子系统,即使是具有多级高速缓存的子系统,也主要是串行的,并且会将可实现的并行度限制在非常小的数字。

以类似的方式,达尔文加速器的过滤级使用16个专用SRAM来存储仓位计数,即在候选排列范围内匹配的种子数量。虽然每个周期最多递增四个仓位,但这里的加速比超过四倍,因为仓位计数更新是随机的,并且会干扰对种子位置表的顺序访问。从内存流中删除bin-count更新后,种子表的顺序读取实现了近乎理想的内存吞吐量。总体而言,内存访问优化带来的加速比是9倍-24倍-3倍,这是通过减少对DRAM的访问(将仓位计数更新移动到SRAM),以及通过将随机访问模式更改为主要顺序访问模式而增加的带宽带来的3倍-8倍的加速比。向加速器添加了四个DRAM内存通道,使内存并行性的速度又提高了四倍。

可以使用数据压缩

指令和数据供应开销的高能量和面积成本激发了复杂指令。单个加法操作的能量被指令开销能量淹没。另一方面,诸如NVIDIA Volta V100,4的矩阵乘法累加指令(HMMA)的复杂指令在单个指令中执行128次浮点操作,因此具有数倍于指令开销的操作能量。使用复杂的、专门的指令,可以构建高效的、专门的、可编程的计算机系统。我们稍后将重新讨论复杂的、专门的指令的概念。

从专用硬件获得高加速比和效率增益通常需要修改底层算法。由于现有算法针对传统通用处理器进行了高度调优,因此它们很少是专门解决方案的最佳方法。相反,算法和硬件必须协同设计,以便在保持或提高准确性的同时联合优化性能和效率。

许多现有算法都进行了调整,以平衡传统处理器与其存储系统的性能。当通过专门化使处理成本几乎为零时,它们将完全由内存控制。为了获得显著的加速比,必须对这些算法进行重构,以降低对全局内存的带宽需求。虽然可以使用诸如分块52和压缩之类的方法在一定程度上减少全局带宽,但通常需要更基本的重构。

CoDesign的一种方法是用硬件成本较低的操作(即逻辑受限的操作)换取成本较低的操作(即内存受限)。例如,诸如GraphMap 45的用于长读基因组序列比对的常规应用将其大部分计算时间花费在过滤上,而将相对较少的时间花费在比对上。这种方法对于过滤相对便宜而对齐成本较高的通用处理器是有意义的。对于专用硬件而言,这完全是错误的优化,在这种情况下,对齐可以达到极高的效率(效率是通用处理器的26,000倍,速度是通用处理器的150,000倍),但过滤从根本上受到全局内存带宽的限制。如果我们将硬件专门化应用于现有算法,由于所需的内存带宽,我们将被限制为4-5倍的加速。

为了利用这种成本差异,达尔文花在过滤上的时间比GraphMap少200倍。这导致案例数量增加了560倍。

..