论述:FPGA中并行计算的常规方法

论述:FPGA中并行计算的常规方法

更新历史
20190411:

  1. 首次发布

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

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

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



流水线计算

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

  • B = A × \times × 2 + 1
  • 能用的计算单元为两输入加法器和两输入乘法器
  • 为了保证时序,一个时钟周期内加法器只能执行一次加法
  • 为了保证时序,一个时钟周期内乘法器只能执行一次乘法

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

设计一个模块,模块的输入为时钟和参数A,输出为结果B。
该模块在每个时钟周期同时做"C=A×2"的计算和"B=C+1"的计算,其中,C为寄存器。

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

时钟周期 参数A(输入) 寄存器C 结果B(输出)
1 A1
2 A2 A1 × \times × 2
3 A3 A2 × \times × 2 A1 × \times × 2 + 1
4 A4 A3 × \times × 2 A2 × \times × 2 + 1
5 A5 A4 × \times × 2 A3 × \times × 2 + 1

从上表可以看到:

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

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

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

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

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

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

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

缓存
缓存
...
参数
第1级
第2级
第3级
第N级
结果

分析定义可知:

  • 正是由于"每一级的平均数据吞吐速率都相同",使得整个计算的平均数据吞吐速率相同,才让输出的结果看上去"像是被一次性地完成的"。
  • 级间缓存在流水线计算中是必不可少的,它们起到了两级间隔离的作用,使得"当第(n+1)级在处理第 i i i个输入对应
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值