面向 OpenCL™ 的英特尔® FPGA SDK -支持中心

欢迎访问面向 OpenCL™ 的英特尔® FPGA SDK 支持中心!在这里,您将获得关于如何模拟、编译和分析内核的信息。此外,您将获得内核优化指南,了解如何在运行主机应用的同时,调试系统。根据开发平台的不同,本页面被分为两大类:面向 FPGA 的内核开发人员和面向 CPU 的主机代码开发人员。  

尽情享受您的探索之旅!

面向 OpenCL™ 的英特尔® FPGA SDK 支持软件开发人员提升其应用在使用英特尔 CPU 和 FPGA 构建的异构平台上的运行速度。面向 OpenCL™ 的英特尔® FPGA SDK 可作为英特尔® Quartus® Prime 软件的一部分安装,也可作为单独的软件包安装。您可以从下面的链接中下载面向 OpenCL 的英特尔 FPGA SDK。关于先决条件,请参见下面的“软件要求”部分。

您必须拥有开发系统的管理员权限,才能安装开发主机软件所需的必要软件包和驱动程序。

主机系统必须在以下受支持的 Windows* 和 Linux* 操作系统上运行,完整名单请访问操作系统支持页面。

使用以下开发环境针对面向 OpenCL™ 的英特尔® FPGA SDK 开发您的主机应用:

Windows 操作系统

  • 面向 OpenCL™ 的英特尔® FPGA SDK
  • 主板支持包(BSP) 
  • Microsoft* Visual Studio* 专业版 2010 或更高版本。

Linux 操作系统

  • 面向 OpenCL™ 的英特尔® FPGA SDK
  • BSP 
  • RPM (RPM 软件包管理器;最初为 Red Hat 软件包管理器)
  • GCC 中包含的 C 编译器
  • Perl 命令版本 5 或更高版本

面向 OpenCL™ 的英特尔® FPGA SDK 为用户提供两种开发体验模式。针对代码构建者,将所有工具集成至 GUI,支持他们设计、编译和调试内核。另一方面,为传统用户提供了命令行选项。

  1. GUI/代码构建工具: 目前不可用
  2. 命令行选项: 

以下是一些对内核开发人员有用的命令:

aoc kernel.cl -o bin/kernel.aocx –board=<board_name>

- Compiles kernel.cl source file into a FPGA programming file (kernel.aocx) for board specified by <board_name>; -o is used to specify the output file name and location

 

aoc kernel.cl -o bin/kernel.aocx –board=<board_name> -march=emulator  

- Builds an aocx file for emulation which can be used to test the functionality of the kernel

 

aoc -list-boards

- Prints a list of available boards and exits

 

aoc -help

- Prints complete list of aoc command options and help information for each of these options

 

aocl version

- Shows version information for the installed version of Intel FPGA SDK for OpenCL

 

aocl install

- Installs drivers for your board into the current host system

 

aocl diagnose

-  Runs board vendor's test program for the board 

 

aocl program

- Configures a new FPGA image onto the board

 

aocl flash

- Initializes the FPGA with a specified startup configuration

 

aocl help

- Prints complete list of aocl command options and help information for each of these options

Khronos 兼容性

面向 OpenCL™ 的英特尔® FPGA SDK 基于已发布的 Khronos 规范,并受到众多 Khronos group 会员厂商的支持。面向 OpenCL 的英特尔 FPGA SDK 已通过 Khronos 一致性测试流程。它符合 OpenCL 1.0 标准,提供了 Khronos Group 的 OpenCL 1.0 和 OpenCL 2.0 接头。

注意:这款 SDK 目前不支持全部的 OpenCL 2.0 应用编程接口(API)。如果您使用 OpenCL 2.0 接头调用未受支持的 API,该调用将返回一个错误代码,以显示不完全支持 API。

面向 OpenCL 的英特尔 FPGA SDK 的主机运行时与 OpenCL 平台层和 API 一致,说明和例外详见《面向 OpenCL 的英特尔 FPGA SDK 编程指南》的 OpenCL 特性的支持状态章节。

其他相关链接:

OpenCL 扩展

通道(I/O 或内核)

