FPGA学习(二)--硬件设计基本概念

目前在做FPGA移植加速CNN卷积神经网络Inference相关的学习,使用的是Xilinx公司的ZYNQ-7000系列的FPGA开发板,该博客为记录相关学习内容,如有问题欢迎指教。前面已经介绍了关于FPGA架构和基本组成《FPGA学习–架构和基本组成单元(一)》 ,下面参考Xilinx Vivado官方文档学习硬件设计的基本概念。

概念

处理器(CPU)和FPGA之间的关键区别之一就是处理架构是否固定。这种差异直接影响每个编译器的工作方式。处理器CPU的计算体系结构是固定的,编译器的工作是确定软件应用程序如何最好地适应处理结构。应用程序性能取决于应用程序映射到处理器功能的程度以及正确执行所需的处理器指令数量。

相比之下,FPGA类似于带有一组构建块的空白平板。在的Vivado ®编译器HLS中,目标是从最适合的软件程序中创建一个处理架构。指导Vivado HLS编译器创建最佳处理架构的过程需要有关硬件设计概念的基础知识。

时钟频率

CPU的时钟频率是算法执行效率的第一考虑因素,一般来说高时钟频率有更高的执行效率。虽然这是一般常识,但是如果以时钟频率高低来作为选择CPU或者FPGA的标准,这样实际上并不准确,因为CPU与FPGA之间的时钟频率名义上有一定的差异,例如下表中的CUP与FPGA最大时钟频率很常见:
在这里插入图片描述
对上表分析,其实并不是CPU的性能是FPGA的四倍,不能简单的以时钟频率比较性能。CPU与FPGA性能评判主要区别是软件如何被执行,一般来说,CPU是能够执行任何程序的通用平台,包括CPU和CPU上其他结构,软件必须在该结构上执行,编译后的软件按照一组指令按顺序执行,无论CPU类型如何,指令的执行始终是相同的,应用程序的每条指令都必须经过以下阶段如下图1:

  • 取指令(IF);
  • 指令解码(ID);
  • 执行(EXE);
  • 内存操作(MEM);
  • 回写(WB)。
    在这里插入图片描述
操作描述
IF从程序存储器中获取指令
ID解码,确定操作和操作符
EXE在硬件上执行指令,在标准处理器中,硬件是指算数逻辑单元(ALU)或浮点单元(FPU)。在此阶段,固定功能的加速器也会添加到标准处理器中
MEM使用内存操作获取下一条指令数据
WB讲指令运算的结果写回本地寄存器或全局存储器中

大多数现代处理器包括指令执行路径的多个副本,并且能够运行具有一定程度重叠的指令。因为处理器中的指令通常彼此依赖,所以指令执行硬件的副本之间的重叠并不完美。在最好的情况下,只有使用处理器引入的开销阶段才能重叠。负责应用程序计算的EXE阶段按顺序执行。这种顺序执行的原因与EXE阶段的有限资源和指令之间的依赖性有关。

下图显示了一个处理器,其中有多条指令以半平行顺序执行。这是处理器的最佳情况,其中所有指令都尽快执行。即使在这种最佳情况下,处理器每个时钟周期仅限于一个EXE级。这意味着用户应用程序每个时钟周期向前移动一次操作。即使该编译器确定了这五个EXE阶段可以并行执行在,处理器仍然会阻止它并行,如下图2。

在这里插入图片描述

FPGA不会在通用计算平台上执行所有软件。它在该程序的自定义电路上一次执行一个程序。因此,更改用户应用程序会更改FPGA中的电路。与上面的图1不同,在FPGA中进行处理时,EXE阶段如下图3所示。MEM阶段的存在取决于应用。
在这里插入图片描述
鉴于这种灵活性,赛灵思的Vivado HLS编译器不需要考虑平台中的开销阶段,并且可以找到最大化指令并行性的方法。使用与图2中相同的假设,FPGA中相同软件的执行配置文件如图4所示。

在这里插入图片描述
基于图2和图4的比较,与处理器相比,FPGA具有9倍的性能优势。实际具体优势始终是特定于应用程序的,但对于计算密集型应用程序来说,FPGA的性能通常是处理器至少10倍。

一般来考虑功耗与时钟频率之间的关系,经验数据表明,对于相同的计算工作负载,处理器的功耗比FPGA高。通过创建每个定制电路的软件程序中,FPGA是能够以一个较低的时钟频率与最大运行操作之间的平行工作。

在处理器和FPGA之间进行选择时,建议使用基于吞吐量和延迟而不是最大时钟频率来分析应用程序要求和计算工作量。

时延和流水线

时延(Latency)是完成一个或一系列指令并产生结果花费的时钟周期数。对于图1来说,指令时延为5个时钟周期,如果一个应用程序有五个指令,那么时延就是25个周期,直到25个周期完成,别的应用程序的指令才会执行。

