淘宝网
按需网络研讨会

BittWare 和英特尔标识
oneAPI 徽标和 PCIe 卡

使用英特尔® oneAPI™实现FPGA的高性能计算加速

加入BittWare和英特尔的行列,我们将着眼于FPGA的oneAPI™。我们将研究一个实际的二维FFT加速实例,该实例利用了Intel® Stratix® 10 MX,包括BittWare的520N-MX卡上的HBM2存储器。

你会学到什么

视频转述

(马库斯)

感谢您参加我们的网络研讨会,这次研讨会的主题是英特尔的 oneAPI,重点是使用 FPGA 进行高性能计算加速。首先,请允许我简要介绍一下我们的主讲人以及他们将介绍的内容。

第一位是 BittWare 的 Craig Petrie。他的职业生涯始于Nallatech公司的FPGA工程师,目前担任BittWare公司的营销副总裁。他将介绍FPGA与高性能计算的关系,以及BittWare的一些板卡和我们对oneAPI的支持。      

接下来,我们将聆听英特尔公司 David Clarke 的演讲。他是一位技术销售专家,将概述英特尔的生态系统、软件和平台,以便更好地利用 FPGA 的强大功能,特别是通过引入更简便的软件驱动开发流程。

然后,Maurizio Paolini 将解释英特尔为什么要推出 oneAPI。他是一名现场应用工程师,在Altera工作了20多年,在英特尔收购Altera后,他转而专注于云和企业加速。他将解释 oneAPI 如何通过简化跨多种架构的加速开发来解决编程难题。         

最后,我们将聆听 BittWare 首席系统工程师 Richard Chamberlain 的演讲。理查德用 OpenCL 为 BittWare 的 FPGA 卡创建了最初的 2D FFT 演示,现在已经移植到 oneAPI,因此他将与我们分享成果的详细信息。

请注意,二维 FFT 代码可应要求在 BittWare 网站的资源部分提供。

如果您是在我们的直播时段收看此节目,您需要准备好在主要演讲结束后与我们的专家小组成员进行问答。无论是现在还是在问答环节中提问,都可以找到问题面板,输入您的问题,我将在大约 30 分钟后的问答环节中向我们的小组成员提问。

好了,让我们从克雷格-皮特里(Craig Petrie)的高性能计算概述开始。

(克雷格)

好的,谢谢你,马库斯。

对于不熟悉 BittWare 的人来说,我们实际上是 Molex 两次收购的产物。

第一家是 2016 年成立的 Nallatech 集团,总部位于加利福尼亚州和英国。第二家是 2018 年成立的 BittWare,总部位于新罕布什尔州康科德。两家公司于 2018 年合并,并重新命名为 Molex 旗下公司 BittWare。

总之,我们在各个市场拥有三十年的 FPGA 专业经验。我们是英特尔合作伙伴联盟(Intel Partner Alliance)计划的成员,在过去的二十年里,我们开发出了采用每一代 Altera 和英特尔 FPGA 的高端 FPGA 加速器。

另一个值得强调的独特卖点是,我们是 Molex 大型集团公司的一部分,拥有内部制造和全球物流。

具体来说,我们是数据通信和专业解决方案集团或 DSS 的一个部门。

这使我们能够将 FPGA 专业技术和先进产品与 Molex 全球品牌的规模和影响力相结合。

因此,BittWare 是唯一一家能够满足企业级鉴定、验证、生命周期和支持要求的 FPGA 卡和系统产品供应商。

BittWare 支持多种英特尔 FPGA 器件。不过,在本次技术研讨会上,我们将重点介绍 BittWare 的两款旗舰产品。

首先是 520 系列,它支持英特尔的 Stratix 10 GX、NX 和 MX。

MX 版采用 16GB 内置 HBM2 内存,是我们今天演示的目标显卡,它使用 oneAPI。

我们的新板卡支持包原生支持 OpenCL,支持 16 个 PCI Express Gen 3 通道、全部 16GB HBM2 内存,甚至 I/O 管道,允许通过 QSFP28 网络端口使用低延迟、高带宽和确定性卡对卡串行连接扩展应用。

