0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA中并行计算的流水线计算和交替计算

FPGA设计论坛 来源:FPGA设计论坛 作者:FPGA设计论坛 2022-04-12 10:05 次阅读

用过FPGA的人应该都知道,在FPGA中,逻辑是并行地运行的,各个状态机同时都在工作,状态机之间可能会有信号交互,也可能毫无关系、各管各地工作。

这就给了我们一个灵感:如果我们要做的计算(例如级数求和)的规模很大,按顺序一步一步算的话,其时间开销是我们所无法忍受的,那么,我们是否可以想办法利用FPGA的并行特性,通过让计算并行地执行,来减小时间开销(或者说提高计算速度)呢?

基于这个灵感,就让我们看看,FPGA中并行计算的常规方法吧。

流水线计算

现在,我们要在FPGA中做这样一个计算:

B = A × imes× 2 + 1

能用的计算单元为两输入加法器和两输入乘法器

为了保证时序,一个时钟周期内加法器只能执行一次加法

为了保证时序,一个时钟周期内乘法器只能执行一次乘法

对于上述要求完成的计算,看上去,在一个时钟周期内既完成乘法又完成加法是不可能的了。然而,如果我们这么做呢:

1.设计一个模块,模块的输入为时钟和参数A,输出为结果B。

2.该模块在每个时钟周期同时做"C=A×2"的计算和"B=C+1"的计算,其中,C为寄存器

仿真该模块,就可以发现:

542c19a2-b9c6-11ec-aa7f-dac502259ad0.png

从上表可以看到:

虽然从输入A到输出B,相差了两个时钟周期,但是,每个时钟周期输出的B,都和两个时钟周期前输入的A相对应。即:等效地来看,相当于每个时钟周期,模块都完成了一次"B = A × imes× 2 + 1"的计算!

哇塞,好神奇!这简直就是:

明明一次性无法完成的计算,不知怎么搞的,却等效地"被一次性地完成了"

嗯,这种搞法,就是传说中的"流水线计算",这里为其给出了一个不拘泥于FPGA中的情形的、更加普适的定义:

将一个计算拆分成N级(N ≥ geq≥ 2),每一级的平均数据吞吐速率都相同,前(N-1)级的计算结果在输入下一级之前都经过了缓存,这种方法称为"流水线计算"

注:"平均数据吞吐速率"指的是:在单位时间内,参数平均能够输入多少次,以及计算结果平均能够输出多少次。

流水线计算的结构如下图所示("一条龙"式的结构):

543e41ae-b9c6-11ec-aa7f-dac502259ad0.png

分析定义可知:

正是由于"每一级的平均数据吞吐速率都相同",使得整个计算的平均数据吞吐速率相同,才让输出的结果看上去"像是被一次性地完成的"。

级间缓存在流水线计算中是必不可少的,它们起到了两级间隔离的作用,使得"当第(n+1)级在处理第i ii个输入对应的计算时,第n级已经在处理第( i + 1 ) (i+1)(i+1)个输入对应的计算了"这种情况成为可能。增大级间缓存的延迟时间,会造成整个计算的延迟时间(即输出和输入之间的延迟时间)的加长。

总的来说,流水线计算是个好东西,不过,实际使用时,如果不留心的话,容易为级间缓存分配过长的延迟时间,从而出现"整个计算的延迟时间长"的问题,这一点需要注意。

分布式流水线计算

现在,我们要在FPGA中做这样一个计算:

C = A × imes× 2 + B × imes× 3

能用的计算单元为两输入加法器和两输入乘法器

为了保证时序,一个时钟周期内加法器只能执行一次加法

为了保证时序,一个时钟周期内乘法器只能执行一次乘法

对于上述要求完成的计算,看上去,在一个时钟周期内既完成乘法又完成加法是不可能的了。然而,如果我们这么做呢:

1.设计一个模块,模块的输入为时钟和参数A、参数B,输出为结果C。

2.该模块在每个时钟周期同时做"D=A×2"的计算、"E=B×3"的计算和"C=D+E"的计算,其中,D、E为寄存器。

仿真该模块,就可以发现:

5457be86-b9c6-11ec-aa7f-dac502259ad0.png

从上表可以看到:

等效地来看,相当于每个时钟周期,模块都完成了一次"C = A × imes× 2 + B × imes× 3"的计算

这种做法明显蕴含了"流水线计算",不过又跟流水线计算的"一条龙"结构似乎不同,这种做法的结构是"树形"的:

对于输入的参数A和B,先是"你算你的,我算我的",分别输出并缓存D和E。然后拿D和E计算得到结果C。

546ad8b8-b9c6-11ec-aa7f-dac502259ad0.png

对于这种做法,我称之为"分布式流水线计算",这个名称借鉴了计算机网络领域的术语"分布式计算"。使用分布式流水线计算的必要前提是:

计算所需的输入参数不止一个

