2

我是 FPGA 编程的新手,我对整体执行时间方面的性能有疑问。

我读过延迟是根据周期时间计算的。因此,总执行时间 = 延迟 * 周期时间。

我想优化处理数据所需的时间,我将测量整体执行时间。

假设我有一个计算 a = b * c * d。

如果我让它在两个周期内计算 (result1 = b * c) & (a = result1 * d),则总执行时间将是 2 * 周期时间的延迟(由乘法运算的延迟决定,例如值X) = 2X

如果我在一个周期内进行计算(a = b * c * d)。总执行时间将是 1 * 周期时间的延迟(比如值 2X,因为它有两倍的延迟,因为两次乘法而不是一次)= 2X

因此,似乎为了优化执行时间方面的性能,如果我只专注于减少延迟,则周期时间会增加,反之亦然。是否存在延迟和周期时间都可以减少的情况,从而导致执行时间减少?我什么时候应该专注于优化延迟,什么时候应该专注于周期时间?

另外,当我用 C++ 编程时,似乎当我想优化代码时,我想优化延迟(执行所需的周期)。然而,对于 FPGA 编程,优化延迟似乎是不够的,因为周期时间会增加。因此,我应该专注于优化执行时间(延迟 * 周期时间)。如果我想提高程序的速度,我是否正确?

希望有人能帮助我。提前致谢。

4

3 回答 3

2

我倾向于将延迟视为从第一个输入到第一个输出的时间。由于通常有一系列数据,因此查看一个接一个地处理多个输入所花费的时间很有用。

以您的示例为例,在一个周期(一个周期 = 2t)中执行 a = bxcxd 处理 10 个项目需要 20t。然而,在两个 1t 周期内完成,处理 10 个项目需要 11t。

希望有帮助。

编辑添加时间。

在一个 2t 循环中计算。10 次计算。

Time   0  2  2  2  2  2  2  2  2  2  2  = 20t

Input  1  2  3  4  5  6  7  8  9 10
Output    1  2  3  4  5  6  7  8  9 10

在两个 1t 循环中计算,流水线,10 次计算

Time   0  1  1  1  1  1  1  1  1  1  1  1  = 11t

Input  1  2  3  4  5  6  7  8  9 10
Stage1    1  2  3  4  5  6  7  8  9 10
Output       1  2  3  4  5  6  7  8  9 10

两种解决方案的延迟都是 2t,第一个是一个 2t 周期,第二个是两个 1t 周期。然而,第二种解决方案的吞吐量是其两倍。一旦考虑了延迟,您每 1t 周期就会得到一个新的答案。

因此,如果您有一个复杂的计算需要 5 个 1t 周期,那么延迟将为 5t,但吞吐量仍为 1t。

于 2011-04-04T09:10:22.480 回答
2

除了延迟和周期时间之外,您还需要另一个词,即吞吐量。即使需要 2 个周期才能得到答案,如果您可以在每个周期中放入新数据并在每个周期中取出,那么您的吞吐量可以比“在一个周期内完成所有工作”提高 2 倍。

假设您的计算在一个周期内需要 40 ns,因此吞吐量为 2500 万个数据项/秒。

如果您将其流水线化(这是将计算拆分为多个周期的技术术语),您可以在 2 批 20ns + 一点内完成(您在必须进入的额外寄存器中丢失一点)。假设该位为 10 ns(这是很多,但使总和很容易)。所以现在需要 2x25+10=50 ns => 20M items/sec。更差!

但是,如果您可以使 2 个阶段彼此独立(在您的情况下,不共享乘数),您可以每 25+a 位 ns 将新数据推送到管道中。这个“一点”会比前一个小,但即使是整个 10 ns,你也可以以 35ns 次或接近 30M 条/秒的速度推送数据,这你开始的要好。

在现实生活中,10ns 会少得多,通常是 100s ps,因此增益要大得多。

于 2011-04-04T12:39:43.690 回答
1

George 准确地描述了延迟的含义(与计算时间无关)。看来您想优化设计以提高速度。这是非常复杂的,需要很多经验。总运行时间为

execution_time = (latency + (N * computation_cycles) ) * cycle_time

其中 N 是您要执行的计算次数。如果你为加速而开发,你应该只计算大型数据集,即 N 很大。通常你对延迟没有要求(这可能在实时应用程序中有所不同)。决定因素是cycle_timecomputation_cycles。而且这里真的很难优化,因为有关系。这cycle_time取决于您设计的关键路径,并且您拥有的寄存器越少,关键路径就越长。时间越长,越大cycle_time。但是您拥有的寄存器越多,您的寄存器就越高computation_cycles(每个寄存器将所需的周期数增加一个)。

也许我应该补充一点,延迟通常是计算周期的数量(它是导致延迟的第一个计算),但理论上这可能会有所不同。

于 2011-04-04T11:56:30.860 回答