面向 OpenCL™ 的英特尔® FPGA SDK 通道扩展可以以高效、低延迟的方式将数据地传输至内核,并实现内核同步。有关如何实施、使用和模拟通道的更多信息,请访问以下链接:

注:如果您想使用通道功能,但是能够使用其他 SDK 运行内核程序,可实施 OpenCL 管道。有关管道的更多信息,请参阅以下管道章节。

管道

面向 OpenCL 的英特尔 FPGA SDK 提供面向 OpenCL 管道功能的初步支持,这是 OpenCL 规范版本 2.0 的一部分。它们提供了一种将数据传输至内核以及实现高效、低延迟的内核同步的机制。

面向 OpenCL 的英特尔 FPGA SDK 管道实施不完全符合 OpenCL 规范版本 2.0。SDK 管道实施的目标是提供一种可以在不同的 OpenCL 2.0 兼容设备上无缝运行的解决方案。为了支持面向英特尔 FPGA 产品的管道,您的设计必须满足特定的要求。

有关实施 OpenCL 管道的更多信息,请访问以下链接:

多步骤设计流程中,您可以在一台 x86-64 Windows* 或 Linux* 主机上的一个或多个模拟设备上执行 OpenCL™ 内核,从而评估其功能。面向模拟的设计编译在数秒内生成一个 .aocx 文件,并支持您更高效地迭代设计,无需花费数小时进行完整的编译。

模拟器针对 Linux 系统提供了符号调试支持。符号调试支持您定位内核代码中函数错误的来源。

以下链接概述了面向 OpenCL 内核的设计流程,并说明了模拟内核的不同阶段。

面向 OpenCL 的英特尔® FPGA SDK 的多阶段设计流程

《编程指南》的模拟和调试您的 OpenCL 内核 章节详细地介绍了硬件内核操作和模拟的差异。

其他相关链接:

借助面向 OpenCL™ 的英特尔® FPGA SDK 离线编译器技术,无需要更改内核,便可以最大限度地将内核融入固定的硬件架构。离线编译器自动定制硬件架构,以满足您的内核要求。

总体而言,您应该首先优化一个针对单个计算单元的内核。优化该计算单元后,通过扩展硬件来填充剩余的 FPGA,以提升性能。内核的硬件占用空间与硬件编译的时间相关。因此,您在较小的占用空间(即单个计算单元)内执行的优化越多,在指定时间内执行的硬件编译就越多。

面向英特尔 FPGA 的 OpenCL 优化

为了优化设计实施,获得最高性能,您需要了解您的理论最高性能,并找出您的限制。执行以下步骤:

  1. 从一个已知良好的简单功能实施开始。
  2. 使用模拟器验证功能。
  3. 消除或最大限度地减少优化报告中的管道停顿。
  4. 计划内存访问,以获得最佳内存带宽。
  5. 使用分析器调试性能问题。

分析器能帮助您深入了解系统性能,指导您进一步优化内存使用的算法。
请记住,对于 FPGA,可分配的资源越多,获得的展开、并行化和性能就越高。

面向优化的实用报告和资源

为用户提供了许多系统生成的报告。这些报告揭示了代码和资源使用情况,给出了进一步改进性能的重点。

内存优化

了解内存系统对于 OpenCL 高效实施应用至关重要。

全局内存互联

不同于 GPU,FPGA 可以创建最适合应用的任意自定义加载存储单元(LSU)。因此,如果您能够编写 OpenCL 代码,为您的应用选择理想的 LSU 类型,设计性能可能会显著提升。

更多信息请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的全局内存互联章节。

本地内存

本地内存是一个复杂的系统。不同于典型的 GPU 架构(包含不同等级的高速缓存),FPGA 在 FPGA 的专用内存块中实施本地内存。更多信息请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的本地内存章节。

可以通过许多方法对使用的内存进行优化,以提升总体性能。有关关键技术的更多信息,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的分配对齐内存章节。

如欲进一步了解提升内存访问效率的策略,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的提升内存访问效率的策略章节。

管道

了解管道对于实现实施的最佳性能而言至关重要。高效使用管道可以直接提升性能吞吐率。更多详情请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的管道章节。