对于CPU与FPGA来说,时延是一个关键的性能度量标准,流水线(Pipeline)是解决时延问题的通用方法,适用CPU和FPGA。在处理器中流水线操作意味着可以在当前指令完成之前启动下一条指令。这允许执行重叠指令集。上面图2就显示了处理器流水线操作的最佳结果。通过重叠指令的执行,处理器实现五个指令九个时钟周期的时延。在FPGA中,不存在与指令处理相关联的开销周期。时延是通过运行原始处理器指令的EXE阶段所需的时钟周期来衡量的。对于上图3中的情况,时延是一个时钟周期。并行性在时延中也起着重要作用。对于完整的并行五指令应用,FPGA 延迟也是一个时钟周期,如上图4所示。FPGA中流水线操作的原因与处理器相同,即改善应用程序性能。

如前所述,FPGA是一个带有构建块(building blocks)的空白板,必须连接它们才能实现应用程序。Vivado HLS编译器可以直接地或通过寄存器连接构建块。下图5显示了使用五个构建块实现的图3中的EXE阶段的实现。

在这里插入图片描述
FPGA中的操作时序是信号从源寄存器传输到目的寄存器所需的时间长度。假设图5中的每个构建块需要2ns才能执行,当前设计需要10ns才能实现该功能。时延仍然是一个时钟周期,但时钟频率限制为100 MHz。100 MHz频率限制源自FPGA中时钟频率的定义。对于FPGA电路的情况,时钟频率定义为源和目的寄存器之间的最长信号传播时间。

FPGA中的流水线操作是插入更多寄存器以将大型计算块分解为更小的段的过程。这种计算分区增加了绝对时钟周期数的延迟,但通过允许定制电路以更高的时钟频率运行来提高性能。流水线操作后,图6显示了图5中处理体系结构的实现。完整的流水线操作意味着在FPGA电路中的每个构建块之间插入寄存器。增加寄存器可将电路的时序要求从10ns减少到2ns,从而使最大时钟频率达到500 MHz。此外,通过将计算分成单独的寄存器绑定区域,允许每个块始终忙(busy),这对应用程序吞吐量产生积极影响。流水线的其中一个问题是电路等待时延。在原电路图5中,在低时钟频率具有一个时钟周期的时延,在图6电路中,在一个较高的时钟频率具有一个时延为5个时钟周期。

在这里插入图片描述

提示:流水线引起的时延是FPGA设计过程中需要考虑的因素之一。

吞吐量

吞吐量是用于确定性能的另一个度量标准,它是处理逻辑接受下一​​个输入数据样本所需的时钟周期数,即电路的时钟频率改变吞吐量。例如,上图5和上图6都显示了在输入数据样本之间需要一个时钟周期的实现。关键区别在于上图5中的实现在输入采样之间需要10ns,而上图6中的电路在输入数据采样之间仅需要2ns。在知道时间基准之后,很明显第二种实现具有更高的性能,因为它可以接受更高的输入数据速率。

注意:在分析在处理器CPU上执行的应用程序时,也可以使用吞吐量。

内存架构和布局

所选实现平台的存储器架构是可影响软件应用程序性能的物理元件之一,因为内存架构决定了可实现性能的上限。在某些性能点上,无论可用计算资源的类型和数量如何,处理器或FPGA上的所有应用程序都会成为基于存储器的设计。FPGA设计的一个策略是了解内存限制以及数据布局和内存组织如何影响程序运行。

在基于处理器的系统中,软件工程师必须使应用程序适合基本的内存架构,而不管处理器的具体类型如何。这种通用性以牺牲性能为代价简化了应用程序迁移过程。软件工程师熟悉的通用存储器架构包括慢速,中速或快速存储器,这些存储器快慢的定义是基于将数据传送到处理器所需的时钟周期数。这些内存分类在下表中定义。

内存类型定义描述
Slow大容量存储设备,比如硬盘
MediumDDR内存
Fast片上高速缓冲存储器

在一般情况下,单个大块数据不能直接全部放入高速缓存中,唯一的办法就是尽可能多的重复利用高速缓存。为了实现这一目标,软件工程师必须花费大量时间查看缓存跟踪,重构软件算法以增加数据局部性,并管理内存分配以最小化程序的瞬时内存占用。虽然所有这些技术都可以在处理器之间移植,但结果并非如此。一个软件程序必须进行调整以在其上运行,以最大限度地提高性能每个处理器。

但是,在FPGA上,一个问题就是不能实现动态内存分配, 由于缺乏动态内存分配,FPGA代码可能会让经验丰富的软件工程师感到惊讶。在Vivado HLS 编译器中生成的一个存储器架构被定制到相应的应用程序中。这个定制的存储器体系结构已经描述了固定的存储结构,以及在整个工程中数据如何被使用。即,使用FPGA的运算完全是可分析的。相关存储例如寄存器、移位寄存器、FIFO和BRAM在此不在多做介绍。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页