【问题标题】:FPGA timing questionFPGA时序问题
【发布时间】:2011-04-03 13:25:35
【问题描述】:

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

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

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

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

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

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

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

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

希望有人能帮助我解决这个问题。提前致谢。

【问题讨论】:

    标签: fpga


    【解决方案1】:

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

    以您的示例为例,在一个周期(一个周期 = 2t)中处理 10 个项目 a = b x c x d 需要 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。

    【讨论】:

    • 嗨,乔治,非常感谢您的回复。当你在一个周期中提到 10 项时,这 10 项指的是什么?第一种情况下的 20 吨和第二种情况下的 11 吨如何到达?很抱歉问了这么简单的问题,因为我浏览了网络和很多书籍,并且没有太多资源讨论计算和提高性能。谢谢。
    【解决方案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,因此增益要大得多。

    【讨论】:

    • 这是一个很好的答案。如果您需要加速,请确定逻辑中的关键路径,并尝试查看是否有一种方法可以将逻辑的执行流水线化。如果您的时钟周期更短并且有助于提高吞吐量,那么更多的时钟周期不一定是坏事。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多