使用 Xilinx Spartan 3 或 Virtex 5 等常规 FPGA 时,执行双精度浮点 64 位乘法或除法需要多少个周期?
据我了解,FPGA 没有硬 FPU,您需要使用标准 IEEE 库或其他材料创建一个。这意味着它不会在单个周期内执行,所以我正在寻找一个粗略的估计来比较 100 Mhz CPU 和 100 MHz Spartan/Virtex FPGA 的性能。
我主要对浮点运算符感兴趣,但如果您有整数运算经验,我也会很感激。
使用 Xilinx Spartan 3 或 Virtex 5 等常规 FPGA 时,执行双精度浮点 64 位乘法或除法需要多少个周期?
据我了解,FPGA 没有硬 FPU,您需要使用标准 IEEE 库或其他材料创建一个。这意味着它不会在单个周期内执行,所以我正在寻找一个粗略的估计来比较 100 Mhz CPU 和 100 MHz Spartan/Virtex FPGA 的性能。
我主要对浮点运算符感兴趣,但如果您有整数运算经验,我也会很感激。
我没有对双精度 FP 执行此操作,但适用于单精度的原理相同,为此我实现了除法(如乘以倒数)。
这些 FPGA 所拥有的,而不是 FPU,是硬连线的 DSP/乘法器块,能够在单个周期内实现 18*18 或 (Virtex-5) 18*25 乘法。较大的设备大约有 1000 个,甚至在 Spartan-3 或 Spartan-6 系列的顶端有 126 或 180 个。
因此,您可以使用 DSP 的加法器或 FPGA 架构对部分乘积求和,使用其中的几个(2 个用于 Virtex-5 执行单精度)将大型乘法分解为较小的运算。
您将在几个周期内得到答案 - SP 为 3 或 4,DP 可能为 5 - 取决于您如何组成加法器树(有时,合成器工具坚持添加流水线寄存器!)。
然而,这是延迟——因为它是流水线的,吞吐量将是每个时钟周期 1 个结果。
对于除法,我使用查找表和二次插值来近似倒数运算符。这比单精度精度要好,如果我愿意,它会(使用更多硬件)扩展到 DP。在 Spartan-6 中,它需要 2 个 BlockRams 和 4 个 DSP/乘法器,以及几百个 LUT/FF 对。
它的延迟是 8 个周期,但吞吐量也是单周期的,因此通过将其与上述乘数相结合,您可以得到每个时钟周期的一个除法。在 Spartan-3 中它应该超过 100MHz。在 Spartan-6 中,综合估计为 185MHz,但在单个路由路径上为 1.6ns,因此 200MHz 在合理范围内。
在 Virtex-5 中,它毫不费力地达到了 200MHz,它的平方根双胞胎也是如此。我有几个暑期学生尝试对其进行重新流水线处理——在不到 12 个周期的延迟下,他们接近 400MHz——平方根为 2.5 ns。
但还记得你可能有一百到一千个 DSP 单元吗?这使您的处理能力比单个 FP 单元高一到两个数量级。
使用 Xilinx Spartan 3 或 Virtex 5 等常规 FPGA 时,执行双精度浮点 64 位乘法或除法需要多少个周期?
答案是:是的!
但说真的,想出一个数字是非常困难的。在设计任何复杂的逻辑时,总是需要在不同事物之间进行权衡,没有一种方法对所有设计都适用。我会尽量覆盖大的。
对于逻辑设计,一个权衡是尺寸与速度。一个简单的例子是假设一个浮点乘法器太慢了。为了加快速度,您所要做的就是添加第二个乘数。您的逻辑大小加倍,但每秒的乘法次数会增加。但即使只看一个乘数,也有不同的乘法方法。有些又快又大,有些又小又慢。
另一个权衡是时钟速度与每次乘法的时钟。我可以设计一些逻辑,在一个时钟内进行一次浮点乘法。但这也需要时钟更慢——可能慢到 10 MHz。或者,我可以将其设计为使用 100 MHz 时钟,但每次乘法需要 10 个时钟。整体速度是相同的(100 ns 内乘一次),但时钟速度更快。
与上一段相关的是时钟速度与乘法延迟的权衡。逻辑设计中有一种技术称为流水线。基本上你把一大块逻辑分解成更小的阶段,每个阶段需要一个时钟周期来完成。这里的优点是每个阶段都可以进行乘法运算,而其他阶段可以进行其他乘法运算。例如,假设我们以 100 MHz 运行,具有 10 级流水线。这意味着每次乘法需要 10 个时钟,但逻辑同时也在处理 10 个不同的乘法!很酷的是它在每个时钟周期都完成了乘法运算。所以每次乘法的有效时钟是 1,每个乘法只需要 10 个时钟即可完成。
因此,对于您的问题,FPGA 可以多快进行乘法运算,这完全取决于您。FPGA 有不同的尺寸和速度,您可以根据需要将尽可能多的逻辑用于手头的任务。但是让我们看一个特定的场景......
假设我们要使用最大的 Spartan-3A,我们只关心 32 位浮点乘法。32 位浮点乘法需要一个 24x24 整数乘法器和一个 8 位加法器。这需要四个专用乘法器块和一些通用切片(太少而无需关心)。XC3S1400A 有 32 个专用乘法器,因此我们可以并行处理 8 个浮点乘法器。对时钟速度的粗略猜测约为 100 MHz。我们可以对这个设计进行完全流水线化,这样我们就可以在每个时钟周期完成四次 32 位浮点乘法,从而实现每秒 8 亿次浮点乘法的有效速度。
双精度乘法每个浮点乘法需要 9 个专用乘法器块,因此我们只能并行执行 3 次乘法 - 导致每秒大约 3 亿次 64 位浮点乘法的速度。
为了比较,让我们考虑较新的 Xilinx Virtex-7 系列。其中的专用乘法器更大,因此我们只需要 6 个专用乘法器块即可进行 64 位浮点乘法。最大的部分还有 1,920 个专用乘法器——因此我们可以并行执行 320 个双精度浮点乘法。这些部分也快得多。我估计我们可以在 200 MHz 下运行这些部分,从而使我们的总速度达到每秒 640 亿次双精度浮点乘法。当然,这些芯片每个的成本约为 10,000 美元。
浮点除法很难快速完成。逻辑要大得多,尤其是在 FPGA 中,而且运行速度要慢得多。大多数 CPU 也是如此,因为除法指令(浮点和定点)运行速度要慢得多。如果速度很重要,那么您希望尽可能多地消除分歧。例如,您应该乘以 0.2,而不是除以 5。事实上,在许多系统上,计算倒数并进行乘法运算比仅进行除法运算要快。
与乘法相同的权衡也适用于除法——只是除法总是比乘法慢得多,也大得多。
至少在 Altera ALT_FP 除法组件上,双精度 64 位除法(52 位尾数)需要 10、24 或 61 个时钟周期(可选)。单个扩展精度可能会有所不同。例如 43 位除法,其中指数为 11 位,尾数为 26 位,它允许选择这样的时钟输出延迟选项:8、18 或 35。启动 ISE 并检查您可以在 Xilinx 上拥有什么。
没有理由不能完成一个周期。然而,这可能是一个相当大的周期并使用大量资源......