分布式流水线计算可以看成是"在输入参数不止一个的情况下,展露出计算细节的流水线计算",或者说,从本质上来讲,分布式流水线计算属于流水线计算,不要因为看上去是树形结构就帮它"自立门户"了。不信?没事,我将上面的"计算C = A × imes× 2 + B × imes× 3"的模块的结构重新画一下你就信了:

548443d4-b9c6-11ec-aa7f-dac502259ad0.png

既然说"分布式流水线计算属于流水线计算",那为什么还要专门在这里讲分布式流水线计算呢?原因是这样的:分布式流水线计算展露了计算细节,更加有助于逻辑开发人员弄清楚计算过程中的延时情况,防止在不知不觉间,增大了整个计算的延迟时间。比如,对于上面的"C = A × imes× 2 + B × imes× 3",如果不加注意的话,可能会变成这样:

5496ef02-b9c6-11ec-aa7f-dac502259ad0.png

从上图就能看出来,明明两级就能完成的计算,一不留神就变成了三级,整个计算的延迟时间变长了。不过需要说明的是,"整个计算的延迟时间"并不是衡量"一个并行计算结构的优劣"的标准。比如,在做并行卷积计算时,采取流水线的结构可以节省计算资源(但是整个计算的延迟时间长),而采取多相的结构可以缩短整个计算的延迟时间(但是消耗更多的计算资源,虽然其实也多不了太多)。

这里展示一个更加复杂的分布式流水线计算的案例:

54afe660-b9c6-11ec-aa7f-dac502259ad0.png

交替计算

现在,我们要在FPGA中做这样一个计算:

C = A + B

能用的计算单元为两输入加法器

为了保证时序,一个时钟周期内加法器只能执行一次加法,时钟频率最高为100MHz

可以用寄存器来存储数据

为了保证时序,寄存器最高只能工作在300MHz的时钟频率下

乍一看,这情况让人有点迷茫:表达式都简单成这样了,还需要玩并行计算?别急,我们的问题是这样的:

A和B都是在300MHz时钟的驱动下刷新的,在这种情况下,如何才能完成"C = A + B"的计算?

呵呵,加法器最高工作频率为100MHz,而数据的刷新频率都飙到300MHz去了,没法玩了好吧!咳咳,其实还是可以玩的。考虑一下这么做:

设计一个模块,模块的输入为300MHz时钟和参数A、参数B,输出为结果C(C为寄存器)。

在300MHz时钟的驱动下:

在第(i+1)个时钟周期将A、B的值分别赋给A1、B1寄存器,

在第(i+2)个时钟周期将A、B的值分别赋给A2、B2寄存器,

在第(i+3)个时钟周期将A、B的值分别赋给A3、B3寄存器,

在第(i+4)个时钟周期将A、B的值分别赋给A1、B1寄存器,

在第(i+5)个时钟周期将A、B的值分别赋给A2、B2寄存器,

模块中,将300MHz的时钟三分频后得到100MHz时钟:clk100m_1,clk100m_2,clk100m_3。

三个100MHz时钟之间的相位都相差(360°/3=)120°。

在100MHz时钟的驱动下(假定分配的100MHz时钟都能满足所需的建立保持时间需求):

使用加法器,在clk100m_1的每个时钟周期计算C1 = A1 + B1,其中,C1为寄存器。

使用加法器,在clk100m_2的每个时钟周期计算C2 = A2 + B2,其中,C2为寄存器。

使用加法器,在clk100m_3的每个时钟周期计算C3 = A3 + B3,其中,C3为寄存器。

在300MHz时钟的驱动下:

在第(k+1)个时钟周期将C1的值赋给C,(其中,k=i+4)

在第(k+2)个时钟周期将C2的值赋给C,

在第(k+3)个时钟周期将C3的值赋给C,

在第(k+4)个时钟周期将C1的值赋给C,

在第(k+5)个时钟周期将C2的值赋给C,

上述模块的时序如下图所示:

54c6f7ba-b9c6-11ec-aa7f-dac502259ad0.png

从上图可以看到:

加法器都工作在100MHz的时钟下

A、B、C的刷新频率都是300MHz

可见,我们利用3个最高工作频率100MHz的加法器,等效地实现了1个最高工作频率300MHz的加法器。

这里所采用的方法通常被称为是"乒乓计算"(或者"乒乓操作"),不过,窃以为这个名称不够形象,因此,为这种方法取了个新名称:“交替计算”。交替计算的基本思想是:

将计算单元复制若干份,交替地将输入的参数分配给各个计算单元,并且交替地将各个计算单元的计算结果输出,从而实现"以N倍的计算单元换取N倍的计算速度"。

交替计算的基本结构如下图所示:

54dc91c4-b9c6-11ec-aa7f-dac502259ad0.png

混合型并行计算

在实际的FPGA并行计算中,常常将流水线计算、交替计算混合使用,来满足计算需求。嗯,这就是所谓的"混合型并行计算",没毛病。

用一句话将本论述归纳总结一下,那就是:

