您的位置 首页 系统

测验经过算法重构和Vivado HLS生成高效的处理流水线

通过用于重构高级算法描述的简单流程,就可以利用高层次综合功能生成更高效的处理流水线。如果您正在努力开发计算内核,而且采用常规内存访问模式,并且循环迭代间的并行性比较容易提取,这时,Vivado设计套件

经过用于重构高档算法描绘的简略流程,就可以运用高层次归纳功用生成更高效的处理流水线。

假如您正在尽力开发核算内核,并且选用惯例内存拜访办法,并且循环迭代间的并行性比较简略提取,这时,Vivado规划套件高层次归纳(HLS)东西是创立高功用加速器的极好资源。经过向C言语高档算法描绘中添加一些编译指示,就可以在赛灵思FPGA上快速完结高吞吐量的处理引擎。结合运用软件办理的DMA机制,就可以比通用处理器提速数十倍。

可是,实践运用中经常会遇到难以处理的杂乱内存拜拜访题,尤其是当打破科学核算和信号处理算法范畴时更是如此。咱们规划出了一种简略办法,可供您在此类状况下生成高效的处理流水线。在具体介绍之前,咱们首要了解一下Vivado HLS的作业原理,更重要的是了解它何时不起作用。

HLS东西怎么起作用?

高层次归纳功用企图获取由高档言语描绘的操控数据流图 (CDFG)中的并行性。对核算操作和内存拜访进行分配和调度时,应依据它们之间的依靠束缚和方针渠道的资源束缚来履行。电路中特定操作的激活与某个时钟周期相关,一起,沿数据途径归纳的中心操控器和谐整个CDFG的履行。

单纯在内核上运用HLS可以树立一条具有许多指令级并行性的数据途径。可是当它被激活时,就需求频频停下来等候数据送入。

由于调度作业是在静态下完结的, 因而加速器运转时刻的行为适当简略。所生成电路的不同部分相互之间以相同步骤运转;并不需求动态的相关性查看机制,例如高功用CPU上呈现的那种。例如,在图1(a) 所示的函数中,循环索引添加和curInd的加载可以并行处理。此外,下次迭代可以在当时迭代完结前开端。

一起,由于浮点乘法一般运用前次迭代的乘法成果

因而可以开端新迭代的最短距离遭到浮点乘法器时延的约束。该函数的履行调度如图2(a)所示。

该计划何时达不到抱负作用?

这种计划的问题在于整个数据流图严厉按调度运转。片外通讯发生的延迟会传播到整个处理引擎,然后导致功用大幅下降。当内存拜访办法已知,数据能在需求运用之前移动到芯片上,或许假如数据集满意小,则可彻底高速缓存在FPGA上,这类状况下不会有问题。可是,就许多风趣的算法而言,数据拜访取决于核算成果,并且内存占用决议了需求运用片外RAM。现在,在内核上单纯运用HLS可树立一条具有许多指令级并行性的数据途径。可是,当它被激活时,就需求频频停下来等候数据送入。

测验经过算法重构和Vivado HLS生成高效的处理流水线

图1 – 规划实例:(a) 包括不规则内存拜访办法的函数;(b) 重构得到的流水线结构

测验经过算法重构和Vivado HLS生成高效的处理流水线

图2 – 不同景象下的履行调度:(a) 当一切数据都在片上高速缓存;

(b) 动态取数据;(c) 解耦运算

图2(b)给出了针对实例函数生成的硬件模块的履行状况,此刻数据集太大,需求动态送入片上高速缓存。留意减速程度怎么反映一切高速缓存缺失时延的归纳影响。不过,状况并非必定如此,由于核算图中有些部分的发展不需求当即供给内存数据。这些部分应该可以向前移动。履行调度中这点额定自由度有或许发生显着影响,就像咱们看到的那样。

重构/解耦实例

咱们看一下方才的实例函数。假定浮点乘法的履行和数据拜访没有悉数由共同的组织联络在一起。当一个负载运算符等候数据回来时,另一个负载运算符可以开端新的内存恳求,乘法器的履行也能向前移动。为到达此意图,每项内存拜访都应该由一个模块来担任,并按各自的调度运转。此外,乘法器单元应该与一切内存操作异步履行。

不同模块间的数据相关性

经过硬件FIFO来通讯。关于咱们的实例而言,或许的重构办法如图1(b)所示。用于各阶段之间通讯的硬件行列可以缓冲现已取回但没有运用的数据。当内存拜访部件因高速缓存缺失而呈现延迟时,当时已发生的积压数据还可以持续供乘法器单元运用。在阅历较长时刻后,构成的延迟时刻会被浮点乘法的长时延掩盖。

图2(c)给出了运用解耦处理流水线时的履行调度。这儿,经过FIFO的时延没有考虑在内,不过假如迭代量很大,该时延的影响会到达最小。

咱们怎么进行重构?

