在FPGA上优化实现复数浮点计算
高性能浮点处理一直与高性能CPU相关联。在过去几年中,GPU也成为功能强大的浮点处理平台,超越了图形,称为GP-GPU(通用图形处理单 元)。新创新是在苛刻的应用中实现基于FPGA的浮点处理。本文的重点是FPGA及其浮点性能和设计流程,以及OpenCL的使用,这是高性能浮点计算前沿的编程语言。
各种处理平台的GFLOP指标在不断提高,现在,TFLOP/s这一术语已经使用的非常广泛了。但是,在某些平台上,峰值GFLOP/s, 即,TFLOP/s表示的器件性能信息有限。它只表示了每秒能够完成的理论浮点加法或者乘法总数。分析表明,FPGA单精度浮点处理能够超过1 TFLOP/s。
一种不太复杂的常用算法是FFT。使用单精度浮点实现了4096点FFT。它能够在每个时钟周期输入输出四个复数采样。每一个FFT内核运行速度超过80 GFLOP/s,大容量FPGA的资源支持实现7个这类的内核。
但是,如图1所示,这一FPGA的FFT算法GFLOP/s接近400 GFLOP/s。这是"按键式"OpenCL编译结果,不需要FPGA专业知识。使用逻辑锁定和DSE进行优化,7内核设计接近单内核设计的Fmax,将 其GFLOP/s提升至500,超过了10 GFLOP/s每瓦。
这一每瓦GFLOP/s要比CPU或者GPU功效高很多。对比一下GPU,GPU在这些FFT长度上效率并不高,因此,没有进行基准测试。当FFT长度达到几十万个点时,GPU效率才比较高,能够为CPU提供有效的加速功能。
图1:Altera Stratix V 5SGSD8 FPGA浮点FFT性能。
总之,实际的GFLOP/s一般只达到峰值或者理论GFLOP/s的一小部分。出于这一原因,更好的方法是采用算法来对比性能,这种算法能够合理的表示典型应用的特性。算法越复杂,典型实际应用的基准测试就越具有代表性。
并不是依靠供应商的峰值GFLOP/s指标来确定处理技术,而是使用比较复杂具有代表性的第三方评估。高性能计算理想的算法是Cholesky分解。
这一算法经常用于线性代数,高效的解出多个方程,可以实现矩阵求逆功能。这一算法非常复杂,要获得合理的结果总是要求浮点数值表示。计算需求与N3成正比,N是矩阵维度,因此,一般对处理要求很高。实际GFLOP/s取决于矩阵大小以及所要求的矩阵处理吞吐量。
表1显示了基于Nvidia GPU指标1.35TFLOP/s的基准测试结果,使用了各种库,以及Xilinx Virtex6 XC6VSX475T,其密度达到475K LC,这种FPGA针对DSP处理进行了优化。用于Cholesky基准测试时,这些器件在密度上与Altera FPGA相似。
表1:田纳西州大学的GPU和Xilinx FPGA Cholesky基准测试。
LAPACK和MAGMA是商用库,而GPU GFLOP/s是指采用田纳西州大学开发的OpenCL实现的。对于小规模矩阵,后者更优化一些。
中等规模的Altera Stratix V FPGA (460kLE)也进行了基准测试,使用了单精度浮点Cholesky算法。如表2所示,在Stratix V FPGA上进行Cholesky算法的性能要比Xilinx结果高很多。
表2:BDTI的Altera FPGA Cholesky和QR基准测试。
应指出,矩阵大小并不相同。田纳西州大学结果是从[512×512]矩阵大小开始的。BDTI基准测试达到了[360×360]矩阵大小。原因是,矩 阵规模较小时,GPU效率非常低,因此,在这些应用中,不应该使用它们来加速CPU。在规模较小的矩阵时,FPGA的工作效率非常高。
其次,BDTI基准测试是基于每个Cholesky内核的。每个可参数赋值的Cholesky内核支持选择矩阵大小,矢量大小和通道数量。矢量大小大 致决定了FPGA资源。较大的[360×360]矩阵使用了较长的矢量,支持这一FPGA中实现一个内核,达到91GFLOP/s。较小的[60×60] 矩阵使用的资源更少,因此,可以实现两个内核,总共是2×39=78GFLOP/s。最小的[30×30]矩阵支持实现三个内核,总共是 3×26=78GFLOP/s。
FPGA看起来更适合解决数据规模较小的问题。原因之一是因为计算负载随N3而增大,数据I/O随N2增大,最终,随着数据的增加,GPU的I/O瓶 颈不再是问题。另一项考虑是吞吐量。随着矩阵规模的增大,由于每个矩阵的处理量增大,矩阵每秒吞吐量会大幅度下降。在某些点,吞吐量变得非常低,以至于无 法满足很多应用的要求。在很多情况下,会分解大规模矩阵,处理每个小的子矩阵,以解决由于庞大的处理负载造成的吞吐量限制问题。
对于FFT,计算负载增加N log2 N,而数据I/O随N增大而增大。对于规模较大的数据,GPU是高效的计算引擎。作为对比,数据长度很短时,FPGA是高效的计算引擎,更适合FFT长度达到数千的很多应用,对于GPU,FFT长度是数十万。
GPU和FPGA设计方法
使用Nvidia
- 使用示波器进行EMI共模电流进行测量(12-22)
- 巧用示波器频域方法分析电源噪声(04-23)
- 使用FFT进行谐波分析(08-09)
- 示波器的FFT功能使用指南(12-14)
- 矢量分析仪原理详解(01-22)
- 扩频信号基于FFT码捕获的计算量分析(12-25)