有关数据传输的更多信息,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的通过面向 OpenCL 的英特尔 FPGA SDK 通道或 OpenCL 管道传输数据章节。

停顿、占用、带宽

分析您的内核,以确定性能瓶颈。如欲进一步了解分析信息如何帮助您确定引起内核性能下降的较差内存或通道行为,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的分析您的内核以确定性能瓶颈章节。

循环优化

循环优化技术包括:

有关针对单个工作项目内核消除各种场景中循环依赖的技巧,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的消除循环依赖章节。

有关优化浮点运算的更多信息,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的优化浮点运算章节。

区域优化

如果您的 OpenCL 内核能在不同大小的 FPGA 上执行,那么,区域优化是一个重要的设计注意事项。当您设计 OpenCL 应用时,英特尔建议您使用特定的设计策略优化硬件领域的使用。

优化内核性能一般需要额外的 FPGA 资源。相反,区域优化通常会导致性能下降。在内核优化过程中,英特尔建议您在 FPGA 主板上运行多个内核版本,以确定生成最佳大小和性能比率的内核编程策略。

有关优化 FPGA 区域使用策略的更多信息,请参阅《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的优化 FPGA 区域使用策略章节。

参考设计示例

以下设计示例展示了优化技术:

本示例展示了使用循环分块对基本矩阵乘法运算进行的优化,旨在充分利用计算中固有的数据复用。

该示例描述了:

    -单精度浮点优化

    -本地内存缓冲

    -编译优化(循环展开、num_simd_work_items 属性)

    -浮点优化

    -多设备执行

该设计示例实施 HPEC Challenge 性能指标评测套件中的时间域有限脉冲响应(FIR)过滤器性能指标评测。更多信息详见时间域有限脉冲响应过滤器存储体页面。

该设计很好地说明了相比 GPU 架构,FPGA 能显著提升浮点 FIR 过滤器的性能。

该示例描述了:

                -单精度浮点优化

                -有效的 ID 滑动窗口缓冲区实施        

                -单个工作项目的内核优化方法

该设计示例实施了一款视频缩小器,以每秒 110 帧的速度接收 1080p 输入视频,并输出 720p 视频。该示例使用多个内核,以高效读写全局内存。

该示例描述了

                -内核通道

                -多个并发内核

                -内核与内核之间的通道

                -滑动窗口设计模式

                -内存访问模式的优化

该设计示例是 Lucas Kanade 光流算法的一个 OpenCL 实施。显示了一个高密度、非迭代、非椎体的版本(窗口大小为 52x52)在 Cyclone® V SoC 开发套件上以超过每秒 80 帧的速度运行。

该示例描述了:

                -单个工作项目内核

                -滑动窗口设计模式

                -减少资源使用的技术

                -视频输出

培训

针对 OpenCL 优化的在线培训和设计示例可通过以下方式获得:

参考资料

多步骤设计流程中,如果从模拟中评估的内核性能在可接受的范围内,您可以选择收集关于设计在 FPGA上执行时的性能信息。

您可以向面向 OpenCL™ 的英特尔® FPGA SDK 离线编译器发出指令,以借助 --profile 选项配置 .aocx 文件中的性能计数器(使用 Verilog 代码编写)。在执行过程中,面向 OpenCL 的英特尔 FPGA SDK 分析器测量并报告 OpenCL 内核在 FPGA 上执行时收集的性能数据。接下来,您可以在分析器 GUI 中查看性能数据。

《面向 OpenCL 的英特尔 FPGA SDK 编程指南》的分析您的 OpenCL 内核章节提供了有关如何分析内核的更多信息。

如何分析分析数据

分析信息可以帮助您确定引起内核性能下降的较差内存或通道行为。《面向 OpenCL 的英特尔 FPGA SDK 最佳实践指南》的分析您的内核以确定性能瓶颈章节深入地介绍了动态分析器 GUI 和如何解释分析数据,如停顿、带宽、高速缓存命中等。它还包含分析器对几种 OpenCL 设计示例场景的分析。