BittWare 的 520 系列 OpenCL 可编程加速器已成功部署在两台公共领域的超级计算机上。

请查看这些文章和视频,了解更多信息。

我们的第二个目标产品是采用英特尔 Agilex FPGA 的新旗舰加速器。

BittWare IA-840f 是英特尔公司目前推出的最大的 Agilex FPGA。首批产品计划于 7 月份发货。

最初的工具流程将基于 VHHL 和 Verilog。不过,我们将在今年晚些时候推出对 oneAPI 的支持。

IA-840f 与 520N 系列具有相同的企业级基因。不过,我们改进了所有主要接口,包括通过 Agilex P-Tile 硬 IP 支持 PCIe Gen 4 x16 通道。IA-840f 是一款 GPU 大小的 PCIe 卡,可选择主动、被动甚至液体冷却。它兼容几乎所有采用 GPU 的服务器和边缘平台。

BittWare 的 FPGA 加速产品专为四大应用领域而设计:计算、网络、存储和传感器处理,涵盖数据中心、云基础设施和网络边缘空间。

FPGA 在这些应用领域中的工作负载价值主张非常强大,而且每年都在增强,许多客户现在都在采用人工智能和机器学习推理技术,以提高性能,同时降低总拥有成本。

我们现在要做的是提供一些有关 BittWare 基于英特尔 FPGA 的加速器可加速的计算密集型工作负载的信息。

特别是那些使用 OpenCL 和 oneAPI 等高级工具的用户。

为此,我们将利用 BittWare 网站,该网站为每个主要应用领域都提供了专门的登陆页面。

每个页面都有丰富的信息,包括客户案例研究、白皮书、参考设计和视频。

好的,首先让我们跳转到计算登陆页面。点击这里。

因此,根据我们的经验,使用 FPGA 加速高性能计算工作负载的客户几乎总是在构建一个异构平台。这种平台的特点是多种互补技术协同工作。例如 x86(基于 CPU)、GPGPU 和 SmartNIC。

FPGA 不仅有助于提高整体应用性能,还能提供工作负载灵活性和高能效运行。

对于那些不太熟悉 FPGA 技术或来自软件导向背景的人来说,要确定自己的应用是否能从 FPGA 加速中获益,可能会相当困难。

在这个登陆页面上,我们试图为客户提供一些指导,帮助他们做出判断。

这里有很多内容。

因此,如果您在网络研讨会后有机会,我建议您花一些时间更详细地了解登陆页面和内容。

因此,如果客户能够将其应用归结为一系列明显的特征,那么就有可能快速确定是否应在应用中使用 FPGA。

我们将其归纳为 FPGA 最适合的五种应用特性。

因此,如果您能勾选这些特性中的一个或多个,那么您可能就应该更详细地探索如何使用 FPGA。

好了,我们看到的第一个特点是,应用程序具有高度并行性。也就是说,你可以同时执行多项计算。

考虑到设备的粒度和并行性,FPGA 是一个很好的选择。

第二种情况是内存访问模式对缓存不友好。如果您使用的是微处理器或 GPGPU,它们会有固定的内存层次结构。另一方面,FPGA 允许客户构建完全定制的存储器层次结构。因此,如果您的应用需要非标准的东西,FPGA 是一个更好的选择。

第三种特性是当你使用 CPU 或 GPGPU 本身不支持的数据类型时。

因此,如果客户使用的是双精度浮点运算的编程应用程序,那么您可能应该使用 GPGPU 来解决这类问题。

另一方面,如果您的运算级别较低,例如位级、模式匹配或某种不寻常的整数计算,甚至可能是超常的单精度浮点运算,那么 FPGA 是您可以考虑的最佳选择。

第四种情况比较明显:如果您的应用要求低延迟或确定性操作,那么在这种情况下,FPGA 就是理想的选择。

我们在此列出的第五个用例是,客户需要与某种外部输入/输出接口连接。这可以有多种形式和尺寸。这可能包括协议或我们的行业标准,如以太网或 NVMe。

