在 FPGA SDK 中为 OpenCL 定制平台创建异构内存系统
指示
在面向 OpenCL 定制平台的英特尔® FPGA SDK 中创建异构内存系统
定制平台中异构内存的实现允许更多的外部内存接口(EMIF)带宽以及更大更快的内存访问。 异构内存访问与优化的组合
OpenCL™(1)内核可以显着提高 OpenCL 系统的性能。
本应用笔记提供了有关在自定义平台中创建异构内存系统以与面向 OpenCL(2) 的英特尔® FPGA SDK 结合使用的指南。 英特尔假设您是一位经验丰富的 FPGA 设计师,正在开发包含异构内存系统的定制平台。
在创建异构内存系统之前,请先熟悉下面指定的适用于 OpenCL 的英特尔 FPGA SDK 文档。
相关信息
- 适用于 OpenCL 的英特尔 FPGA SDK 编程指南
- 适用于 OpenCL 的英特尔 FPGA SDK 最佳实践指南
- 适用于 OpenCL Arria 10 GX FPGA 开发套件的英特尔 FPGA SDK 参考平台移植指南
1.1. 验证 FPGA 板和 EMIF 接口的功能
独立验证每个内存接口,然后使用全局内存实例化您的自定义平台。
- 使用可以测试每个接口的速度和稳定性的硬件设计来验证每个内存接口。
- 使用全局内存实例化您的自定义平台。
- 例如amp例如,如果您有 XNUMX 个 DDR 接口,则其中之一必须映射为异构内存。 在这种情况下,请独立验证 OpenCL 堆栈与每个 DDR 接口的功能。
OpenCL 和 OpenCL 徽标是 Apple Inc. 的商标,经 Khronos Group™ 许可使用。 - 适用于 OpenCL 的英特尔 FPGA SDK 基于已发布的 Khronos 规范,并已通过 Khronos 一致性测试流程。 当前的一致性状态可以在以下位置找到: www.khronos.org/conformance。
- 例如amp例如,如果您有 XNUMX 个 DDR 接口,则其中之一必须映射为异构内存。 在这种情况下,请独立验证 OpenCL 堆栈与每个 DDR 接口的功能。
英特尔公司。 版权所有。 英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。 英特尔根据英特尔的标准保修保证其 FPGA 和半导体产品的性能符合当前规格,但保留随时更改任何产品和服务的权利,恕不另行通知。 英特尔不承担因应用或使用此处描述的任何信息、产品或服务而产生的任何责任或义务,除非英特尔明确书面同意。 建议英特尔客户在依赖任何已发布信息和下订单购买产品或服务之前获取最新版本的设备规格。 *其他名称和品牌可能被认为是他人的财产。
ISO 9001:2015注册
或者,如果您有两个 DDR 接口和一个四倍数据速率 (QDR) 接口,请独立验证两个 DDR 接口和 QDR 接口的 OpenCL 堆栈的功能。
英特尔建议您使用 PCI Express® – (PCIe® -) 或 EMIF 专用设计来测试您的内存接口。 验证每个内存接口功能正常并且您的 OpenCL 设计可与内存接口的子集配合使用后,继续
创建一个功能齐全的异构内存系统。
1.2. 修改board_spec.xml File
修改board_spec.xml file 指定 OpenCL 内核可用的异构内存系统的类型。
在内核编译期间,面向 OpenCL 离线编译器的英特尔 FPGA SDK 将根据您指定的缓冲区位置参数将内核参数分配给内存。
1. 浏览到 board_spec.xml file 在您的自定义平台的硬件目录中。
2.打开board_spec.xml file 在文本编辑器中并相应地修改 XML。
例如amp文件中,如果您的硬件系统有两个 DDR 内存作为默认全局内存以及两个建模为异构内存的 QDR 存储体,请修改 board_spec.xml 的内存部分 file 类似于以下内容:
1.3. 在 Qsys 中设置多个内存分配器
目前,Qsys 设计中的 OpenCL Memory Bank Divider 不支持非 2 次方数量的内存 Bank,这对典型配置没有限制。 然而,在某些情况下,需要非 2 的幂数的内存接口。 为了容纳非 2 的幂数的内存接口,请使用多个 OpenCL 内存组分配器来创建具有非 2 的幂数的内存组的异构内存系统。 当您拥有真正的异构内存系统时,您必须创建多个 OpenCL Memory Bank Divider。 考虑一个具有 XNUMX 个 DDR 内存接口和 XNUMX 个 QDR 内存接口的系统。 由于这两个存储体具有不同的内存拓扑,因此无法将它们组合在单个全局内存下。
图 1. 三组异构内存系统框图
该异构存储器系统包含两个DDR存储器接口和一个QDR存储器接口。如果您使用版本 16.0、16.0.1 或 16.0.2 的 Intel Quartus® Prime 软件和 Altera SDK for OpenCL,OpenCL Memory Bank Divider 会错误地处理跨地址边界的内存突发。 要解决此已知问题,请添加突发大小为 1 的管道桥,并将其 Avalon®Memory-Mapped (Avalon-MM) 主端口连接到 OpenCL Memory Bank Divider 的从端口。
笔记:
此已知问题已在英特尔 Quartus Prime 软件和适用于 OpenCL 的英特尔 FPGA SDK 版本 16.1 中得到修复。
图 2. 具有管道桥的三组异构内存系统框图 1.4. 修改异构内存解决方案的 Boardtest 程序和主机代码
使用面向 OpenCL 定制平台工具套件的英特尔 FPGA SDK 附带的 boardtest.cl 内核来测试定制平台的功能和性能。
boardtest 程序是一个 OpenCL 内核,允许您测试主机到设备带宽、内存带宽以及自定义平台的一般功能。
- 浏览至/board/custom_platform_toolkit/tests/boardtest 目录。
- 打开boardtest.cl file 在文本编辑器中,为每个全局内存参数分配一个缓冲区位置。
例如amp乐:
__内核无效
mem_stream (__global__attribute__((buffer_location(“DDR”))) uint *src, __global __attribute__((buffer_location(“QDR”))) uint *dst, uint arg, uint arg2)
这里,uint *src 分配给DDR 内存,uint *dst 分配给QDR 内存。 board_spec.xml file 指定两个存储系统的特性。 - 要在 OpenCL 系统中利用异构内存解决方案,请通过将 CL_MEM_HETEROGENEOUS_INTELFPGA 标志添加到 clCreateBuffer 调用来修改主机代码。
例如amp乐:
ddatain = clCreateBuffer(上下文, CL_MEM_READ_WRITE | memflags
CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(无符号) * vectorSize, NULL, &status);
英特尔强烈建议您在写入缓冲区之前将缓冲区位置设置为内核参数。 使用单个全局内存时,您可以在将缓冲区分配给内核参数之前或之后写入缓冲区。 在异构内存系统中,主机在写入缓冲区之前设置缓冲区位置。 换句话说,主机会在调用 clEnqueueWriteBuffer 函数之前调用 clSetKernelArgument 函数。
在主机代码中,按以下顺序调用 clCreateBuffer、clSetKernelArg 和 clEnqueueWriteBuffer:
ddatain = clCreateBuffer(上下文, CL_MEM_READ_WRITE | memflags |
CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(无符号) * vectorSize, NULL, &status);
… 状态 = clSetKernelArg(kernel[k], 0, sizeof(cl_mem), (void*)&ddatain);
… 状态 = clEnqueueWriteBuffer(队列, ddatain, CL_FALSE, 0, sizeof(无符号) * vectorSize,hdatain, 0, NULL, NULL);
ALTERAOCLSDKROOT/board/custom_platform_toolkit/tests/boardtest/host/memspeed.cpp file 呈现这些函数调用的类似顺序。 - 修改boardtest.cl后 file 和主机代码,编译主机和内核代码并验证它们的功能。
编译内核代码时,必须通过包含 –no-interleaving 来禁用所有内存系统的突发交错aoc 命令中的选项。
相关信息
禁用全局内存的突发交错(–no-interleaving )
1.5. 验证异构内存的功能 系统
为了确保异构内存系统正常运行,请在主机代码中取消设置 CL_CONTEXT_COMPILER_MODE_INTELFPGA 标志。
在具有同构内存的 OpenCL 系统中,您必须选择在主机代码中设置 CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 标志以禁用 .aocx 的读取 file 以及FPGA的重新编程。 在实例化您的电路板以验证自定义平台的功能而无需设计布局规划和指定 LogicLock™ 区域时,设置 CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 标志非常有用。
对于异构内存系统,运行时环境必须读取每个缓冲区的缓冲区位置,如 .aocx 中所述 file,验证存储系统的功能。 但是,您可能希望验证自定义平台的功能,而不实现电路板设计的最终功能,例如设计布局规划和指定 LogicLock 区域。
- 验证主机代码中是否未设置 CL_CONTEXT_COMPILER_MODE_INTELFPGA 标志。
- 浏览至看板/ 自定义平台的 /source/host/mmd 目录。
- 打开 acl_pcie_device.cpp 内存映射设备 (MMD) file 在文本编辑器中。
- 修改acl_pcie_device.cpp中的reprogram函数 file 添加一个 return 0; 线,如下图:
int ACL_PCIE_DEVICE::重新编程(void *data, size_t data_size)
{
返回0;
// 假设失败
int 重新编程失败 = 1;
// 假设 fpga.bin 中没有 rbf 或 hash
int rbf_or_hash_not_provided = 1;
// 假设基础和导入修订哈希值不匹配
int hash_mismatch = 1;
…
} - 重新编译acl_pcie_device.cpp file.
- 验证 CL_CONTEXT_COMPILER_MODE_INTELFPGA 标志是否保持未设置状态。
注意力: 添加后返回0; 到重新编程函数并重新编译MMD file,运行时环境会读取.aocx file 并分配缓冲区位置,但不会重新编程 FPGA。 您必须手动将 FPGA 映像与 .aocx 进行匹配 file。 要扭转此行为,请删除 return 0; 从重新编程功能并重新编译MMD file.
1.6. 文档修订历史
日期 | 版本 | 更改 |
17 月 XNUMX 日 | 2017.12.01 | • 将CL_MEM_HETEROGENEOUS_ALTERA 更名为CL_MEM_HETEROGENEOUS_INTELFPGA。 |
16 月 XNUMX 日 | 2016.12.13 | • 将CL_CONTEXT_COMPILER_MODE_ALTERA 更名为CL_CONTEXT_COMPILER_MODE_INTELFPGA。 |
在面向 OpenCL 的英特尔® FPGA SDK 中创建异构内存系统
自定义平台
发送反馈
在线版本
发送反馈
编号:683654
版本:2016.12.13
文件/资源
![]() |
英特尔在 FPGA SDK 中为 OpenCL 定制平台创建异构内存系统 [pdf] 指示 在适用于 OpenCL 自定义平台的 FPGA SDK 中创建异构内存系统,创建异构内存系统,适用于 OpenCL 自定义平台的 FPGA SDK |