面向 OpenCL™ 的英特尔® FPGA SDK 提供一款编译器和多种工具,用于创建并运行针对英特尔 FPGA 产品的 OpenCL 应用。

如果您只需要面向 OpenCL 的英特尔 FPGA SDK 的内核部署功能,下载并安装面向 OpenCL 的英特尔 FPGA 运行时环境(RTE)。

RTE 是面向 OpenCL 的英特尔 FPGA SDK 的组成部分。SDK 提供了一个支持部署与开发 OpenCL 内核程序的环境,而 RTE 提供了工具和运行时组件,以帮助您创建并执行主机程序,以及在目标加速器开发板上执行预编译 OpenCL 内核程序。

请勿在相同的主机系统上安装 SDK 和 RTE。SDK 已经包含了 RTE。

实用程序和主机运行时库

面向 OpenCL 的 RTE 提供了实用程序、主机运行时库、驱动程序以及 RTE 特定库和文件。

  • RTE 实用程序包括一系列命令,你可以调用命令以执行高级。RTE 实用程序是面向 OpenCL 的英特尔 FPGA SDK 实用程序的组成部分。
  • 主机运行时为您的 OpenCL 主机应用提供了 OpenCL 主机平台 API 和运行时 API。

主机运行时包括以下库:

  • 静态链接库提供 OpenCL 主机 API、硬件抽象和助手库。
  • 动态链接库(DLL)提供硬件抽象和助手库。

有关实用程序和主机运行时库的更多信息,请参阅《面向 OpenCL 的英特尔 FPGA RTE 入门指南》的面向 OpenCL 的英特尔 FPGA RTE 内容章节。

主机通道支持主机的流数据直接通过 PCIe* 接口传输至 FPGA 内核,同时绕过内存控制器,从而显著降低您的系统延迟。FPGA 内核可以即时处理数据,而不必等待全部数据传输完毕。主机通道可在 OpenCL 运行时应用编程接口 (API) 中获得支持,包括模拟支持。


有关主机通道和模拟支持的更多详情,请参阅《面向 OpenCL™ 的英特尔® FPGA SDK 编程指南》的模拟 I/O 通道章节。

分析支持您了解程序在哪里耗费了时间,以及调用了哪些不同的函数。这一信息向您展示了程序哪个部分的运行速度低于预期,可能需要重新编写程序,以提高其执行速度。它还可以显示哪些函数的调用频率低于或高于您的预期。

gprof

Gprof 是 Linux* 操作系统提供的一款开源工具,用于分析源代码。它会执行基于时间的取样。在间隔时询问程序计数器,以决定执行到达了代码的哪一个点。

使用编译器分析标记 -pg 重新编译源代码后,才能使用 gprof

运行可执行文件,以生成包含分析信息的文件:

生成一个名为“gmon.out”的特定文件,该文件包含 gprof 工具用于生成人类可读分析数据所需的一切信息。因此,通过以下方式使用 gprof 工具:

$ gprof source code gmon.out > profile_data.txt

Profile_data.txt 文件包含了 gprof 工具用于生成人类可读分析数据所需的信息。包含两个部分:平坦曲线调用图

平坦曲线显示了程序在每个函数上耗费的时间,以及函数被调用的次数。

调用图显示哪些函数调用了某个函数、哪些其他函数被它调用以及调用次数。还预估了每个函数的子程序所耗费的时间。

GNU 网站提供了关于如何使用 gprof 进行分析的更多信息。

英特尔® Vtune™ Amplifier

用于分析的英特尔® Vtune™ Amplifier 帮助您在 Linux 嵌入式平台、Android* 或 Windows* 系统上加速并优化代码执行,并提供以下类型的分析:

  • 性能分析:发现串行与并行代码瓶颈,分析算法选择和 GPU 引擎的使用,并了解应用受益于可用硬件资源的位置和方式。
  • 英特尔 Energy Profiler 分析:分析断电事件并确定浪费能源的行为

有关英特尔 Vtune Amplifier 的更多信息,请访问面向 Linux 操作系统的英特尔 VTune Amplifier 2018 入门网站。

