跳到主要内容
研究论文
开放式访问

FlowPix:使用领域特定编译器加速FPGA覆盖上的图像处理管道

出版:2023年12月14日 出版历史
  • 获取引文提醒
  • 摘要

    近年来,摩尔定律保证的指数级性能增长已开始减弱。与此同时,像图像处理这样的新兴应用需要很高的计算性能。这些因素不可避免地导致出现领域特定加速器(DSA)来填补传统架构留下的性能空白。FPGA由于其低功耗和较高的并行度,正迅速发展成为设计DSA的定制ASIC的替代品。FPGA上的DSA设计需要仔细校准FPGA计算和内存资源,以实现最佳吞吐量。
    硬件描述语言(HDL)(如Verilog)传统上用于设计FPGA硬件。HDL并不是面向任何域的,用户必须在寄存器传输级别上花费大量精力来描述硬件。领域特定语言(DSL)和编译器最近被用于将针对特定领域的手写HDL模板编织在一起。最近的工作已经设计了具有针对FPGA的图像处理DSL的DSA。DSL中的图像计算降低到预先存在的模板或较低级别的语言(如HLS-C)。这种方法需要为每个新的工作负载重新刷新昂贵的FPGA。与这种固定功能硬件方法相比,覆盖层正在获得吸引力。套印格式DSA类似于处理器,在FPGA上合成并闪存一次,但足够灵活,可以通过软重新配置处理广泛的计算。在图像处理覆盖方面的工作报告较少。图像处理算法的大小和形状各不相同,从简单的模糊操作到复杂的金字塔系统。设计图像处理覆盖层的主要挑战是在映射不同算法时保持灵活性。
    本文提出了一种基于DSL的覆盖加速器,称为流动像素用于图像处理应用程序。DSL程序表示为管道,每个阶段代表整个算法中的计算步骤。我们在Virtex-7-690t FPGA上使用FlowPix实现了15个图像处理基准。基准测试范围从简单的模糊操作到复杂的管道,如卢卡斯-坎德光流。我们将FlowPix与生成固定功能硬件的现有DSL-to-FPGA框架(如Hetero-Halide和Vitis Vision库)进行了比较。在大多数基准测试中,我们看到高达25%的延迟降低,FPGA LUT消耗大约增加1.7倍到2倍。我们能够在不产生硬件合成、布局和路由以及FPGA刷新的高成本的情况下执行任何基准测试,这证明了我们所经历的轻微性能损失和增加的资源消耗是合理的。在实现的基准测试中,FlowPix在1920×1080像素的HD帧上实现了170 FPS的平均帧速率。

    1引言

    智能手机革命使相机无处不在,开创了计算摄影的新时代。计算摄影使用许多数字图像处理算法(通常是流水线算法)来完成图像构建、压缩、稳定等任务。例如,摄像头管道[35]是部署在所有数码相机中的典型图像处理管道。这些管道需要大量计算,例如,处理1080p/60fps的原始视频需要120千兆次/秒。此外,由于这些计算管道部署在功率受限的设备中,因此在保持吞吐量和延迟方面所需性能的同时实现能效至关重要。传统上,这是在使用专用硬件执行图像处理任务的相机中完成的。之前的工作[16]已经表明,与通用处理器相比,此类定制ASIC可以将能效提高500倍,大大延长智能手机和数码相机的电池寿命。除其他因素外,ASIC的能效来自于缺少指令获取和解码周期。使用本地片上存储器缓冲进一步的中间数据,从而避免外部存储器访问。
    A类特定领域加速器(DSA)是一个自定义处理器或一组计算单元,经过优化以执行窄范围的计算。它们是为满足其领域所需算法的需要而定制的。例如,AI加速器可能具有一系列元素,包括乘法累加功能,以有效地执行矩阵运算。谷歌的张量处理单元(TPU)苹果M1处理器中的神经引擎和Xilinx AI引擎是流行的基于ASIC的DSA。基于ASIC的DSA可显著提高性能和能效。众所周知,定制专用集成电路的上市周期长,在缺乏规模经济的情况下价格昂贵,无法满足快速增长的用户需求。我们可以通过使用FPGA在功率和性能上进行实际权衡来规避这些障碍。同时,FPGA在每瓦特性能公制[31]. 因此,FPGA正迅速发展成为设计DSA的定制ASIC的替代品。
    FPGA的优势常常被与之相关的可编程性问题所掩盖硬件描述语言(HDL).高级合成(HLS)通过基于C的语言[6,15,29]、基于OpenCL/CUDA的[30]、Bluespec System Verilog[27]和Chisel[]是提高FPGA可编程性的一些突出努力。其他基于模型的框架,如NI LabVIEW和MATLAB HDL编码器[14]也有。有关所有这些方法的全面调查,请参见[4]. 尽管做出了这些努力,硬件加速器设计仍然涉及到一条陡峭的学习曲线,这给程序员的生产力带来了严峻挑战。此外,硬件编译器仍然无法根据源规范生成最佳设计。改善这些问题的最新趋势包括领域特定语言(DSL)特定于域的加速器(DSA)。领域特定语言(DSL)提供高级领域特定语言抽象,以提高可编程性,同时简化程序分析和转换,使相应的DSL编译器能够提供性能。暗房[17]、参宿七[18]、卤化物[32],希帕克[19]和PolyMage[9]是一些用于表示复杂图像处理管道的DSL示例。
    当涉及DSA时,大致有两种方法可用:(1)每个程序加速器和(2)覆盖一类程序的加速器。大多数前期工作[9,17,18,19,32]将DSL转换为DSA属于每个程序类别,即这些编译框架为特定的输入源程序生成固定硬件。这种方法需要耗时的设计合成和FPGA重新刷新来加速域中的不同算法,这在许多边缘和深度嵌入式应用程序中非常昂贵,而且可能不可行。
    与此固定函数方法相反,DSA与特定函数绑定覆盖架构可以处理广泛的计算。覆盖层仅在FPGA上合成和刷新一次,计算通过运行时系统的软重新配置进行编排。这不仅对边缘应用程序而且对云都非常有益。许多公司在云上提供高性能的特定于域的API作为服务。客户机API请求被安排在加速器集群上进行处理。中的工作[5]对现有的学术和商业努力进行批判性分析,以在数据中心和云计算中提供FPGA加速。与特定任务的加速器相比,通用DSA或覆盖有助于更轻松的调度和更好的资源使用。此外,越来越需要基于FPGA的加速器来实现编辑-编译-运行软件开发人员熟悉的流程,而不是硬件合成地点和路线[37].
    我们可以将FPGA覆盖大致分为两种类型:基于指令的和非基于指令的。基于指令的覆盖,例如[2,7,36,37,40]使用专门的软核处理器,通常会导致处理器设计的fetch-decode-execute模型导致效率低下。在本文中,我们提出了一种用于图像处理管道的非结构化FPGA覆盖。更具体地说,我们做出了以下贡献。
    首先,我们创建了一个名为FlowPix的前端DSL,它是在Scala中构建的,使程序员能够使用最少的代码行来表达复杂的图像处理管道。其次,我们提出的覆盖体系结构非常适合映射不同的DAG结构和操作,并且这种映射是在使用DAG节点的宏观级别上进行的,而不是通过指令在微观级别进行的。这种覆盖结构可以利用图像处理算法中常见的数据和流水线并行性。最后,我们在Virtex7-690t FPGA上处理了15个图像处理基准,包括简单的滤波器和复杂的金字塔系统,从而证明了我们框架的有效性。我们的结果与基于前端规范生成固定功能硬件的现有DSL-to-FPGA框架相当,在某些情况下甚至更好。

    2相关工作

    使用HLS推出高性能硬件[12,24]就像使用C开发高性能软件[32]. 通过在高级语言之上使用领域级抽象,以DSL和微架构模板的形式,生成与领域相关的硬件块,可以克服此限制[15,21,26]. Aetherling公司[13]是一种DSL,它将高级图像处理算法编译为硬件,重点是探索资源与吞吐量之间的权衡。DSAGEN公司[39]DSL使用杂注对算法进行注释,并自动在大型架构设计空间中搜索一系列算法。花朵[1]是一个全面的编译器基础设施,它为从特定于域的库进行高级综合提供了自动规范转换。这使得程序员能够专注于算法实现,而不是数据流架构的低级优化。任何HLS[28]是一种以模块化和抽象的方式综合FPGA设计的方法。AnyHLS能够通过使用编程语言特性(例如类型和高阶函数)来提高现有HLS工具的抽象级别。研究人员基于图像处理领域的线缓冲管道模型创建了图像处理DSL。暗房[17],使用同步数据流模型将模具和逐点计算的管道转换为自定义硬件[22]. 生成的管道是静态调度的,支持单速率处理,吞吐量为一个像素/周期。参宿七[18],Darkroom和支持的多速率管道的后续工作,使程序员能够指定以一个像素/周期以外的吞吐量运行的管道阶段。在这两个框架中都使用了整数线性规划公式来计算行缓冲区大小。Rigel使用FIFO缓冲区处理两个管道阶段之间的变化。FlowPix采用更直观的DAG公式和数据中继技术来查找和优化管道中的缓存线大小。
    关于设计新DSL的努力,已经有一些工作使用FPGA后端来增强针对CPU和GPU架构的预先存在的DSL。这个卤化物HLS框架[32]扩展了Halide编译器[33],允许用户在FPGA上加速其程序。该系统提供了高级语义来探索应用程序的不同硬件映射,包括更改各个阶段的吞吐量的灵活性。PolyMageHLS公司[10],编译器扩展了PolyMage[25]DSL到目标FPGA。它通过创建管道的多个副本来并行处理图像块,从而利用了粗粒度并行性。PolyMage和Halide发射HLS-C并将输出馈送至Vivado HLS以生成硬件。O.Reiche等人。[34], [41]探索了图像处理和一个名为Hipacc的源到源编译器,该编译器可以产生高效的硬件加速器。通过利用空间和架构信息,Hipacc可以生成定制的实现,这些实现可以与手写源代码竞争,而无需硬件架构专家。DSL的功能支持为广泛的目标平台定义算法,并允许利用特定于目标的并行形式。
    与基于DSL的框架相比,还提出了基于FPGA的软核处理器来加速域计算。例如[20]提出了GraphSoC,一种用于加速图形算法的自定义软处理器。然而,设计此类处理器的主要挑战是简化可编程性,同时提供性能。中的工作[38]提出了一个图像处理处理器(IPPro)这是为了加快图像处理操作而定制的。IPPro是一种16位有符号定点、五级平衡流水线RISC体系结构,利用了典型FPGA的DSP48E1功能。迫切需要更具创新性的领域特定处理器设计,以摆脱传统的5级RISC设计。我们在本文中提出的覆盖处理器就是朝着这个方向迈出的一步。叠加设计的本质在于它们能够消除对传统指令的需求,允许通过使用控制字进行直接的硬件控制。这些控制字使硬件能够一致地处理新数据并重复执行相同的功能,直到使用新的控制字重置。这与基于指令的处理器形成了鲜明对比,后者需要新的指令和数据,即使是重复的任务。此外,在某些情况下,将域中固有的并行映射到典型的处理器管道是一项挑战。然而,可以有目的地设计覆盖层,从地面开始考虑平行性。尽管叠置处理器已经在包括人工智能在内的各个领域被提出,但对其在图像处理领域的应用研究却明显不足。在本文中,我们旨在解决这一差距。

    流量像素概述

    FlowPix包括DSL前端、编译器和后端硬件覆盖。DSL嵌入在Scala语言中。可以将FlowPix DSL代码作为在底层CPU上执行的另一个Scala程序来运行。此功能为程序员在开发周期中提供了便利。可以使用CPU执行模式,而不会因调试而导致昂贵的硬件执行。FlowPix编译器构造有向非循环图(DAG)来自源DSL程序。它将DAG映射到覆盖中的处理引擎,并相应地生成控制字序列。覆盖配置为通过这些控制字处理DAG计算。C++驱动程序将控制字之后的图像帧流式传输到覆盖层。覆盖将继续执行相同的计算,直到驱动程序使用不同的控制字序列对其进行重新配置。1总结了FlowPix DSL程序的编译和执行流程。
    图1。
    图1上图描述了FlowPix中程序编译和执行的总体流程。编译器接受DSL代码并生成一系列控制字。有向非循环图(DAG)被划分为更小的簇,每个簇都映射到一个计算单元(CU)。驱动程序使用生成的控制字配置覆盖,并流式处理输入图像。图像被分割成更小的条带,这些条带在可用CU中同时进行处理。输入图像只流式传输一次,从集群执行中创建的部分数据由覆盖进行内部缓冲。
    FlowPix覆盖设计为计算单位(CU)每个CU进一步由一个数组组成处理引擎(PE)通过FIFO接口连接在管道中。反过来,每个PE都有一个完全流水线设计。因此,两者PE内PE间流水线并行在CU中被利用。图2显示了FlowPix覆盖的计算层次如何利用不同类型的并行。DAG在处理之前被分解成更小的计算块,称为集群。每个DAG集群都计划在单个CU上执行。拓扑排序的DAG集群映射到PE,以便于在PE内和同一CU中的PE之间进行流式数据流计算。如果可用PE少于集群数量,我们可以通过重新配置PE来进行多路复用。生成的中间数据是内部缓冲的,无需进行片外DDR内存访问。较新的集群配置为通过软重新配置在覆盖上运行,以处理此中间数据以生成最终处理的图像。由于我们可以在运行时以最小的周期重置PE控制字,因此重新配置成本低廉。我们在第节对此进行了更详细的讨论4.
    图2。
    图2该图说明了在FlowPix覆盖图上执行图像处理算法(表示为算法A)期间利用的各种类型的并行性。算法A被划分为逻辑计算块,每个逻辑计算块由多个计算步骤组成。算法A的结构与覆盖的计算层次结构一致。该层次结构包括由处理PE组成的CU,PE进一步由PU组成。在更高或宏观级别上,CU和PE利用数据和流水线并行,而PE中的PU网络在更详细或微观级别上利用这些形式的并行。
    我们使用Bluespec System Verilog(BSV)来实现我们的覆盖。覆盖具有参数化设计。这是由BSV的功能所实现的,这些功能包括参数化模块和接口,允许编写和维护单一、紧凑的源代码,以涵盖广泛的体系结构选择。根据FPGA和工作负载特性,可以在硬件合成时配置每个CU内CU的数量和PE阵列的大小。如果存在更多CU,则会在所有CU中实例化相同的计算。根据CU的数量,将图像垂直分为相等数量的条带。每个条带的大小是基于覆盖层的内部存储器的大小固定的。因此,可用的数据并行性通过在CU上并行处理板条来利用。在CU内的PE阵列上处理单个条带。覆盖层有一个专用的控制存储器,用于存储控制字。该内存分布在PE上。分布逻辑将传入的控制字路由到其在控制内存中的正确位置。覆盖图中经过处理的图像被流式传输回驱动程序,并从驱动程序向上传递到应用程序逻辑。并行CU还可以用于处理不同的工作负载。换句话说,FlowPix框架可以同时加速两个或更多类似的图像处理工作负载。可以将新的DSL前端添加到FlowPix框架中。新的前端必须生成正确的控制字序列,并且基础结构的其余部分保持不变。

    4流动像素语言

    本节简要介绍图像处理管道的背景,然后说明如何使用FlowPix DSL表达它们。

    4.1图像处理管道

    图像处理管道通过以有向无环图(DAG)形式连接的一系列阶段将输入图像转换为输出图像。DAG中的每个节点表示管道中的一个阶段,该阶段对输入图像像素进行计算并生成输出帧像素。两个DAG节点之间的边表示阶段之间的生产者-消费者关系。DAG中的每个节点可以是模具或点式阶段计算。模具阶段只有一个前置阶段。它对前置级沿边缘流式传输的中间输入图像应用模板操作。通常,模板操作是指在小像素窗口上进行卷积。然而,一般来说,它可以是任何过滤操作,例如最大值过滤器,用于对图像进行降采样。点式阶段可以有多个前置阶段。每个输出像素都是使用沿传入边流的中间输入图像中的相应输入像素来计算的。DAG中的各个阶段可以并行执行,这取决于依赖性约束和数据可用性。这导致了流数据流模型适合在FPGA中实现的计算。
    逐点阶段不需要缓冲,因为需要输入,单个像素正是前一阶段产生的。相反,模板操作需要来自上一阶段的多个输入像素。例如,使用3×3高斯算子,非锐化遮罩管道中的模糊阶段需要输入图像的垂直和水平方向上3个像素。输入像素以扫描行顺序到达。因此,在执行计算之前,阶段必须缓冲至少两行输入帧。这被称为行缓冲,因为它缓冲输入图像的行。各阶段之间的行缓冲器的存在确保了中间值从生产商馈送到消费者,而无需任何外部存储器干预,这是一个相当大的节能。

    4.2前端DSL

    我们的DSL嵌入到Scala语言中。DSL程序员可以使用所有Scala功能和嵌入式DSL构造来指定图像处理管道。计算管道中的所有输入图像和中间图像都存储为类类型的Scala对象阶段。通过运算符重载处理图像上的点计算。通过实例化过滤器使用适当的参数初始化。DSL中当前支持的筛选操作包括卷积,最大值,最小值,总和平均的。可以在我们的DSL编译器基础结构中轻松支持更多的过滤器操作。我们免除了程序员在每个计算步骤中指定图像尺寸的任务。相反,我们的编译器通过DAG分析自动推断维度。
    标准图像处理算法,非锐化遮罩(USM)是数字图像处理系统中常用的图像锐化技术。在信号处理环境中,我们可以将其视为放大输入信号高频分量的滤波器。该算法表示为三个操作的组合。首先,a模糊该操作沿y和x方向对原始输入图像执行高斯模糊。第二次操作,锐化,计算合成模糊的加权和并输出锐化图像。最后阶段,面具,在原始图像和锐化图像之间选择要写入输出的像素。基于原始图像和模糊图像之间的差异,跨越阈值选择锐化像素。
    清单1。
    清单1Unsharp Mask管道的.FlowPix代码。
    显示了与Unsharp Mask(USM)基准关联的计算DAG。模板和点线阶段分别由菱形和圆形符号表示。表中给出了与每个阶段相关的计算1清单1显示了USM基准测试的FlowPix代码国际货币基金组织通过将有效的图像路径传递给阶段类。程序中的其他阶段对象模糊(第7行),锋利的(第9行),脱粒(第10行)和面具(第11行)对应于DAG中的不同阶段。位于模糊通过应用过滤器获得级内核在图像上国际货币基金组织(第7行)使用**操作员。内核是通过实例化过滤器用合适的模版矩阵作为参数进行分类(第3行)。过滤器实例化中的前两个参数分别对应于过滤器维度和过滤器步幅。过滤器维度是由两个整数组成的元组,用于指定过滤器的行数和列数。过滤器步幅是由两个整数组成的元组,对应于过滤器在图像上移动的行步幅和列步幅。最后一个参数指定卷积运算的权重。第9、10和11行上的点操作被写为图像对象上的表达式。输出Stage对象面具通过将图像路径传递给存储图像(_I)方法提供阶段类。
    表1。
    阶段计算
    \(输入\图像\)
    模糊\(\frac{1}{16}\left[\begin{smallmatrix}1&2&1\\2&4&2\\1&2~1\end{smallmatrix}\right]\)
    锋利的\(0.8I\左(i,j\右)-模糊\左(i,j\左)\)
    三个\(0.2I\左(i,j\右)-模糊\左(i,j\左)\)
    面具\(thres\左(i,j\右)\gt=0\)
     \(?I\左(I,j\右):锐利\左(I,j\左)\)
    表1.表
    计算
    图3。
    图3.DAG公司
    4和表2显示了DAG和2级高斯金字塔基准的相关计算。此基准使用最大值过滤器。下采样阶段使用DAG中的倒金字塔符号表示。清单2显示了相应的FlowPix代码。
    表2。
    阶段计算
    \(输入\图像\)
    \(模糊_)\(\frac{1}{16}\left[\begin{smallmatrix}1&2&1\\2&4&2\\1&2&1\end{smallmatrix}\right]\n)
    \(向下0 \)\(\压裂{I}{4}\\)
    \(模糊_1\)\(\frac{1}{16}\left[\begin{smallmatrix}1&2&1\\2&4&2\\1&2~1\end{smallmatrix}\right]\)
    \(向下1\)\(\压裂{I}{16}\\)
    表2.计算
    图4。
    图4.DAG公司
    清单2。
    清单2。2层金字塔的代码。
    首先使用\(3乘以3)褶积滤波内核(第3行),然后传递给\(2乘以2) 最大值滤波器向下(第2行)。这个最大值滤波器输出像素窗口内强度最高的像素。窗口以2的行和列步幅移动,将图像缩小了4倍。在第2行中,第一个元组表示过滤器维度,而第二个元组则表示行和列步幅。重复卷积和最大池阶段以生成最终输出图像。迭代计算是使用Scala的循环构造表示的。将上述对图像进行卷积和下采样的计算序列放入一个循环中,从而使一次迭代的输出图像作为下一次的输入图像。图像以迭代方式下采样到\(\压裂{1}{16}^{th}\)使用循环迭代计数为2的原始维度。

    5流动像素覆盖层体系结构

    覆盖的结构由一组计算单元(CU)组成,如图所示5为了将控制和数据字从主机CPU传输到覆盖层,使用了共享的控制和数据总线。主机输入最初存储在FPGA DDR内存中,然后通过AXI DMA流式传输到覆盖层MM2S(内存映射到流)频道。CU由在管道中链接的处理引擎(PE)组成,通过流式FIFO接口进行数据交换。CU的数量和大小在基于FPGA资源的合成过程中预先确定。构成覆盖层整体控制内存一部分的本地控制寄存器指示CU的运行时行为。使用有限数量的BRAM内存库在本地缓冲来自CU的输出。然后通过AXI DMA将输出传输回CPUS2MM(流到内存映射)频道。根据计算时间表,存储的输出也可以循环回CU。
    图5。
    图5。FlowPix覆盖是控制单元(CU)的集合。CU独立运行,从通用控制和数据总线接收控制和数据输入。

    5.1处理引擎

    覆盖的主要执行单元是处理引擎(PE),见图6,包括执行计算的处理单元(PU)。每个PU接受三个输入,有两个标量单元,可以执行简单的操作,如加法、减法、乘法和比较。当使用三个输入值时,两个标量单位可以级联使用。PU还包含存储控制字和常量的寄存器。除了计算PU之外,在计算PU之间还有其他中继PU。这些中继PU负责在不执行任何处理的情况下转发数据。稍后我们将深入研究这些继电器PU的具体功能。PE具有参数化设计,其形状和尺寸在合成过程中由两个参数设置:\(P_x\)\(_y\)PE体系结构分为四个流水线级、一个输入缓冲级和三个计算级。计算阶段由PU阵列的流水线序列组成。PU阵列的数量及其互连在不同阶段有所不同。
    图6。
    图6.FlowPix覆盖内处理引擎(PE)的体系结构。PE控制单元是覆盖层整体控制存储器的一部分。中继PU在图中以红色显示。
    PE的输入是矢量的形式。PE的输出流式传输到CU内的下一个PE。PE序列中最终PE的输出存储在CU内存库中。第一个计算阶段执行模板计算,并设计为乘法累加单元。此阶段的PU以树状结构排列,树的底部具有\(4倍P_x)PU。下一个阶段计算逐点操作,包括\(_y\)具有的数组\(P_x\)每个阵列中的PU。最后一级有一个带有\(P_x\)PU和处理升采样或降采样操作。此阶段最多可以执行\(P_x\)下采样操作或单个上采样操作。PE的输入可以是来自主机的新数据,也可以是存储在CU内存库中的前一次执行的部分数据。输入缓冲是使用一组行缓冲区来完成的,行缓冲区是使用FPGA BRAM构建的存储结构,它缓冲输入图像中的最少行数,以生成方形窗口。FlowPix中使用的行缓冲区设计来自[8]并且可以动态编程以生成在输入上随步幅(默认步幅设置为1)移动的任何窗口大小。PE中计算阶段的顺序与所分析基准的计算模式一致。为了说明这一点,大多数基准测试都将模具应用于输入图像,然后执行逐点操作来组合模具输出。然后对中间输出图像进行上采样或下采样操作。当阶段顺序不同时,会导致资源利用不足,因为在基准映射过程中必须跳过某些阶段。下文将更详细地讨论PE的三个计算阶段。
    模具阶段:-模版操作通常涉及对值进行乘法和累加的计算。模具级中的处理单元(PU)以还原树状图案排列。该阶段包括\(m+1)PU阵列,其中等于\(\log{(4\次P_x)}\).阵列内的每个PU从阵列中的相邻PU读取两个输入值\(i-1)。第一个PU数组执行乘法,而后续数组处理累加步骤。二进制约简树对于计算大小为2的幂次的模具窗口是有效的,但这种窗口大小在图像处理算法中并不常见。通常,窗口大小为\(3乘以3),\(5乘以5)为了解决奇数大小的问题,可以对窗口进行零填充,使其大小为2的幂,但这种方法使用的PU不足。当此阶段并行处理尽可能多的模具时,可实现最佳吞吐量。因此,我们使用一种独特的数据布局,跨第一个PU阵列重新排列行缓冲区窗口。该布局如下所示。
    建议的方法是将每个模具窗口拆分为大小为2的幂次的较小分区。例如\(3次3次)窗口被划分为两个较小的分区,大小分别为8和1。通常,窗口大小为\(k^2)最多可以分解为w个分区,表示为\(p_0\)通过\(p{w}\),其中\(w=\lfloor{\log_2(k^2)}\rfloor-1)。在新的数据布局中,所有窗口中大小相同的分区彼此相邻。这些分区组根据大小从左到右排序。位于模具阶段中的映射器模块可以访问由行缓冲区创建的所有窗口。它是一个多路复用器阵列,将值从行缓冲区窗口映射到PU的输入端口。多路复用器配置为实现此数据布局。
    为了说明模具阶段的数据布局和操作,我们在图中提供了一个示例7在(a)部分中,模具阶段处理两个\(1乘以3)模具窗口。窗口首先被划分为大小分别为2和1的两个较小的分区。然后使用数据布局[2,2,1,1]在前6个处理单元(PU)上重新排列分区,滤波器系数存储在PU寄存器中。类似地,在第(b)部分中,模具阶段处理单个\(1乘以7)窗口,分为三个较小的分区,大小分别为4、2和1,并排列在前7个PU上。图(a)部分7,第一个PU阵列产生的6个部分产品由其余PU阵列累加。这是通过首先将与窗口对应的分区减少为树中的单个值来实现的。减少的值\(r)^{米}_{i} \)对应于分区\(第页^{米}_{i} \)大小为,属于窗口,并在\(\log{m}^{th}\)数组。例如,图的(a)部分7,2个大小的分区\(p_{1}^2\),\(p_{2}^2 \)减少到单个值\(r{1}^2\),\(r{2}^2)第二次(\(\log{2}=1\))PU阵列。与窗口相对应的所有减小的值必须组合成单个值,这是不可能使用级别到级别的PU互连的,因为减小的值位于不同的PU阵列。因此,使用移位器和阵列之间的向量寄存器对减少的值进行对齐和转发。水平向量寄存器存储\({i-1}^{th}\)PU阵列。减少的值\(r{1}^1)\(r{2}^1)大小为1的分别存储在第一向量寄存器内的位置5和6。这些值需要添加\(r_{1}^2 \),\(r{2}^2),由第二PU阵列的第一个和第二个PU产生。\(r{1}^1)\(r{2}^1)如果提前生成,则通过将第一个向量寄存器移位4个单位,将它们移到位置1和2。随后,传播这两个值。第一个和第二个PU将转发值与从树结构中的前一个PU接收的输入相加,以生成最终输出。模具阶段还支持其他缩减运算符,例如窗口上的最大值或最小值。在模具窗口上使用最大或最小运算符时,模具系数设置为1,PU配置为使用最大或最低函数而不是乘法和累加来执行缩减操作。这是因为max和min运算符不需要与滤波器系数相乘,而是需要比较值以找到最大值或最小值。因此,根据所需操作,PU设置为使用最大或最小函数累积部分结果。
    图7。
    图7图中显示了PE的两种动态配置。部分(a)PE执行两个1×3模板。在第(b)部分中,PE执行单个1×7模板。
    逐点阶段:-逐点阶段可以从模具阶段或直接从输入向量获取输入,绕过模具阶段。此阶段中的PU阵列都是等长的,数据交换通过阵列之间的全对全路由网络进行。该网络由多路复用器组成,这些多路复用器在电平处连接PU的输出至PU的输入端\(i+1)级间复用器由主机生成的控制字配置,该控制字还确定每个PU内的标量单元的操作。在级联模式下,PU使用标量单位和三个输入值。第一标量单元处理前两个输入,而第二标量单元操作第一个单元和第三个输入值的输出。形式的三元运算符\(E_1\odot E_2?E_3:E_4)被视为逐点操作。在这里\(E_1)通过\(E_4\)是逐点表达式,并且\(\奥多特\)是一个关系运算符。此操作也由逐点阶段处理,如下所示。假设表达式\(E_1)虽然\(E_4\)已处理。两个PU单元,执行操作\(R_1=E_1\odot E_2\)\(R_2=\l不是(E_1\不是E_2)\)。的值\(R_1\)\(R_2\)是1或0。在此之后,从连续级别计算出另外两个PU\(S_1=R_1\乘以E_3\)\(S_2=R_2\乘以E_4\)。的值\(S_1)是其中之一\(E_3\)或0,以及的值\(S_2)是其中之一\(E_4\)或0。最后,\(S_1)已添加到\(S_2)以获得最终值。总之,在计算三元运算符中的四个逐点表达式后,逐点阶段利用分布在3个数组中的5个PU来生成最终输出。
    升样-降样阶段:-在此阶段,可以同时对多个图像进行降采样,也可以对单个图像进行二倍的升采样。在降采样的情况下,单个处理单元(PU)负责此操作。为了执行下采样,配置PU内部的标量单元。PU寄存器设置为需要降采样的输入图像的行长度。当接收到输入数据时,标量单位增加一个计数器,以跟踪图像的行和列索引。标量单元然后每隔一行和一列输出数据,有效地将图像大小减少了一半。
    上采样操作由多个PU与上采样模块一起处理。如果要上采样的图像是较早生成的,则会通过逐点阶段中的中间PU将其转发到此阶段。通过生成\(2次2次)每个接收到的单个输入的矩阵。更准确地说,对于每个像素\(w{r,c}\)属于\(r^{th}\)行和\(c^{th}\)输入图像的列,矩阵\(W=[0,0,0,W_{r,c}]\)生成。共产生四个PUW公司前3个PU被配置为在输出中产生0,并且第四个PU转发接收到的输入\(w{r,c}\).矩阵W公司由上采样模块读取,该模块将其存储在四个内部内存库中\(U_{0}\)通过\(U_3\)以条纹的方式。请注意,这些存储库与CU存储库是分开的,并且是上采样模块的专用存储库。上采样模块将四个存储库中的数据按顺序整理并存储为其中一个CU存储库内的单个放大图像。这是通过清空银行来完成的\(U_0\)通过\(U_3\)以交错的方式。\(U_0\)包含来自行的数据\(0, 2, 4, 6...\)和列\(0, 2, 4, 6 ...\).\(U_1\)包含来自相同行索引但奇数列的数据。\(u2\)\(U_3\)分别包含奇数行、偶数列和奇数列。排水顺序从读取单个值开始\(U_0\)后跟中的其他值\(U_1\),在两者之间交替,直到填充第0行B类; 在这里,B类是CU内存库。然后重复相同的交替顺序\(U_2\)\(U_3\)直到第1行填写完毕B类此时,上采样模块再次切换回前两个气缸组。重复此交错序列,直到放大图像的所有行都被缓冲B类,标志着升采样操作的结束。

    5.2控制存储器

    覆盖层的动态配置作为控制字存储在控制存储器中,如图(b)部分所示8控制存储器分布在CU的所有模块上,每个模块具有其自己的一组专用寄存器,以存储用于其运行时功能的控制字。这种设计确保模块读取各自的控制字时不会产生通信瓶颈。控制字为32位(16位索引和16位值),并通过分层树结构控制总线传输。16位索引用于通过控制总线的层次树结构路由值。例如,树的顶层将控制字路由到正确的CU,然后下一层将其路由到PE,下层将其路由至PE内的模块。
    图8。
    图8。该图显示了数据和控制内存在覆盖中的组织方式。数据存储器特定于CU,由一系列128 KB的内存组构成。另一方面,控制存储器使用寄存器构建,并分布在所有覆盖模块中。
    在每个计算阶段之前,会启动一个控制阶段来设置控制字。尽可能减少设置控制字所花费的时间对于减少失速周期至关重要。主机设置位向量寄存器E类在控制阶段开始之前。每个依赖于控制字的覆盖模块在向量中都有相应的位表示。仅限中有设置位的模块E类在控制阶段重新配置,而其他人继续执行其先前控制字设置定义的相同功能。

    5.3数据存储器

    CU的输出存储在数据存储器中,如图(a)部分所示8输入数据总线将输出数据流从PE传输到一组128 KB的内存库。每个银行都有其生成读写信号的控制单元,并且可以配置为存储矢量数据流的任何索引中的数据。输入向量\(D[0:n]\)从一家银行转播到另一家银行。当控制单元激活银行的存储信号时,银行读取\(D[i]\)输入向量的数据值并将其存储在内存中。指标值存储在银行的控制存储器中。未激活其存储信号的存储体通过数据总线将输入向量转发到序列中的下一个存储体。当写入信号被激活时,银行在输出数据总线上传输其输出。输出数据总线是并行的,所有银行都可以同时访问。根据CU控制单元确定的行为,所有组的输出连接成一个向量,该向量可以发送回主机CPU或循环回CU。环回数据作为未来CU计算的输入。

    6流动像素编译器

    FlowPix编译器从DSL代码生成控制字序列。生成这些控制字类似于传统编译器中的代码生成步骤。编译器可以大致分为三个阶段,如图所示1第一阶段DAG生成器阶段,涉及处理DSL代码以创建DAG表示,其中节点表示计算,边表示生产者-消费者关系。此DAG存储在内部,供其他两个阶段使用。然后,编译器在DAG上执行范围推断传递,以计算每个节点的图像尺寸,这对于为每个节点生成正确的控制字并确保正确的硬件执行是必要的。映射器是FlowPix编译器的第二阶段,它在DAG节点和计算单元之间建立映射。映射器有两个子阶段:集群和延迟匹配。在集群阶段,DAG被分解为更小的子图,称为集群,表示单个CU可以一次执行的最大DAG节点数,受某些约束。然后在延迟匹配阶段调整形成的集群,以考虑可变延迟节点。在最后阶段,控制序列生成器为集群中的每个映射节点生成一个控制字序列。在此阶段,编译器可以访问有关每个DAG节点的足够信息,包括其类型、父节点和CU映射。例如,对于模具节点,编译器了解模具大小、步幅、系数以及输入和输出图像尺寸。编译器的三个阶段无缝地协同工作,将DSL代码转换为控制字序列,从而正确高效地执行图像处理管道。
    \(\begin{align}\mathtt{Ordering\constraint}\rightarrow\hsspace{7.22743pt}&L(x)\lt L(y)\rightarrow P(x)\ lt P(y)\ end{aling}\)
    (1)
    \(开始{align}\mathtt{Location\constraint}\rightarrow\hsspace{7.22743pt}&P_{low}(t(x))\le P(x)\lt P_{high}(t(x)
    (2)

    6.1 DAG聚类

    聚类阶段将DAG划分为簇,簇是可以由CU处理的较小计算块。聚类期间不考虑CU的多重性,因为映射到CU的所有图像条带都是通过同一簇处理的。输入DAGS公司被分成不同的集群\(S_1),\(S_2),以此类推,直至\(S_n\)。然后将集群内的DAG节点映射到PE内的PU,假设可以访问整个CU来执行集群。最初,S公司被视为单个集群。然后,编译器尝试将PU分配给S公司同时遵守一组约束。分配的节点构成集群\(S_1\)此过程递归应用于其余DAG\(S-S_1)创建下一个集群\(S_2)。该过程将持续到S公司是空的,没有形成更多的簇,因此实现了收敛。
    为了分配PU,DAG节点首先按拓扑顺序排序,并分为不同级别,表示为\(L_0\)通过\(L_n\)例如,图9,DAG被分割成四个级别,\(L_0=[A、B、C]\),\(L_1=[D]\),\(L_2=[E]\)、和\(L_3=[F]\)。DAG级别与可用PU阵列匹配,表示为\(P_0\)通过\(_m\)回想一下,PE中的PU阵列分布在模具、逐点和上采样/下采样阶段。节点的类型x个,表示为\(t(x)\),确定哪个PE级或PU阵列可以处理它。允许处理给定节点类型的PU阵列的范围由下式给出\(P_{低}(t(x))\)\(P_{高}(t(x))\)。对于模具和上/下采样节点,\(P_{低}\)\(P_{高}\)值是相同的,因为它们被分配给单个PU阵列。模具节点只考虑位于乘法累加树底部的PU数组。
    图9。
    图9插图描述了编译过程的各个阶段。FlowPix编译器为输入DAG生成一系列控制字。
    为了确保正确的映射,PU到节点的分配必须满足两个约束:排序约束和位置约束,由方程式表示(1)和方程式(2)分别是。排序约束保证DAG节点按级别顺序映射到PU阵列。如果有两个节点,x个,属于DAG级别\(L(x)\)\(L(y)\)分别是,和\(长(x)长(y)),然后是节点x个必须分配给PU数组,由\(P(x)\),指数较低。此约束确保数据在CU内的流动方向与在DAG中的流动方向相同。位置约束限制可以为其分配特定类型节点的PU阵列集。确定正确的PU阵列后,通过分配该阵列中的下一个可用PU来完成分配。编译器维护PE内所有PU的可用性映射。如果无法为给定节点找到合适的PU,编译器会考虑CU内的下一个可用PE。如果所有PE都用完了,编译器会合并当前集群,重新初始化映射数据结构,并使用剩余的DAG节点创建下一个集群。

    6.2延迟匹配

    假设我们有一个映射到CU的集群,集群内有三个节点:x个,、和w个.节点w个向节点发送数据x个,它们映射到\(i^{th}\)\(j^{th}\)PU阵列,其中\(j-i \gt 2).节点x个映射到\(j+1^{th}\)CU内的PU阵列。执行期间,在为节点分配的PU之间直接交换数据w个x个因为它们位于相邻的PU阵列中。然而,节点之间没有直接连接x个。为了确保执行正确,大小为的缓冲区\(j-i\)必须放置在x个不幸的是,PE在PU之间没有缓冲容量,因此额外的PU从\(i^{th}\)\(j^{th}\)数组。编译器在集群中创建中继节点,并在\(j-i-2\)介于之间的数组。
    中继是一种用于处理映射节点的输入边上的可变延迟的方法。为了确保中继成功,PE内的每个PU阵列都有一组保留的PU,用作转发单元。这些转发单元是轻量级的,不执行任何计算。此类PU的数量等于阵列的长度。编译器根据DAG节点之间的边缘延迟差异配置中继节点。中继示例如图所示9.节点E类映射到第四个PU阵列接收来自节点的输入B类,位于第一个PU阵列。因此,在它们之间配置了两个中继节点。然而,其他节点输入不需要中继E类因为数据是在前面的PU阵列中生成的。这同样适用于节点D类使用来自节点的输入A类C类.
    在某些情况下,集群内所有边缘的数据传输可能会因缺少中继节点而受到阻碍。让我们研究一个场景,其中PU由四个计算级别组成,每个级别都有一个中继节点。我们观察到这个星团\(S_1)(如图所示9)由于中继节点数量不足,无法映射到PU。出现这个问题是因为\(S_1)需要两个中继节点,这超出了可用数量。为了解决这个问题,编译器进一步划分集群,确保较小的集群获得足够数量的中继节点。在本例中,\(S_1)分为两个集群:一个包含节点A类,C类、和D类,以及另一个包括节点B类E类。集群的划分涉及从中删除节点\(S_1)创建两个新集群,即\(S^a_1\)(具有足够中继连接的精简集群)和\(S^b_1\)(包含删除的节点)。此过程递归应用于\(S^b_1\)。通过按相反的拓扑顺序选择节点来消除节点(在我们的示例中,从节点开始E类). 删除节点的所有从属节点也将被删除。此外,其输出不再被集群中的任何其他节点使用的任何节点(例如节点B类).

    6.3控制字生成

    在最后阶段,编译器生成对应于每个PU到节点映射的32位控制字。每个映射都是通过一系列控制字实现的,控制字的数量根据要映射的节点类型而变化。编译器将查找表中每个映射类型的控制字序列预先存储为模板。然后在编译过程中为这些模板指定特定值。例如,如果PU被映射到一个加法操作,则需要三个控制字。初始控制字配置标量单元以执行加法操作,而其他两个字使用相应的输入源索引建立PU的输入端口。这些源可以是集群内依赖的其他PU,也可以是集群间依赖的PE输入向量。
    在映射模具节点时,编译器生成一个控制字序列来配置缩减树,以便一起处理所有模具。首先,用模板大小、步幅和图像尺寸配置行缓冲区数组。查找表包含一组预定义的模具尺寸的行缓冲区设置,并且处理过的模具必须具有相同的形状。接下来,将映射器模块配置为创建数据布局(在第节中提到5.1)基于模具的数量和大小。模板系数被加载到位于约简树底部的PU寄存器中。模板级中的PU被预先设置为执行乘法和累加操作,PU阵列之间的移位单元被配置为适当的移位量。PU还可以配置mix/max操作,以分别处理mix/mas过滤器。最后,模板阶段的输出模块被配置为将正确的输出向下传递到逐点阶段。

    7流动像素调度程序

    使用驱动程序API的FlowPix调度程序负责调度编译器在运行时在覆盖上创建的集群。创建集群时假设整个CU内存库都可用于执行,但在运行时,CU内存池在所有集群执行中共享。调度器生成一个最佳/可接受的执行调度,通过只对输入图像进行一次流式传输,并将集群创建的部分数据保留在CU内存库中,将主机和FPGA之间的外部内存流量降至最低。但是,如果没有足够的内存库来满足调度的要求,调度程序将引发异常,用户必须使用更多的内存库重新合成覆盖。为了生成执行时间表,调度程序使用集群图和每个集群的控制字序列作为输入。簇图定义了簇之间的相互依赖关系,每个簇都有一个或多个父簇。集群图是一个DAG,也可以看作一棵树,生成最终输出的集群作为根。每个集群都是子树的根,要使集群符合执行条件,必须处理其对应子树中的所有集群。调度器使用动态映射跟踪集群中的哪些计算节点映射到哪个内存库。在更详细地讨论调度算法之前,让我们定义一些将在整个讨论中使用的术语。
    定义:存储集群输出所需的银行数量M(M)表示为\(B_o(M)\),而集群中的银行数量M(M)读取其输入,由\(B_i(M)\).考虑到属于以簇为根的子树的所有簇M(M),的最大值\(B_i\)被称为\(B_{imax}(M)\)本质上,\(B_{imax}\)确定计算子树中所有集群所需的最大输入库需求数。银行利用率\(U(M)\)对于集群,由以下公式给出\(B_o(M)-B_{imax}(M)\)。此值是集群使用的有效银行数的近似值。负值为的簇\(U(\cdot)\)指示用于计算所消耗的存储体的数量超过存储输出所需的存储体的数量的情况。在这种情况下,当前使用的CU银行数量减少。
    定理7.1。
    给定一组符合执行条件的集群,通过按其银行利用率的递增顺序处理集群,可以将总体银行利用率降至最低。
    证明。
    假设集群C类具有两个父簇,M(M)N个。我们可以做出这个假设,而不会失去问题的一般性。有必要计算M(M)N个计算之前C类.我们证明,如果\(U(M)\gt U(N)\),那么如果我们计算,银行利用率会更低N个首先是M(M).
    我们计算了当M(M)首先计算,然后是N个.\(B_{imax}(M)\)是计算所需的最大输入库数M(M).的输出M(M)存储在\(B_o(M)\)银行。接下来,计算N个,\(B_{imax}(N)\)利用银行。因此,此计算序列中使用的最大银行数为\(最大B_{imax}(M),B_o(M)+B_{imax}(N)\rbrace})等于\(B_o(M)+B_{imax}(N)\)。这可以通过使用我们的初始假设进行简单替换来证明\(U(M)\gt U(N)\).
    \(开始{align*}B_o(M)-B_{imax}(M)&\gt B_o}\)
    现在,什么时候N个首先计算,然后是M(M),使用的最大银行数量为\(最大B_{imax}(N),B_o(N)+B_{imax}(M)\rbrace})。这里有两种情况需要考虑。
    (1)
    \(\mathbf{B_{imax}(N)\gt B_o(N)+B_{imax}(M)}\):因此,使用的最大银行数为\(B_{imax}(N)\).如果执行M(M)首先导致银行利用率降低,然后\(B_o(M)+B_{imax}(N)\)必须小于\(B_{imax}(N)\)。这意味着\(B_o(M)\lt 0)这是不可能的。
    (2)
    \(\mathbf{B_{imax}(N)\lt B_o(N)+B_{imax}(M)}\):因此,使用的最大银行是\(B_o(N)+B_{imax}(M)\).如果执行M(M)首先导致银行利用率降低,然后\(B_o(M)+B_{imax}(N)\)必须小于\(B_o(N)+B_{imax}(M)\)通过简单的重新排列,\(B_o(M)-B_{imax}(M)\lt B_o,暗示着\(U(M)\lt U(N)\)这与我们最初的假设相矛盾。
    因此,我们得出结论:如果\(U(M)\gt U(N)\),然后N个必须首先计算,以实现较低的总体银行利用率。□
    调度算法:FlowPix调度程序通过一致选择具有最低库利用率的集群来生成可接受的调度(如果存在)。该算法从集群DAG的根开始。它递归地访问其根节点具有最低利用率的子树。生成的集群执行序列可确保正确使用CU内存库(见定理1)。

    7.1示例

    我们使用一个虚拟基准,见图10,以演示FlowPix中的集群和执行。我们使用单个CU配置覆盖层,其中包含一个PE。PE配置为\(P_x=6\)\(P_y=4\)。CU最多可以处理两个\(3乘以3)并行模具节点。聚类步骤导致创建6个标记为\(S_1)通过\(S_6\).DAG节点1、2和7占用同一集群,因为1和2是并行模具节点,可以放在同一集群中。逐点节点7取决于1和2的输出。集群\(S_2)\(S_3\)形成类似。模具节点10和11不适合集群\(S_1)\(S_2)因为它们从逐点节点接收输入,并且PE中没有数据路径来将数据从逐点传输到模具节点。由于PE处理单个上采样操作的限制,上采样节点14和15属于单独的集群。调度程序生成的集群执行序列将总体银行利用率降至最低。调度程序首先考虑\(S_6\)因为它是集群DAG的根。\(S_6\)依赖于\(S_4\)\(S_5\).合同双方\(S_4\)\(S_5\),调度程序开始\(S_4\)因为它的银行利用率(-1<0)低于\(S_5\).\(S_4\)取决于\(S_1)\(S_2),并且两个集群具有相同的利用率。源集群\(S_1)然后\(S_2)首先执行。在此之后,\(S_4\)执行。在以为根的子树中遵循类似的执行模式\(S_5\)这将导致集群的执行\(S_3\)\(S_5\)最后,\(S_6\)处理后,输出图像存储在单个存储器中。
    图10。
    图10图中描述了一个带有3×3模具、逐点和上采样节点的虚拟应用程序,以及它的集群和执行时间表。DAG集群在带有两个内存库的CU上执行。每个库上的数字对应于当前存储其输出的节点。

    8实验结果

    在Virtex-7-690t FPGA上,我们使用FlowPix执行了15个图像处理基准测试。基准测试包括一系列结构和复杂性,从简单的管道(如Unsharp mask)到相对复杂的管道(例如具有多个输入图像的光流)。我们还实现了迭代金字塔系统,如高斯金字塔和上下采样。我们将FlowPix与几种现有的基于FPGA的图像处理框架进行了比较,包括Polymage[25],暗室[17],异卤[23],和Vitis Vision库[11]. 这些框架根据DSL规范生成固定功能硬件。我们的基准套件如表所示此外,我们将FlowPix与IPpro进行了比较[38],它采用基于覆盖的方法。
    表3。
    SL编号基准首字母缩写描述
    1哈里斯角落HCD公司使用3×3模板和指向操作进行角点检测。
    2Canny Edge公司首席执行官使用5×5模板和点式操作进行边缘检测。
    高斯滤波器GAF公司3×3高斯滤波器在图像上的应用。
    4模糊BLU公司3×3像素窗口上的平均操作。
    5线性模糊模糊操作之后是2个线性变换操作。
    6金字塔PYR公司上采样或下采样高斯滤波器的金字塔
    7向下向上DUS公司单次下采样,然后进行上采样操作。
    8腐蚀ERS公司在3×3像素窗口上的最小操作。
    9中值的基础教学法硕士3×3像素窗口上的中值运算。
    10膨胀DIL公司3×3像素窗口上的最大操作。
    11卷积卷积和多项式相乘对图像进行8×8卷积运算。
    12卢卡斯·卡纳德斯里兰卡Lucas-Kanade光流算法的单次迭代。
    13模具链联合国安全理事会在管道中重复3次3×3模具操作。
    14高斯差分谷氨酸脱羧酶单高斯模糊和双高斯模糊的差异。
    15棱锥体混合发热体使用2级图像金字塔混合两个图像。
    表3简要描述在Virtex-7 FPGA上使用FlowPix实现的基准测试
    实验装置:我们的覆盖层是在Virtex-7 690t FPGA上合成的,具有3600个DSP块和6.4 MB的片上BRAM(2940个18Kb块)。此FPGA卡通过PCIe-8x链路连接到Intel Core-i5处理器。主机驱动程序是用C++编写的,在CPU上运行,它以行主顺序流式处理图像帧。我们使用Xillybus PCIe核心(http://xillybus.com/doc/revision-b-xl)要将主机输入与覆盖连接,请参见图11使用PCI Express v3.0的Gen3集成块,在具有8个Gen3通道的Virtex-7设备上操作时,Xillybus内核可以实现每个方向6.4 GB/s的理想数据带宽(从主机读取和写入)。有关详细信息,请参阅http://xillybus.com/doc/xillybus带宽。我们的硬件设计使用Bluespec System Verilog(BSV)[27]. 使用BSV,我们可以以原子方式使用一组事务或规则精确地指定所需的硬件,以全或单事务语义表示系统行为。所有报告的设计硬件特征都是使用2022.1版Vivado design Suite Post Place and Route获得的。为了匹配不同框架中各种基准测试中使用的数据类型和过滤器大小,我们通过更改数据类型和PE大小创建了PE的四个变体。表中列出了这些PE变体的特征5。虽然可能有其他设计变体,但我们选择了这四种特定的变体。CU中CU和PE的数量是根据使用的基准和框架确定的。为了最小化相对延迟和LUT消耗,我们使用一种PE变体合成覆盖,并增加CU的数量以匹配像素吞吐量。例如,当将FlowPix与一个为给定基准每周期生成32像素的框架进行比较时,我们综合了CU计数为8的覆盖,考虑到CU中的单个PE每周期生成4像素。匹配像素吞吐量后,我们增加CU内的PE计数,直到相对LUT增量在50%(1.5倍增加)阈值内。PE的增加是为了确定流水线并行是否可以减少实现的延迟,同时略微增加LUT资源消耗。
    表4。
    框架HCD公司首席执行官GAF公司USM公司BLU公司联合国安全理事会DIL公司ERS公司基础教学法硕士卷积和多项式相乘PYR公司斯里兰卡DUS公司
    流动像素1581361112221192310
    卤化物15-15729----16--
    Polymage公司43--16-------717550
    杂卤26-81321115222----
    表4.实现的基准的不同框架的代码行比较
    表5。
    建筑资料型态二甲苯土地使用税FF公司数字信号处理器BRAM(18千磅)频率MHz
    第1页16位8997016984176144200
    A2类8位8506286738880250
    A3号16位161368122111352272200
    A4(A4)8位1657219971176144250
    表5覆盖层的不同架构变体所消耗的FPGA资源
    \(_y\)在所有PE设计中设置为8。
    图11。
    图11该图描述了通过利用具有读写FIFO接口的Xillybus IP来集成FlowPix覆盖。这种集成允许主机通过简单的读写文件接口,轻松地将输入流传输到覆盖层,以及从覆盖层接收输出。输入图像只流式传输一次,在处理完所有簇后读取输出图像。
    为了准确测量基准测试的处理延迟,我们从总执行时间中减去环回时间。环回时间是指硬件在不进行任何处理的情况下流入和流出图像所需的时间。它包括诸如PCIe传输时间和Xillybus框架引入的其他开销等因素。为了在环回模式下建立硬件,我们删除FlowPix覆盖并将写入FIFO连接到读取FIFO,请参阅图11。需要注意的是,无论基准是什么,环回时间都保持在20毫秒不变。然而,值得一提的是,环回的时间计算中不包括传输控制字所需的时间,因为该值随所处理的基准而变化。

    8.1性能比较

    在本节中,我们对FlowPix和其他框架进行了比较分析,重点是它们各自的吞吐量和FPGA资源消耗。我们提供以下资源消耗详细信息查找表(LUT)翻转(FF),并且可以基于所使用的PE的数量来确定BRAM和DSP的总消耗。例如,如果我们使用16个CU覆盖,每个CU包含一个A4型PE,那么DSP块和BRAM的总利用率将达到\(16乘以176=2816)\(1乘16乘144=2304,)分别(参考表5). 4将FlowPix的代码行与其他框架进行了比较。为了确保公平客观的比较,我们在与相关框架报告的相同设置下处理每个基准。每个基准的配置包括图像宽度等规格(W公司),高度(H(H))、数据类型和每个周期产生的像素数(P/C)。
    6在几个报告的基准测试中比较了FlowPix和hetero-halide框架,所有基准测试都以大于1的像素吞吐量进行处理。该实验的目的是评估FlowPix向更高吞吐量扩展的能力。对于8位情况,FlowPix的延迟与异哈利德相当,FPGA LUT消耗平均增加1.7倍。在其他基准测试中,延迟增加了25%,FPGA LUT消耗平均增加1.6倍。值得注意的是蓝色基准测试显示LUT消耗的最高增长,因为它是以16位精度计算的。相反GAF公司由于使用8位PE版本进行计算,基准测试实现了比异halide更好的LUT利用率。本质上,要实现所需的延迟和吞吐量,需要扩展PE以解决流水线并行性,并扩展CU以适应数据并行性。
    表6。
    表6.比较FlowPix和异卤化合物
    在表中7,FlowPix与行业标准Vitis Vision库进行比较(https://xilinx.github.io/Vitis_Libraries/vision/2022.1/index.html)使用Vitis-HLS实现,它为在FPGA设备上加速的计算机视觉功能提供了软件API接口。与OpenCV等价物一样,库函数(内核)被编译成比特流并在FPGA上运行。该库针对面积和性能进行了优化。基准测试显示,与Vitis Vision相比,FlowPix的延迟降低了约20%。延迟的差异可归因于以下事实:几乎所有Vitis Vision内核的合成频率都大于300 MHz,而FlowPix的合成频率最大为250 MHz。对于金字塔基准,FlowPix的相对LUT消耗是Vitis的4倍以上,对于使用\(5乘以5)过滤器尺寸。然而,由于基准测试只涉及一个卷积,然后进行上采样或下采样操作,因此Vitis库在创建高效区设计方面做得更好。在以下情况下斯里兰卡由于LUT的增加在阈值范围内,因此通过将PE计数设置为2来采用光流、流水线并行。这种并行性有利于处理斯里兰卡在两个集群上。对于首席执行官边缘检测,当使用两个图像处理时,FlowPix比Vitis快4倍\(3次3次)过滤器。单个PE可以支持首席执行官A4(A4)类型PE已部署。为了实现\(P/C=1),使用两个并行CU实例。
    表7。
    表7.比较FlowPix与使用Vitis-HLS实现的Vitis Vision库
    8将FlowPix与Darkroom和Rigel框架进行了比较。暗室使用模具和逐点计算创建线缓冲管道。Rigel是Darkroom的扩展,可以生成包含上采样和下采样操作的多速率管道。与Darkroom不同,Rigel管道每个周期可以生成多个像素。FlowPix对于HCD公司首席执行官与Darkroom相比,单像素吞吐量的基准测试。延迟的增加是因为这些基准是使用单个PE处理的。使用单个PE的缺点是生成了更多的集群,并且在同一PE上进行了时间复用HCD公司首席执行官基准测试是使用两个集群进行处理的,在同一个PE上一个接一个地执行。增加PE在这里不是一个选项,因为它超过了LUT使用的区域阈值。事实上,对于首席执行官,FlowPix的LUT消耗比Darkroom好23%。
    表8。
    表8.比较FlowPix与Darkroom和Rigel
    FlowPix在延迟和LUT消耗方面都优于Rigel。具体来说,在处理斯里兰卡FlowPix的延迟是Rigel的1.25倍,因为相对LUT增量在50%的设定阈值内。对于卷积和多项式相乘PYR-D型基准,使用\(8乘以8)每个周期过滤并生成4个像素,FlowPix使用包含A4(A4)PE类型,导致延迟分别提高1.75倍和2.8倍。在LUT使用方面,FlowPix在PYR-D型基准,利用的LUT减少50%。然而,在以下情况下卷积和多项式相乘,Rigel使用的LUT比FlowPix少10%。尽管如此,FlowPix在两个基准测试的延迟方面仍优于Rigel。
    9提供了FlowPix和PolyMage框架之间的比较。所有三个基准都是在一个A1 PE类型的CU上实现的,因为PolyMage根据24位定点精度计算这些基准。对于HCD公司基准测试时,FlowPix的延迟要高出11倍。这是因为HCD公司在单个PE上分2个集群进行处理USM公司杜斯,通过使用单个\(3乘以3)并行过滤器,允许在单个PE上处理所有3个通道。而DUS公司由于存在下采样,然后进行上采样操作,因此在2个集群上处理,上采样在第二个集群中处理。因此,与PolyMage相比,FlowPix的延迟增加相当高杜斯但对于USM公司.
    表9。
    表9.比较FlowPix和PolyMage
    从生成固定功能硬件的框架过渡后,我们继续比较FlowPix和基于IPPro指令集的处理器。在这个实验中,我们选择了三个在一组输入上产生单个输出的函数,并在一个A1 PE类型的CU上执行它们。我们的目标是强调处理单个操作所涉及的控制开销,并将其与处理器的延迟进行比较。如表所示10,我们发现控制周期比计算周期高7x10倍。然而,这是一个一次性开销,在PE配置之后,将没有控制周期,只有计算周期将被使用,直到处理完所有输入。这与处理器不同,在处理器中,管道暂停,控制周期花费在为每个指令执行重新校准管道的一个周期延迟上。使用FlowPix,我们能够处理功能和冷杉以比IPPro低得多的延迟进行筛选。
    表10。
    表10FlowPix与IPPro的比较

    8.2框架分析

    在本节中,我们将首先检查FlowPix编译器处理由数百个节点组成的更大设计的能力。随后,我们将重点关注覆盖,并探讨使用单个设计处理基准的含义。这与上一节不同,在上一节中,我们对各种基准采用了不同的PE设计。
    在第一个实验中,我们生成了具有不同数量计算节点的DAG,范围从32到1024。为了创建这些DAG,我们使用了一个随机图形生成器,它将节点标记为模板、逐点、上采样或下采样节点。使用一组约束完成标记。例如,只有具有单个输入的节点才允许标记为模具、下采样或上采样,而具有两个输入边的节点可以标记为逐点。这些约束确保生成的DAG能够处理输入图像以生成输出图像。12说明编译时间与输入DAG的大小成比例增加。换句话说,编译器的复杂性是\(O(n)\),其中n个是DAG节点数。集群阶段大约占编译时间的90%,而剩下的10%用于生成控制世界和确定集群的调度顺序。集群阶段特别重要,因为随着DAG的大小增加,因此需要评估的集群数量也会增加。
    图12。
    图12分析FlowPix编译器。
    在第二个实验中,如表所示11,我们使用单个16位覆盖设计来处理所有基准。该覆盖层由配备一个PE的单个CU组成,其中\(P_x\)=16和\(_y\)= 8. 为基准选择的输入图像大小被确定为第8.1节中为该基准指定的所有尺寸中的最大尺寸。编译时间从1毫秒到300毫秒不等。当我们考虑编译时间和大约10毫秒的最大控制字传输时间时,它比编写FPGA比特流所需的时间要短得多,通常需要几秒钟。当用户需要在处理管道之间切换而不需要每次写入新比特流的开销时,覆盖设计非常有利。此外,请注意,类似的基准具有可比较的编译时间。例如BLU公司基础教学法硕士两者都有1毫秒的编译时间,因为它们只涉及一个模板操作。运行时间的增加与PE和CU的数量成正比。为了说明这一点,让我们以HCD公司。其延迟为16.45毫秒,与表中报告的数据相比增加了16倍6类似地γ-铀基准测试的延迟为39.77毫秒,这与表中报告的延迟几乎相同7考虑到这两种情况下使用的PE和CU计数。然而,由于位宽度的差异(16位与8位),观察到轻微的增量,这直接影响了设计的工作频率。
    表11。
    表11.处理所有基准的单一设计

    9结论

    本文针对图像处理应用提出了一种基于DSL的覆盖加速器FlowPix,该加速器的性能与现有的固定功能DSL-to-FPGA框架相当,同时保持了映射不同算法的灵活性。我们的架构简化了调度过程图像处理(ImP)云上的工作负载,从而支持ImP即服务我们设计的体系结构能够同时运行各种算法,我们将此留作将来的工作。

    工具书类

    [1]
    普亚·阿米里(Puya Amiri)、阿尔塞内·佩拉德-加约特(Arsène Pérard-Gayot)、理查德·门巴思(Richard Membarth)、菲利普·斯拉萨莱克(Philipp Slusallek)、罗兰·雷亚(Roland Leißa)和塞巴斯蒂安。2021.FLOWER:用于高级合成的综合数据流编译器。2021年现场可编程技术国际会议IEEE,1-9。
    [2]
    Kevin Andryc、Murtaza Merchant和Russell Tessier。2013.FlexGrip:FPGA的软GPGPU。2013年现场可编程技术国际会议. 230–237.
    [3]
    Jonathan Bachrach、Huy Vo、Brian Richards、Yunsup Lee、Andrew Waterman、Rimas Avižienis、John Wawrzynek和Krste Asanović。2012.Chisel:用Scala嵌入式语言构建硬件。第49届设计自动化年会(DAC’12)会议记录美国纽约州纽约市计算机协会,1216-1225。
    [4]
    大卫·培根(David F.Bacon)、罗德里克·拉巴(Rodric Rabbah)和苏尼尔·舒克拉(Sunil Shukla)。2013.面向大众的FPGA编程。Commun公司。ACM公司第56页,第4页(2013年4月),第56–63页。
    [5]
    Christophe Bobda、Joel Mandebi Mbongue、Paul Chow、Mohammad Ewais、Naif Tarafdar、Juan Camilo Vega、Ken Eguro、Dirk Koch、Suranga Handagala、Miriam Leeser、Martin Herbordt、Hafsah Shahzad、Peter Hofste、Burkhard Ringlein、Jakub Szefer、Ahmed Sanaullah和Russell Tessier。2022.数据中心和云计算中FPGA加速的未来。ACM事务处理。可重构技术。系统。第15、3条,第34条(2022年2月),共42页。
    [6]
    Joo M.P.Cardoso和Pedro C.Diniz。2008.可重构体系结构编译技术(第1版)施普林格出版公司。
    [7]
    Hui Yan Cheah、Suhaib A.Fahmy和Douglas L.Maskell。2012年,iDEA:基于DSP块的FPGA软处理器。2012年现场可编程技术国际会议. 151–158.
    [8]
    Ziaul Choudhury、Shashwat Shrivastava、Lavanya Ramapantulu和Suresh Purini。2022.用于CNN推理的FPGA覆盖,具有细粒度的灵活并行性。ACM事务处理。阿基特。代码优化。第19、3条,第34条(2022年5月),26页。
    [9]
    Nitin Chugh、Vinay Vasista、Suresh Purini和Uday Bondhugula。2016.用于加速FPGA上图像处理管道的DSL编译器。2016年并行体系结构与编译国际会议记录(PACT’16)ACM,美国纽约州纽约市,327–338。内政部:
    [10]
    Nitin Chugh、Vinay Vasista、Suresh Purini和Uday Bondhugula。2016.用于加速FPGA上图像处理管道的DSL编译器。2016年并行体系结构与编译国际会议记录(PACT’16)美国纽约州纽约市计算机协会,327–338。内政部:
    [11]
    詹森·聪(Jason Cong)、杰森·刘(Jason Lau)、盖·刘(Gai Liu)、史蒂芬·纽恩多佛(Stephen Neuendorffer)、潘培晨(Peichen Pan)、基斯·维瑟斯(Kees Vissers)和张志如(Zhiru Zhang)。2022.FPGA HLS今日:成功、挑战和机遇。ACM事务处理。可重构技术。系统。第15、4条,第51条(2022年8月),共42页。内政部:
    [12]
    詹森·聪(Jason Cong)、刘斌(Bin Liu)、史蒂芬·纽恩多佛(Stephen Neuendorffer)、胡安霍·诺格拉(Juanjo Noguera)、基斯·维瑟斯(Kees Vissers)和张志如(Zhiru Zhang。2011.FPGA的高级综合:从原型到部署。IEEE TCAD(2011), 491.
    [13]
    大卫·杜斯特、马修·费尔德曼、迪伦·赫夫、大卫·阿克利、罗斯·戴利、吉尔伯特·路易斯·伯恩斯坦、马可·帕特里格纳尼、凯文·法塔哈利安和帕特·汉拉罕。2020.流媒体加速器的类型定向调度。第41届ACM SIGPLAN编程语言设计与实现会议记录. 408–422.
    [14]
    Chance Elliott、Vipin Vijayakumar、Wesley Zink和Richard Hansen。2007.国家仪器实验室视图:实验室自动化和测量的编程环境。JALA:实验室自动化协会杂志12, 1 (2007), 17–24. arXiv公司:
    [15]
    Zhi Guo、Walid Najjar和Betul Buyukkurt。2008年。FPGA的高效硬件代码生成。ACM事务处理。阿基特。代码优化。第5、1条,第6条(2008年5月),26页。内政部:
    [16]
    Rehan Hameed、Wajahat Qadeer、Megan Wachs、Omid Azizi、Alex Solomatnikov、Benjamin C.Lee、Stephen Richardson、Christos Kozyrakis和Mark Horowitz。2010年。了解通用芯片效率低下的根源。第37届计算机体系结构国际年会(ISCA’10)会议记录ACM,美国纽约州纽约市,37-47。内政部:
    [17]
    詹姆斯·赫加蒂、约翰·布伦哈弗、扎卡里·德维托、乔纳森·拉甘·凯利、诺伊·科恩、史蒂文·贝尔、阿特姆·瓦西里耶夫、马克·霍洛维茨和帕特·汉拉罕。2014.暗室:将高级图像处理代码编译到硬件管道中。ACM事务处理。图表。第33、4条,第144条(2014年7月),共11页。内政部:
    [18]
    詹姆斯·赫加蒂、罗斯·戴利、扎卡里·德维托、乔纳森·拉根·凯利、马克·霍洛维茨和帕特·汉拉汉。2016.Rigel:灵活的多速率图像处理硬件。ACM事务处理。图表。第35条、第4条(2016年7月),共11页。内政部:
    [19]
    希帕克。异构图像处理加速框架(n.d.)。http://hipacc-lang.org/
    [20]
    纳奇凯特·卡普雷。2015.定制基于FPGA的稀疏图形加速软处理器。9–16.内政部:
    [21]
    D.Koeplinger、R.Prabhakar、Y.Zhang、C.Delimitrou、C.Kozyrakis和K.Olukotun。2016年,为可重构硬件自动生成高效加速器。2016年ACM/IEEE第43届计算机体系结构国际年会(ISCA). 115–127.内政部:
    [22]
    Edward Ashford Lee和David G.Messerschmitt。1987.数字信号处理同步数据流程序的静态调度。IEEE传输。计算。36,1(1987年1月),24-35。内政部:
    [23]
    李嘉杰,池玉泽,丛杰森,2020年。异卤:从图像处理DSL到高效FPGA加速。51–57.内政部:
    [24]
    G.Martin和G.Smith。2009年。高级综合:过去、现在和未来。IEEE计算机设计测试第26、4页(2009年7月),第18-25页。内政部:
    [25]
    拉维·特贾·穆拉普迪(Ravi Teja Mullapudi)、维奈·瓦西斯塔(Vinay Vasista)和乌代·邦杜古拉(Uday Bondhugula)。2015.PolyMage:图像处理管道的自动优化。SIGARCH计算。阿基特。新闻第43页,第1页(2015年3月),第429–443页。内政部:
    [26]
    Walid A.Najjar、A.P.Wim Bohm、Bruce A.Draper、Jeffrey Hammes、Robert Rinker、J.Ross Beveridge、Monica Chawathe和Charles Ross。2003.用于可重构计算的高级语言抽象。IEEE计算机36, 8 (2003), 63–69.
    [27]
    Rishiyur S.Nikhil和Arvind。2009年。什么是Bluespec?SIGDA新闻。39,1(2009年1月),1-1。内政部:
    [28]
    M.Akifßzkan、Arsène Pérard-Gayot、Richard Membarth、Philipp Slusallek、Roland Lei \223,a、Sebastian Hack、Jürgen Teich和Frank Hannig。2020年。AnyHLS:部分评估的高级综合。IEEE集成电路和系统计算机辅助设计汇刊39, 11 (2020), 3202–3214.
    [29]
    普雷蒂·兰詹·熊猫。SystemC:支持多种设计抽象的建模平台。第14届系统综合国际研讨会(ISSS’01)会议记录ACM,美国纽约州纽约市,75-80。内政部:
    [30]
    Alexandros Papakonstantinou、Karthik Guuraj、John A.Stratton、Deming Chen、Jason Cong和Wen mei W.Hwu。2013年,高效编译CUDA内核,用于FPGA上的高性能计算。ACM事务处理。嵌入。计算。系统。13、2(2013年9月)。内政部:
    [31]
    景璞、史蒂文·贝尔、宣扬、杰夫·塞特、斯蒂芬·理查森、乔纳森·拉甘·凯利和马克·霍洛维茨。2017.从图像处理DSL编程异构系统。ACM事务处理。阿基特。代码优化。第14、3条,第26条(2017年8月),共25页。内政部:
    [32]
    景璞、史蒂文·贝尔、宣扬、杰夫·塞特、斯蒂芬·理查森、乔纳森·拉甘·凯利和马克·霍洛维茨。2017.从图像处理DSL编程异构系统。ACM事务处理。阿基特。代码优化。第14、3条,第26条(2017年8月),共25页。内政部:
    [33]
    乔纳森·拉甘·凯利(Jonathan Ragan-Kelley)、安德鲁·亚当斯(Andrew Adams)、迪伦·沙雷特(Dillon Sharlet)、康奈利·巴恩斯(Connelly Barnes)、西尔万·帕里斯(Sylvain Paris)、马克·莱沃伊(Marc Levoy)、萨曼·阿。2017.卤化物:从时间表中解耦算法,用于高性能图像处理。Commun公司。ACM公司第61页,第1页(2017年12月),第106–115页。内政部:
    [34]
    奥利弗·雷切(Oliver Reiche)、M.阿基夫·奥兹坎(M.AkifØzkan)、理查德·门巴思(Richard Membarth)、尤尔根·泰奇(Jürgen Teich)和弗兰克·汉尼格(Frank Hannig)。2017.与Hipacc合作开发基于FPGA的图像处理加速器。2017 IEEE/ACM国际计算机辅助设计会议(ICCAD)IEEE,1026–1033。
    [35]
    迈克尔·施密特(Michael Schmidt)、马克·赖森巴赫(Marc Reichenbach)、安德烈亚斯·卢斯(Andreas Loos)和迪特马尔·菲(Dietmar Fey)。2011年,利用行进像素的图像应用的智能相机处理管道。信号与图像处理:国际期刊2 (09 2011).内政部:
    [36]
    Aaron Severance和Guy G.F.Lemieux。2013.使用VectorBlox MXP矩阵处理器在FPGA中嵌入超级计算。2013年国际软硬件协同设计与系统综合会议(CODES+ISSS). 1–10.内政部:
    [37]
    Fahad Siddiqui、Sam Amiri、Umar Ibrahim Minhas、Tiantai Deng、Roger Woods、Karen Rafferty和Daniel Crookes。2019.基于FPGA的处理器加速,用于图像处理应用。成像杂志5, 1 (2019).内政部:
    [38]
    Fahad Siddiqui、Matthew Russell、Burak Bardak、Roger Woods和Karen Rafferty。2014.IPPro:基于FPGA的图像处理处理器。内政部:
    [39]
    Jian Weng、Sihao Liu、Vidushi Dadu、Wang Zhengrong、Preyas Shah和Tony Nowatzki。2020年,DSAGEN:合成可编程空间加速器。2020年ACM/IEEE第47届计算机体系结构国际年会(ISCA)IEEE,268–281。
    [40]
    彼得·伊安娜库拉斯、J·格雷戈里·斯特凡和乔纳森·罗斯。VESPA:便携式、可扩展和灵活的基于FPGA的矢量处理器(CASES’08)。美国纽约州纽约市计算机协会。内政部:
    [41]
    M.A.Ùzkan、O.Reiche、F.Hannig和J.Teich。2016.基于FPGA的加速器设计,采用领域特定语言。2016第26届现场可编程逻辑与应用国际会议(FPL). 1–9.内政部:

    索引术语

    1. FlowPix:使用领域特定编译器加速FPGA覆盖上的图像处理管道

      建议

      评论

      信息和贡献者

      问询处

      发布于

      封面图片ACM架构和代码优化汇刊
      ACM体系结构和代码优化汇刊 第20卷第4期
      2023年12月
      426页
      国际标准编号:1544-3566
      EISSN公司:1544-3973
      内政部:10.1145/3630263
      • 编辑:
      • 大卫·凯利
      期刊目录

      出版商

      计算机协会

      美国纽约州纽约市

      出版历史

      出版:2023年12月14日
      在线AM:2023年10月25日
      认可的:2023年9月18日
      修订过的:2023年8月17日
      收到:2023年5月4日
      在TACO中发布体积20,问题4

      权限

      请求对此文章的权限。

      检查更新

      作者标记

      1. 特定于域的语言
      2. 门阵列
      3. 叠加加速器

      限定符

      • 研究文章

      贡献者

      其他指标

      文献计量学和引文

      文献计量学

      文章指标

      • 0
        引文总数
      • 653
        总下载次数
      • 下载次数(过去12个月)653
      • 下载次数(最近6周)78

      其他指标

      引文

      视图选项

      查看选项

      PDF格式

      以PDF文件查看或下载。

      PDF格式

      电子阅读器

      使用联机查看电子阅读器.

      电子阅读器

      获取访问权限

      登录选项

      完全访问权限

      媒体

      数字

      其他

      桌子

      分享

      分享

      共享此出版物链接

      在社交媒体上分享