FPGA 还可以与定制或专有接口进行通信。在这种情况下,FPGA 输入/输出可高度定制,因为大多数 FPGA 引脚都与协议无关。因此,在这些情况下,FPGA 是非常理想的选择。

好的。综上所述,现在请大卫和毛里齐奥为大家介绍英特尔公司和 oneAPI 工具。大卫,交给你了。

 大卫

谢谢你,克雷格。你好,我叫大卫-克拉克(David Clarke)。我是英特尔公司的技术销售专家,负责推动 FPGA 加速进入云计算和企业领域。

英特尔在计算和数据处理领域拥有悠久的历史,业务范围横跨从边缘到数据中心的众多市场,包括金融服务行业、人工智能、机器学习、科学研究和高性能计算等。

英特尔向来以其 CPU 技术而闻名,收购 Altera 是为了利用 FPGA 技术的优势。

正如我们所提到的,高性能计算市场不仅使用中央处理器,还因其独特的优势而采用 FPGA,无论是深度流水线计算、实时在线低延迟确定性处理,还是加速高度并行的数学函数,同时提供每瓦总拥有成本的性能优势。

但是,要在市场上采用一项新技术是很困难的,它取决于三个标准之一:

  • 新技术是当今任何标准技术都无法解决的特定问题的唯一解决方案。
  • 收益如此之大,投资、招聘或重新培训资源都是可以容忍的。
  • 当较小的增量效益非常容易实现时,它们就会具有吸引力。

迄今为止,FPGA 一直是一种仅适用于某些应用和市场的技术,因为传统上它需要使用 RTL 专业语言或专业资源进行开发。

我们的终极目标一直是通过无需了解 FPGA 本身的开发流程,利用 FPGA 在云计算和企业中的优势。这种流程可以让内部已有的资源瞄准 FPGA,而无需投资或重新培训。从根本上使软件工程师能够设计硬件,从而使 FPGA 成为一种可供开发人员、合作伙伴、系统集成商和客户使用的技术,横跨非传统 FPGA 市场和应用领域。

英特尔及其合作伙伴生态系统(如 BittWare)提供了一系列市场就绪的平台,再加上英特尔 oneAPI 的出现,提供了一种方法论,使非 FPGA 用户能够利用 FPGA 的独特能力来解决计算难题,并提供改变游戏规则的加速功能,最终使用非硬件开发资源可以采用的流程。

要了解更多信息,我现在请英特尔加速专家工程师 Maurizio 为大家介绍 oneAPI。谢谢。

(Maurizio)

谢谢你,戴维。英特尔为什么要推出 oneAPI?

在当今的高性能计算领域,有多种硬件架构可用于运行工作负载:CPU、GPU、FPGA 和专用加速器。工作负载的多样性推动了架构的多样性。没有一种架构最适合每种工作负载,因此需要混合架构,以便在所有可能的情况下最大限度地提高性能。

然而,使用异构架构会带来很大的负担。首先,每种以数据为中心的硬件都需要使用不同的语言和工具进行编程。这意味着需要为不同的平台维护独立的代码库,跨平台重复使用代码变得不可能。此外,每个平台都有自己的一套工具,用于编译、分析和调试代码。

这意味着,为每个平台开发软件都需要单独投资,几乎不可能针对不同的架构重复使用这些工作。

oneAPI 就是为解决这一问题而设计的。它提供了一个统一的编程模型,可简化跨不同架构的开发。

利用 oneAPI 编程模型,开发人员可以使用相同的语言和库针对不同的硬件平台,并使用同一套调试和性能分析工具在不同的平台上开发和优化代码。例如,他们可以通过 Vtune 剖析器获得主机和加速器的运行时数据。

跨平台和硬件架构使用相同的语言,使源代码更易于重复使用。即使在将代码转移到不同平台时仍然需要特定平台的优化,也不再需要代码翻译。使用通用语言和工具集可以加快对新开发人员的培训,加快调试速度,最终提高工作效率。

oneAPI 语言是 Data Parallel C++。这是一种为提高并行编程效率而设计的高级语言,以 C++ 语言为基础,具有广泛的兼容性。