OpenCL™ 主机管道式多线程提供了一个有助于提高算法吞吐率的框架。此类算法需要处理大量输入数据,每个数据都需要按照顺序来处理。异构平台承载了该框架的一个最佳应用,使用高吞吐率硬件或平台加速最耗时的应用部分。算法的剩余部分必须在其他平台(如 CPU)上按顺序运行,以面向加速任务准备输入数据,或使用该任务的输出准备最终输出。在该场景中,尽管加快了算法的部分性能,但是由于初始算法的顺序性,总体系统吞吐率大幅降低。

AN 831:面向 OpenCL 的英特尔 FPGA SDK 主机管道式多线程应用注释提出了面向高吞吐率设计的全新管道式框架。该框架最适合通过算法处理大量输入数据,数据相关性要求连续执行算法的所有阶段或任务。 

FPGA OpenCL 有一种特定方法,可供 CPU 将任务卸载到 FPGA。下面附带的文件包含主机代码启动 FPGA 内核所需的常见初始化步骤。在此处 下载包含初始化步骤的文件。

Init() 函数可以从 main() 函数进行调用,以初始化 FPGA。代码首先找到内核运行的设备,然后使用与主机可执行文件相同目录中提供的 aocx 对其进行编程。完成代码的初始化步骤后,用户必须根据其设计需求设置内核参数。

另外还有一个可在执行内核后释放资源的 cleanup() 函数。

面向 OpenCL™ 的英特尔® FPGA SDK 模拟器可用于检查内核的功能。用户也可以将 OpenCL 内核功能调试为 Linux* 系统上主机应用的一部分。面向 OpenCL 的英特尔 FPGA SDK 模拟器的调试特性为此提供了支持。

如欲了解更多信息,请参阅《面向 OpenCL 的英特尔 FPGA SDK 编程指南》的以下章节:

有关分析的更多信息,请参阅《面向 OpenCL™ 的英特尔® FPGA SDK 编程指南》的以下章节:

运行主机应用时,可以设置特定的环境变量,以得到更多的调试信息。面向 OpenCL™ 的英特尔® FPGA SDK 的特定环境变量可帮助诊断自定义平台设计存在的问题。下表列出并详细描述了所有环境变量。

环境变量 描述
ACL_HAL_DEBUG 将该变量的值设置为 1 到 5 ,以增加硬件抽象层(HAL)的调试输出,该层直接与 MMD 层交互
ACL_PCIE_DEBUG 将该变量的值设置为 1 到 10,000,以增加 MMD 的调试输出。该变量设置可帮助确认版本 ID 注册已得到正确读取,UniPHY IP 核已被校准。
ACL_PCIE_JTAG_CABLE 设置该变量,以撤销用于指定线缆数量的默认 quartus_pgm 参数。默认为线缆 1。如果存在多个英特尔® FPGA D下载线缆,您可以设置该变量,以指定线缆。
ACL_PCIE_JTAG_DEVICE_INDEX 设置该变量,以撤销用于指定 FPGA 设备索引的默认 quartus_pgm 参数。默认情况下,该变量的值为 1。如果 FPGA 不是 JTAG 链中的第一台设备,您可以自定义该值。
ACL_PCIE_USE_JTAG_PROGRAMMING 设置该变量,以迫使 MMD 使用 JTAG 线缆对 FPGA 进行重编,而不是部分重配置。
ACL_PCIE_DMA_USE_MSI 如果您想使用 MSI 在 Windows* 操作系统上传输直接内存访问(DMA),可以设置该变量。
CL_CONTEXT_COMPILER_MODE_INTELFPGA 取消设置该变量,或将它的值设置为 3。OpenCL™ 主机运行时根据需要重编 FPGA 程序,初始化过程中将至少重编一次。为了避免主机应用进行 FPGA 编程,将该变量的值设置为 3。

面向 OpenCL™ 的英特尔® FPGA SDK 的诊断工具可帮助诊断和解决在使用面向 OpenCL™ 的英特尔® FPGA SDK 时出现的各种安装/设置问题、硬件和软件问题。该工具执行安装测试、设备测试和链接测试。如欲了解关于该工具的更多信息,请参见此演示文稿。若要使用该工具,请从此处下载。

