520N-MX PCIe 卡照片

白皮书

加速二维FFT

在 Stratix 10 MX 上使用 HBM2 和 oneAPI

概述

当算法包括 "转角 "时,采用HBM2存储器的FPGA比GPU芯片快。这是因为FPGA可以将转角操作与计算重叠,从延迟的角度来看是 "免费 "的。我们使用一个二维FFT来演示该技术,并在下面提供源代码。为了保持 "公平",该代码使用了一个GPU也支持的数据类型。FPGA可以很容易地处理任何数据类型。 

BittWare之前使用英特尔的OpenCL编译器为FPGA创建了一个2D FFT内核。我们现在重写了该代码,以利用英特尔的oneAPI编程模型,特别是其DPC++编程语言。我们在520N-MX卡上实现了类似的性能。英特尔正在宣传oneAPI是需要GPU或FPGA加速的应用程序的最佳工具链。

我们为什么要实现二维FFT?

二维FFT经常出现在FPGA IP库中,因此一般不是程序员自己实现的。然而,并行硬件上的二维FFT的常见实现策略涉及一个 "转角 "或 "数据转置 "步骤,这在CPU和GPU上构成了一个主要的性能瓶颈。

自由转角

我们在这个演示中强调的见解是,FPGA的实现可以在计算的同时进行数据转置,从延迟的角度来看,这几乎是 "免费 "的。

GPU不能做同样的事情,因为GPU架构内部没有足够的内存,在不触及HBM2/GDDR6内存的情况下对中间结果进行流水线处理。

二维 FFT 转角示意图
使用带有转角的一维FFT的两个通道实现二维FFT的说明。

在使用 oneAPI 的 FPGA 上使用 HBM2

Stratix 10 MX有32个伪HBM2内存通道。我们的2D FFT实现使用这些通道的一半。
  • 我们可以在芯片中放置两个二维FFT内核。一个内核使用芯片北侧的所有伪通道接口。 另一个使用南侧的通道。
  • 试图在一个单一的二维FFT中使用所有32个通道会产生我们不想在示范代码中处理的路由挑战。
每个二维FFT内核消耗了我们使用的MX2100 FPGA的大约30%的DSP资源。

每个FPGA的HBM2通道有一排

二维FFT是通过许多一维FFT实现的。一个单一的1D FFT会使其使用的HBM2通道达到饱和。有了16个HBM2通道,我们的二维FFT实现可以并行处理1024行矩阵的16行。 高端GPU可能可以一次性处理所有1024行。FPGA需要64个通道。然而,通道的数量并不重要,因为HBM2/GDDR6带宽是两种情况下的限制因素。

400兆赫Fmax足够了

我们需要400兆赫的OpenCL时钟频率,以使每个HBM2通道达到最佳的32字节突发状态。再快就没有价值了。再慢一点也不是最佳状态。英特尔目前对DPC++的实现利用了BittWare现有的OpenCL板支持包。因此,两种实现方式在FPGA上看起来都像OpenCL。两种实现都需要同样的调整来实现400MHz。这些调整只是在源代码中的表达方式不同。

1D FFT输出

1D FFT不直接向HBM2输出结果。相反,它写入FPGA内部存储器中。额外的FPGA逻辑收集多个一维FFT的结果,将这些结果转角,并将它们写回HBM2,所有这些都是与计算并行的。

1D FFT延迟启动

我们不在同一时钟周期内启动16个一维FFT。相反,我们把它们的起始点错开,每个都是一个复数元素。这样做使我们能够将一维FFT的结果编入转角逻辑。

1 FFT 延迟启动图示

32字节突发事件

我们需要等待四个一维FFT的输出,以便能够将转置的数据以32字节的方式写入HBM。

32 字节突发插图
oneAPI 徽标

使用oneAPI编程的便利性

BittWare的开发团队使用RTL(Verilog和VHDL)、HLS(主要是C++)、OpenCL,以及现在的DPC++。 我们以前发表过一份白皮书,对RTL与HLS进行了比较。这个项目是我们第一次有机会比较OpenCL与DPC++。

我们很高兴地报告,从用于FPGA的OpenCL代码转移到用于FPGA的DPC++很容易。针对FPGA和HBM2封装存储器的调整与OpenCL版本非常相似。 在主机上的数据移动很简单。我们甚至从NumPy中调用了我们的2D FFT内核,我们从未尝试过使用OpenCL版本。

用于FPGA加速的oneAPI概述视频

其他细节

备用的内部存储器

我们正在使用512个M20K存储器(占MX2100的12.5%)。

二维FFT参数

为FPGA实现的FFT的长度通常在比特流编译时设置。

  1. 我们的演示使用一个固定的1024×1024的复数矩阵,32位浮点数。
  2. 我们的FFT实现交织了复数的组成部分(而不是使用单独的实数和虚数矩阵)。
  3. 对齐并不重要,因为数据被复制到HBM内存中,它将变成32字节对齐。

一维FFT的实现

我们实现了我们自己的一维FFT(而不是使用某人的FPGA IP库)。一维FFT是radix 2和全流水线的。它不是原地的。

业绩

二维FFT性能将始终受到HBM2带宽的限制。因此,我们的重点是找到一种能够使HBM2带宽最大化的算法。这也意味着我们可以使用HBM2带宽基准来精确估计FFT性能。

批次1实现的HBM2峰值性能,在同一设备上有两个独立的内核,是291GBytes/Sec。当管道/批处理时,峰值带宽可以达到337GBytes/Sec

总结

我们很高兴能够将我们的2D FFT从OpenCL版本快速移植到oneAPI。虽然为支持HBM2的FPGA卡优化方法的工作已经完成,但它仍然为基于OpenCL的用户提供了一条极好的途径,使其能够在BittWare硬件上迁移到oneAPI,并且影响最小。

在FPGA上使用HBM2可以在某些应用中获得一些明显的优势,比如我们在这里看到的。如果你想了解更多关于我们介绍的代码的信息,请通过下面的表格联系我们,询问是否有货,或者了解更多关于BittWare的520N-MX FPGA卡

索取源代码

你可以通过填写这个表格来申请开放源代码的TAR文件。 你将收到的代码具有开放源码的传奇色彩。

如何使用该代码:

我们把OneAPI 2D FFT编译成一个Linux动态链接的共享对象库。只要输入 "cmake . "就可以创建这个库。

我们从一个简单的NumPy脚本中调用该库,该脚本创建一些输入数据,然后验证或绘制输出。输入 "python runfft.py "可以看到一个图形。

上面的软件是在Centos 8上用英特尔OneAPI工具Beta 10版本测试的,使用的是BittWare 520N-MX卡,该卡承载了MX2100 FPGA。为该卡发布的OpenCL板支持包也允许OneAPI工作

"*"表示必填项目

名称*
请检查这是一个有效的电子邮件,因为PDF将使用这个地址发送。
地址和城市*