DPC++ 不是一种专有语言。它的开发是由一个开放的跨行业倡议推动的。它的起点是 SYCL,由 Khronos Group 行业联盟开发;

语言增强功能由一个社区项目推动,英特尔公司积极为该项目做出贡献,通过扩展功能来弥补语言方面的不足。

英特尔 oneAPI 产品包括一个基于 LLVM 编译器技术的 DPC++ 编译器,利用了英特尔多年的编译器开发经验。

它还包括一个源代码到源代码的兼容工具,可帮助将 CUDA 转换为 DPC++。

现在,为 FPGA 编译代码的主要问题之一是编译时间。将 DPC++ 代码转换为时序封闭的 FPGA 设计(实现代码指定的硬件架构)所需的后端编译过程可能需要数小时才能完成。因此,我们对 FPGA 开发流程进行了调整,以尽量减少完整的编译运行。

本幻灯片说明了 FPGA 开发流程。 

流程的第一步是功能验证,即使用测试台检查代码的正确性。这需要在开发平台上进行仿真,即在 CPU 上编译和执行针对 FPGA 的代码。这样,当发现错误并需要修复时,周转时间就快得多。为此,可以使用标准的 CPU 调试器(如 GDB 的英特尔分发版)。

功能验证完成后,将通过编译器生成的报告进行静态性能分析。报告包括识别内存、数据流和设计中其他性能瓶颈所需的所有信息,以及解决上述瓶颈的优化技术建议。此外,报告还提供目标 FPGA 的设计面积和时序估计。

只有在静态分析结果令人满意后,才能进行全面编译。请注意,编译器可以在生成的硬件中插入请求剖析逻辑。剖析逻辑可生成内存和管道访问的动态剖析数据,Vtune 性能分析器随后可利用这些数据找出无法通过其他方式发现的数据模式相关瓶颈。