为了给解耦处理模块生成流水线,首要需求将初始CDFG中的指令进行组合以构成子图。为使所得的完结计划功用最大化,聚类办法有必要满意几个要求。

首要,正如咱们之前所见,Vivado HLS东西在前面的迭代完结之前运用软件流水线建议新的迭代。CDFG中最长循环依靠的时延决议可建议新迭代的最小距离,最终会约束加速器所能完结的总吞吐量。因而,很重要的一点在于这些依靠循环不能遍历多个子图,例如用于模块间通讯的FIFO总是会添加时延。

其次,应该将内存操作与触及长时延核算的依靠循环分隔,这样高速缓存缺失就会被慢速的数据处理所“掩盖”。在这儿,“长时延”是指操作需求一个周期以上的时刻才干完结;在这儿,咱们运用Vivado HLS调度来获取这一方针。例如,乘法是长时延操作,而整数加法不是。

最终,为了将高速缓存缺失引起的延迟影响限定在部分范围内,您需求将每个子图中的内存操作数量减至最少,尤其是在需求寻址存储空间中的不同部分时更是如此。

第一个要求——避免依靠循环遍历多个子图——很简略满意,只需求找到原始数据流图中的强连通重量(SCC),并在将它们分为不同集群之前将其翻开变成节点。这样,咱们就得到一个有向的非循环图,其间有些节点是简略指令,其它则为一组相关的操作。

要满意第二和第三个要求,即别离内存操作和部分化延迟的影响,咱们可以对这些节点进行拓扑排序,然后将它们分区。最简略的分区办法是在每个内存操作或长时延SCC节点后画一条“鸿沟”。图3展现了怎么将此计划运用于咱们的实例。集群与图1中流水线结构之间的对应联系应该做到清楚明了。每个子图都是一个新的C函数,可独立经过HLS推送。这些子图在履行时相互间的步骤并不共同。

咱们构建了一个简略的源到源转化东西,用以履行重构。

咱们运用赛灵思IP核,支撑FIFO,以衔接所生成的独立模块。当然,重构给定核算内核的办法不止一种,并且规划空间探求仍在进行中。

流水线化内存拜访

有了解耦处理流水线的开始实施计划后,咱们就可以对其履行几项优化,以进步其功率。正如咱们所见,当运用HLS映射C函数时,内存读取呈现堵塞。这个问题也呈现在流水线中的单个阶段。例如,担任加载x[curInd]的模块在等候数据时或许会发生延迟,即便在下个curInd现已安排妥当并且FIFO下流有满意空间的状况下亦是如此。

为了处理这个问题,咱们可以做一下改变以简化内存拜访。关于某个特定阶段,咱们不在C函数中履行简略的内存加载,而是将地址推送到新的FIFO。然后,独自实例化一个新的硬件模块,以读取地址FIFO送出的地址,并将它们发送到内存子系统。回来的数据被直接推送到下流FIFO。现在,内存拜访得到了有用的流水线化。

地址的推送操作可在Vivado HLS中经过向FIFO接口的内存存储来代表,AXI总线协议答应您指定突发长度;并且,经过对解耦C函数进行一些小的修正,并运用流水线化的内存拜访模块,咱们就可运用该功用。

3.jpg

图3 – 对子图的重构

4.jpg

图4 – 背包问题

除了生成地址以外,解耦C函数中每个内存操作符还要在接连存储块被拜访时核算突发长度。循环计数器的仿制还有助于突发拜访的生成,由于被拜访的字数量可以在每个解耦函数中本地确认。

不过,用以监测下流FIFO和发送内存恳求的硬件模块则选用Verilog完结。这是由于在由Vivado HLS归纳的内存接口中,外发地址和呼应数据没有绑缚在一起。不过这是一个简略模块,能在不同基准测验中重用很屡次,因而规划作业就被摊销了。

仿制或通讯?

在重构内核并生成解耦处理流水线的过程中,用来在不同阶段移动数据的FIFO会构成很大开支。经过仿制少数核算指令可以去除一些FIFO,这样一般很有优点,由于即便是最小深度的FIFO也会占用不少FPGA资源。

一般来说,在权衡利弊以探求最佳规划点的过程中,您可以运用本钱模型和标准的优化技能。但在大多数基准测验中,仅仅为它的每个用户仿制简略的循环计数器就可以节约许多面积,这也正是咱们所做的。在这个引导性实例中, 该优化是指仿制i的整数加法器,因而存储成果 i时不需求从其它模块取得索引。

内存的突发拜访

第三项优化是内存的突发拜访(burst-memory access)。为了更高效地运用内存带宽,咱们期望经过一次内存事务处理带着多个数据字。

试验评价