FPGA中并行计算的基本常规方法为:流水线计算和交替计算。

原文标题:FPGA学习-FPGA中并行计算的常规方法

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • 并行计算
    +关注

    关注

    0

    文章

    27

    浏览量

    9369

原文标题:FPGA学习-FPGA中并行计算的常规方法

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    arm系统并行计算优化

    fpga的硬件换成我们自己的arm设备。不过经过研究这种设想不可行。个人看法,也许不对哦。!!!!arm是一款多核心,单进程处理器,目前为止arm处理器都不支持多线程。所以多线程概念不能将并行计算优化
    发表于 12-30 14:33

    FPGA流水线设计

    Tpd+Tco,每级消耗一个时钟周期,流水线需要 2 个时钟周期来获得第一个计算结果,称 为首次延迟,它要 2*( Tpd+Tco),但是执行重复操作时,只要一个时钟周期来获得最后的计算结果,称为吞吐延迟
    发表于 10-26 14:38

    什么是异构并行计算

    先了解什么是异构并行计算同构计算是使用相同类型指令集和体系架构的计算单元组成系统的计算方式。而异构计算主要是指使用不同类型指令集和体系架构的
    发表于 07-19 08:27

    ARM架构系列流水线设计

    ARM 系列的流水线设计都不同。流水线是一种设计技术或过程,它在提高计算机和微控制器处理器的数据处理效率方面发挥着重要作用。通过将处理器保持在一个连续的获取、解码和执行过程
    发表于 04-11 17:23

    现代RISC流水线技术

    流水线技术是提高系统吞吐率的一项强大的实现技术,并且不需要大量重复设置硬件。20世界60年代早期的一些高端机器第一次采用了流水线技术。第一个采用指令流水线的机器是IBM7030(又称
    发表于 03-01 17:52

    基于流水线技术的并行高效FIR滤波器设计

    基于流水线技术的并行高效FIR滤波器设计 基于流水线技术,利用FPGA进行并行可重复配置高精度的FIR滤波器设计。使用VHDL可以很方便地
    发表于 03-28 15:12 740次阅读
    基于<b class='flag-5'>流水线</b>技术的<b class='flag-5'>并行</b>高效FIR滤波器设计

    流水线中的相关培训教程[3]

    流水线中的相关培训教程[3] (1) 写后读相关(RAW:Read After Write) (命名规则) :j 的执行要用到 i 的计算结果,当它们在流水线中重叠执行时,j 可
    发表于 04-13 16:02 784次阅读

    并行计算和嵌入式系统实践教程

    Linux微机应用十分普遍. 高性能并行计算机数量多. 并行计算,我国有自己的理论. 对并行计算的基本原理,算法,程序设计与实现,优化,成熟软件应用的推广不够. 制约并行计算在研究和工
    发表于 05-09 15:54 48次下载

    基于流水线并行FIR滤波器设计

    基于流水线技术,利用FPGA进行并行可重复配置高精度的 FIR滤波器 设计。使用VHDL可以很方便地改变滤波器的系数和阶数。在DSP中采用这种FIR滤波器的设计方法可以充分发挥FPGA
    发表于 07-18 17:09 63次下载
    基于<b class='flag-5'>流水线</b>的<b class='flag-5'>并行</b>FIR滤波器设计

    并行计算系列丛书并行计算—结构 · 算法 · 编程(修 订 版)陈国良编著

    并行计算系列丛书 并 行 计 算 ——— 结 构 · 算 法 · 编 程 (修 订 版) 陈国良 编著
    发表于 09-18 08:29 0次下载

    并行计算和分布式计算的区别和联系

    并行计算或称平行计算是相对于串行计算来说的。所谓并行计算可分为时间上的并行和空间上的并行。 时间
    发表于 12-08 09:59 3.5w次阅读

    基于云计算的电磁问题并行计算方法

    针对电工装备性能分析与优化所需的易用高性能计算问题,使用云计算技术搭建了弹性集群,实现了典型电磁问题在弹性集群中的并行计算。使用虚拟化技术将计算机资源整合为资源池,搭建并部署了可实现弹
    发表于 03-20 13:56 1次下载
    基于云<b class='flag-5'>计算</b>的电磁问题<b class='flag-5'>并行计算</b>方法

    并行计算的黄金时代到了?

    “未来几十年将进入并行计算黄金时代,并行计算软件和算法的开发将从技术驱动转向应用驱动,需要计算与应用等不同领域的专家共同合作开发。”中国工程院院士李国杰日前表示。
    的头像 发表于 04-03 17:18 2098次阅读

    浅析云计算并行计算

    并行计算可以划分成时间并行和空间并行。时间并行流水线技术,空间并行使用多个处理器执行并发
    的头像 发表于 05-03 12:01 4146次阅读
    浅析云<b class='flag-5'>计算</b>和<b class='flag-5'>并行计算</b>

    什么是流水线 Jenkins的流水线详解

    jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkin
    发表于 05-17 16:57 668次阅读