要开始在 FPGA 上使用 oneAPI,需要三个组件:

  • 英特尔 oneAPI 基础工具包
  • 用于 oneAPI 基础工具包的英特尔 FPGA 附加组件
  • 以及所使用板卡的板卡支持包(或 BSP

oneAPI 组件可从英特尔网站下载,而 BSP 则由板卡供应商提供。

无论谁想了解有关 FPGA 上 oneAPI 的更多信息,都可以利用大量资源。首先,可以在英特尔网站上找到英特尔 oneAPI DPC++ 规范,其中包括《英特尔 oneAPI 编程指南》和《英特尔 oneAPI DPC++ FPGA 优化指南》。

然后,可以从 Github 网站下载丰富的教程,这些教程涵盖了该语言的多个功能,并附有可在 oneAPI 工具链中使用的代码片段。

此外,还针对金融、数据库加速、压缩等几个重点领域提供了全面的高性能参考设计。

最后是英特尔提供的培训。这些培训由教师授课,时间为全天和半天,安排在不同的全球环境展望办公室。

英特尔还提供连接到英特尔开发云上的 Jupyter 实验室的 Jupyter 笔记本模块,供有兴趣的用户按照自己的进度学习,并在受控环境中玩代码。

最后,还可以在 Springer 网站上找到一本书,免费下载 PDF 格式或购买平装本。

现在,请理查德发言。

(理查德)

本 FFT 2D 案例研究针对 BittWare 520N-MX 加速卡。520N-MX 是一款 PCIe 板卡,采用集成 HBM2 内存的英特尔 Stratix 10 MX FPGA。HBM2 的高带宽可加速内存绑定的应用。本讲座说明了如何利用片上 HBM 存储器和 oneAPI 工具流最大限度地提高 2D FFT 的性能。

本使用案例选择了 2D FFT,因为这是一个内存受限的问题。特别是选择的大型 2D FFT 过大,无法在本地 FPGA 存储器中适应,因此迫使计算依赖于 HBM 带宽。

在本讲座中,我们将说明如何优化 HBM 内存访问模式,使其尽可能高效。

Stratix 10 MX 有 16 个 HBM 存储器,每个存储器有 2 个伪端口,均可独立寻址。设备顶部有 16 组内存,底部有 16 组内存。每个端口的最大带宽为 12.8 GB/s,在这里使用的速度等级为 -2 的设备上,理论总性能为 409 GB/s。

二维 FFT 可以通过对图像行进行一系列一维 FFT,然后对图像列进行一维 FFT 来计算。

要生成变换,需要对原始图像进行两次处理。当内存访问不连续时,所有 SDRAM 内存都会降低性能。从行寻址转到列寻址(有时称为转角)需要在 SDRAM 存储器中跳行,从而影响整体性能。

为了衡量转角对性能的影响,我们创建了一个简单的测试应用程序。

该图说明了在此 2D FFT 示例中观察到的数据访问模式下,突发大小对平均读/写带宽的影响。该图表示单个 HBM 伪通道的性能。

有两种可能的内存配置需要考虑,各有各的优点。读取和写入同一个 HBM 允许实现一个 FFT 的批量处理,但在整体性能上会付出很小的代价。蓝线表示这种情况。

另外,使用独立的输入和输出 HBM 组(如红线所示)可显著提高带宽,但需要对多个 2D FFT 进行批处理或流水线处理,以充分利用可用带宽。

本例选择了 512 字节的突发大小,因为它既能提供接近最佳的性能,又能减少本地 FPGA 内存对中间结果缓存的需求。

2D FFT 示例最初使用英特尔 FPGA OpenCL 编译器编程,并移植到 oneAPI 进行演示。内核代码在两个软件流程之间没有明显变化,只需要对优化实用程序进行基本修改。流水线和并行化技术保持不变。

DPC++ 建立在 SYCL 的基础上,使用 SYCL 结构来推断主机和内核代码之间的分离,而不是为主机和内核二进制文件使用两种不同的流程。DPC++ 不使用不同的编译器编译主机代码和内核代码,而是只进行一次编译。

OpenCL 的另一个变化是创建了 FAT 二进制文件,FPGA 映像现在包含在可执行文件中。

下文将简要讨论本应用程序接口中使用的一些 DPC++ 和 SYCL 结构。

设备可以是 FPGA、CPU 或 GPU,通过选择器进行访问,选择器为应用程序提供一个特定加速器类型的句柄。然后,SYCL 使用该句柄创建一个队列,用于与目标设备通信。

本代码示例说明了如何使用 FPGA 硬件或仿真设备。仿真非常重要,因为 FPGA 的编译可能需要很多小时。

DPC++ 使用 SYCL 缓冲区和访问器来描述主机和内核应用程序都能访问的存储器。本示例代码将数据从数组复制到缓冲区类型,然后使用 SYCL 访问器类型访问缓冲区。

缓冲区的位置通过访问属性提供。在这里,我们使用缓冲区位置属性指向 HBM 存储器 0(共 32 个)。属性 ID 指的是每个内存库在设备的电路板支持包中出现的顺序。

队列将主机程序与单个设备连接起来。使用生成的句柄,可以向队列提交 SYCL 任务(在本例中为单个任务内核)。这也是添加接口特定属性的地方。

在此设计中,我们在多个 HBM 存储器上对输入数据进行条带化处理,每个 HBM 接口专用一个 1D FFT。这在 FPGA 计算和存储器带宽之间实现了良好的平衡。每个 FFT 都是完全流水线设计,峰值吞吐量约为 40 GFlops/秒。

1D FFT 的输出被放入本地缓冲区。在这里,我们存储了足够多的数据行,因此我们可以向 HBM 创建足够大的突发,以保持良好的吞吐量。这个简化的动画演示了在实际设计中如何实现转角。它展示了在写回 HBM 时,如何使用临时存储在本地片上存储器中的 8 行数据来实现 8 个字的突发。实际上,16 个 FFT 并行执行,64 行结果缓冲。

第二阶段需要对多个一维 FFT 的输出进行转置。这不是在整个图像上执行,而是作为主流水线的一部分执行。每个 FFT 的输出必须写入所有其他 HBM 存储体。这需要从每个输出缓冲区多次访问所有 HBM 存储器,从而在流水线中产生气泡,降低性能。由于访问是线性的,我们可以利用 FPGA 中大量的寄存器来创建专用移位寄存器。

代码示例对此进行了说明,该示例仅使用 FPGA 寄存器创建了一个全流水线滑动窗口。每列输出都会延迟,以便每个时钟周期只在每个 HBM 上更新一次。最后,再次重复整个过程,最终图像将在多个 HBM 上以与原始图像相同的方向进行条带化处理。

将代码移植到 DPC++ 后,我们首先要做的是测试代码的功能是否正确。

所有英特尔(Intel)和 BittWare 的示例都可以进行仿真,这样就可以在本地处理器上运行内核代码。对于 2D FFT 示例,我们只需键入 make fpga_emu("EMU "表示 FPGA 仿真)。运行仿真可执行文件可在数秒内验证设计的功能。

下面是使用 Python 显示输入和转换图像的 2D FFT 输出示例。一旦验证了设计的功能,接下来的任务就是检查流水线效率和资源使用情况。

具体做法是以 FPGA 为目标,但在初始设计分析完成后暂停。要生成报告,我们键入 "制作报告"。这需要几分钟才能完成,下面是我们之前运行的报告。

首先,我们检查内核的流水线操作是否成功。我们希望启动间隔(initiation Interval)为 1,或者换句话说,内核完全流水线化。接下来,我们检查所需资源。如果一切正常,我们就可以为 FPGA 进行编译。这将耗时数小时。

创建一个包含 FPGA 二进制文件的新可执行文件。运行该可执行文件后,我们可以看到在 FPGA 上运行 FFT 内核所需的时间。

要启用 Vtune 对 FPGA 内核进行配置,只需使用 -XS 配置文件对 oneAPI FPGA 可执行文件进行编译即可。这将自动为 FPGA 设计添加性能计数器,Vtune 可在运行应用程序后利用这些计数器检索统计数据。

要对 FPGA 进行剖析,可通过选择 CPU/FPGA 交互选项来选择正确的加速器配置。选择包含 FPGA 设计的主机可执行文件 FAT 二进制文件并启动可执行文件。这将运行设计并从主机和 FPGA 收集剖析信息。

在摘要页面,我们可以看到应用程序的总计时器以及运行 FPGA 内核所需的大致时间。

选择 "平台 "后,系统会给出一个事件时间表,显示卸载的 FPGA 内核如何与应用配置文件相匹配。

放大 FPGA,可以看到 FPGA 内核所有内部和外部存储器接口的配置文件信息。这提供了有关内核与外部存储器交互的重要信息。将鼠标悬停在其中一个内存配置文件上,可以看到有关全局内存带宽、存储数量、内核缺乏数据的频率、占用率、内核处理数据的时间百分比以及空闲时间(内核无所事事的时间百分比)的信息。

从这些报告中,我们可以迅速确定哪些内存访问需要进一步关注。

这里采用的方法是该算法众多有效实现方法中的一种。在我看来,这就是为什么高级工具对于现代 FPGA 开发如此重要的原因。

英特尔的 oneAPI 设计流程使快速试验不同设计的能力成为可能,让软件工程师能够快速评估将代码卸载到 FPGA 对性能的影响。

(马库斯)

好的。谢谢你,理查德,为我们演示了 oneAPI。马库斯又要开始问答了。

最后,我想简单总结一下,我们很高兴能为 BittWare 的 oneAPI 卡提供支持,比如我们配备 HBM2 的 520N-MX。如果你想了解更多关于 Richard 刚刚向你展示的 2D FFT 演示的信息,我们在 BittWare 网站上有一份白皮书,可以在资源部分找到。

白皮书上还有一份申请表,可用于获取该演示的源代码。

好的,如果你有问题,有些问题已经提出来了,但是,如果你现在有问题要问我们的小组成员,应该有一个问题图标或文本面板,你可以打出你的问题,我会把它们发给小组成员。所以,你们要把问题打出来,我会用语音发给小组成员,他们会用语音回答。

现在,我要切换到问答界面。好的克雷格,你能看到我的问答屏幕,听到我的......吗?

(克雷格)

是的,我可以。

(马库斯)

好吧那么,第一个问题。