咱们运用上述计划做了几个事例研讨。 为评价这种办法的优势,咱们将运用该计划生成的解耦处理流水线 (DPP)与单纯运用HLS生成的加速器进行比较。当为单纯或DPP完结计划调用Vivado HLS时,咱们将方针时钟频率设置到150MHz,并在布局布线后运用所能到达的最高时钟速率。此外,咱们针对加速器和内存子系统之间的交互测验了不同的机制。所用的端口为ACP和HP。咱们为每个端口在可重装备阵列上实例化一个64KB高速缓存。

本试验所用的物理器材是赛灵思的Zynq®-7000 XC7Z020全可编程SoC,安装在ZedBoard评价渠道上。

咱们还在Zynq SoC 的ARM®处理器上运转运用的软件版别,并将其功用作为试验的基准。生成的一切加速器功用完全,无需任何DMA机制将数据移入和移出可重装备架构。

5.jpg

图5 – 针对背包问题的运转时刻比较

事例研讨1:

背包问题

众所周知,背包问题是一个组合问题,可以经过动态编程来求解。内核的结构如图4所示。其间黑体字的变量都是在运转时刻从

内存读取。因而,无法切当知道从哪个方位加载的变量opt_without。当w和n 比较大时,咱们无法在片上缓冲整个opt阵列。咱们只能让核算引擎取回所需的部分。

图5给出了运转时刻比照状况,将运用咱们的计划(DPP)生成的加速器与单纯经过HLS推送函数而生成的加速器进行比较。图中还显现了在ARM处理器上运转函数时的功用。 咱们将n(项数)固定为40,使w (背包的总重量)在100至3,200之间改变。

6.jpg

图6 – 稀少矩阵向量乘法

从比照中很简略看出,经过单纯运用Vivado HLS来映射软件内核这种办法得到的 ARM处理器功用高出约4.5倍。别的,当运用

加速器功用比基准要求慢许多。 DPP时,各种内存拜访机制之间的Zynq SoC 上的超标量 不同适当小——运用咱们的计划时,无序式ARM内核能受内存拜访时延的影响要小许多。

7.jpg

图7 – 针对稀少矩阵向量乘法的运转时刻比照

很大程度开辟指令级并行性,并且具有一个高功用片上高速缓存。Vivado HLS东西提取的事例研讨2:稀少矩阵向量乘法

附加并行性显着不足以补偿硬处理器内核关于稀少矩阵向量(SpMV)乘法是一个可编程逻辑的时钟频率优势核算内核,现已在各种研讨项目中以许多不同办法进行过研讨、改换和基准确认。这儿,咱们的意图不是以及来自可重装备阵列的运用特别数据结构和存储分配办法更长的数据拜访时延。构建最佳功用的SpMV乘法,不过,当内核被解耦,分红而是想依据最基本的算法描绘多个处理阶段时,看看在运用Vivado HLS时重构功用就会显着比传递能供给多少优势。

如图6所示,在咱们的试验中,稀少矩阵以紧缩稀少行(CSR)格局存储。在取回数字以进行实践的浮点乘法之前,需求先履行来自索引数组的负载。用来决议拜访哪个操控流程和内存方位的数值只要在运转时刻才知道。在图7所示的运转时刻比照中,矩阵的均匀密度为1/16,尺度在32和2,048之间改变。

此处,单纯的映射法在功用上再次落后于软件版。当不运用FPGA上的高速缓存时,用咱们的办法生成的解耦处理流水线在功用上简直与基准功用相同。

当在可重装备阵列上实例化一个64KB高速缓存时,DPP的功用挨近基准的两倍。与之前的基准比较,高速缓存的添加对DPP的功用具有更显着的影响。

事例研讨3:FLOYD-WARSHALL 算法

Floyd-Warshall是一种图形算法,用来找到恣意一对极点之间成对的最短途径。内存拜访办法比之前的基准要简略。因而,有或许存在一种办法可以规划出DMA+加速器结构,以取得很好的核算堆叠和片外通讯。咱们的计划能试着主动完结这种堆叠,可是咱们没有进行相关的研讨,以标明肯定最佳与实践所得之间的距离。

不过,与之前的基准相同,我也进行了运转时刻比照。这儿,咱们使图形的巨细在40个节点至160个节点之间改变。每个节点均匀有悉数节点的1/3作为其邻点。得到的成果与背包问题中的非常相似。

8.jpg

图8 –Floyd-Warshall算法

解耦处理流水线所完结的功用约为软件基准的3倍,吞吐量到达任何单纯映射法的两倍多。当运用DPP时,对FPGA高速缓存的影响也很小,展现出了关于内存拜访时延的容限。

咱们这种简略的技能构建出的处理流水线可以更好地运用内存带宽,并且对内存时延有更好的容限,因而可以改进Vivado HLS的功用。所描绘的办法可对操控数据流图中的内存拜访和较长的依靠循环解耦,这样高速缓存缺失就不会延迟加速器的其它部分。

9.jpg

图9 – 针对Floyd-Warshall算法的运转时刻比较

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/288750.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部