由于主机程序中存在循环,用户可能会在运行 OpenCL™ 系统时遇到减速问题。如欲了解有关此类场景的更多详细信息,请参见面向 OpenCL™ 的英特尔® FPGA SDK 编程指南的调试逐渐减速的 OpenCL 系统部分

面向 OpenCL™ 的英特尔® Code Builder 是一款软件开发工具,作为面向 OpenCL™ 的英特尔® FPGA SDK 一部分提供。它提供了一组 Microsoft* Visual Studio 和 Eclipse 插件,支持创建、构建、调试和分析通过 OpenCL 加速的 Windows* 和 Linux* 应用。如欲了解更多信息,请参见面向 OpenCL™ 的英特尔® FPGA SDK 编程指南的使用面向 OpenCL 的英特尔® Code Builder 开发/调试 OpenCL 应用部分。

英特尔® Arria® 10 设备

英特尔® Stratix® 10 设备

Altera® 论坛中提供了额外的链接,以解决与设计和运行阶段相关的特定问题:   

OpenCL™ 提供了大量的设计示例,可以用来描述的不同应用。如果主机装配了 FPGA 主板并且主板支持面向 OpenCL 的英特尔® FPGA SDK,用户便可以在主机上编译与执行这些设计。

如欲获取更多 OpenCL 设计示例,请访问 OpenCL 开发人员专区网站

标题 描述
如何使用 Windows* 在 Cyclone® V SoC 上运行 OpenCL™ Hello World 和(其他程序)第一部分 本视频描述了一个使用 Windows* 设备在 Cyclone® V SoC 上运行两个应用(OpenCL™ HelloWorld 和 OpenCL 快速傅立叶变换(FFT))的现成程序。
如何使用 Windows 在 Cyclone V SoC 上运行 OpenCL Hello World 和(其他程序)第二部分 本视频描述了一个使用 Windows 设备在 Cyclone V SoC 上运行两个应用(OpenCL HelloWorld 和 OpenCL FFT)的现成程序。
如何使用 Windows 在 Cyclone V SoC 上运行 OpenCL Hello World 和(其他程序)第三部分 本视频描述了一个使用 Windows 设备在 Cyclone V SoC 上运行两个应用(OpenCL HelloWorld 和 OpenCL FFT)的现成程序。
如何使用 Windows 在 Cyclone V SoC 上运行 OpenCL Hello World 和(其他程序)第四部分 本视频描述了一个使用 Windows 设备在 Cyclone V SoC 上运行两个应用(OpenCL HelloWorld 和 OpenCL FFT)的现成程序。
如何使用 Windows 在 Cyclone V SoC 上运行 OpenCL Hello World 和(其他程序)第五部分 本视频描述了一个使用 Windows 设备在 Cyclone V SoC 上运行两个应用(OpenCL HelloWorld 和 OpenCL FFT)的现成程序。
如何将自定义 Verilog 模块/设计打包为 OpenCL 库 本视频讨论了客户为什么有可能使用该特性将自定义处理模块(RTL)置于 OpenCL 内核代码。本视频解释了 makefile、config 文件等设计示例和编译流程。本视频还展示了设计示例的一个演示。
Altera® SoC FPGA(Linux* 主机)上的 OpenCL -第一部分-工具下载和设置 本视频向您展示了如何下载、安装和配置必要工具,以开发针对 Altera® SoC FPGA 的 OpenCL 内核和主机代码。
Altera® SoC FPGA(Linux* 主机)上的 OpenCL -第二部分-使用模拟器运行向量添加示例 本视频向您展示了如何下载与编译针对模拟器(内置于 OpenCL)的示例 OpenCL 应用。
Altera® SoC FPGA(Linux* 主机)上的 OpenCL -第三部分–面向 SoC FPGA 的内核和主机代码编译 本视频向您展示了如何针对 FPGA 和 Cyclone V SoC FPGA 的处理器编译内核和主机代码。
Altera® SoC FPGA(Linux* 主机)上的 OpenCL -第四部分–运行时环境的设置 本视频向您展示了如何设置 Cyclone V SoC 主板,以运行 OpenCL 示例并在主板上执行主机代码和内核。

其他技术