查看其他版本
|
本教程演示了一个灵活的内核链接过程,以增加FPGA上的内核实例数量。每个指定的内核实例也称为计算单元(CU)。此过程改进了组合主机 - 内核系统中的并行性。
默认情况下,SDAccel™工具为每个内核创建一个硬件实例(也称为计算单元)。对于不同的数据集,主机程序可以多次使用相同的内核。在这些情况下,生成内核的多个计算单元以使这些计算单元同时运行并提高整个系统的性能非常有用。
有关更多信息,请参见 Multiple Instances of a Kernel in the SDAccel Environment Programmers Guide (UG1277).
本教程使用图像过滤器示例来演示多个计算单元功能。主机应用程序处理图像,提取Y,U和V平面,然后运行内核三次以过滤图像的每个平面。默认情况下,这三个内核使用相同的硬件资源按顺序运行,因为FPGA只包含内核的单个硬件实例。本教程演示了如何增加主机应用程序调用的计算单元数,以同时过滤Y,U和V平面。
在本教程中,您将:
1.创建新的应用程序项目并导入源文件。
2.运行硬件仿真并检查仿真报告以识别多个串行内核执行。
3.调整主机代码以启用无序命令执行。
4.更改内核链接过程以创建同一内核的多个实例。
5.重新运行硬件仿真,并确认计算单元的并行执行。
1.打开示例目录:cd using-multiple-cu/reference-files/。
2.调用SDx™环境GUI:sdx。
3.指定工作区,创建新的应用程序项目,然后将项目名称指定为filter2d。
4.选择xilinx_u200_xdma_201830_1作为平台。
5.在Templates中保留Empty Application,然后单击Finish。
SDx工具将在指定的工作区中创建和打开项目。
- 在"Project Explorer"窗口中,从
src / host目录导入主机源文件,然后选择所有文件。 - 在"Project Explorer"窗口中,从
src / kernel目录导入Filter2DKernel.xo内核对象文件。
注意: 内核代码已经是本教程中使用的编译目标文件(.xo)。实际上,
Filter2DKernel.xo文件可以从C / C ++或RTL生成。从编译的目标代码开始,它们基本相同。您仍然可以从.xo文件开始自定义链接过程。
- 在主项目窗口中,选择Filter2DKernel作为硬件功能。
- 指定主机代码链接器选项: 主机代码使用OpenCV™库进行映像文件操作,因此我们需要指定相关的链接器选项。
- 在"Project Explorer"窗口中,右击
filter2d项目的顶级文件夹,然后选择C/C ++ Build Settings。 - 在“Settings”对话框中,选择 SDX GCC Host Linker (x86_64) 工具设置。
- 在Settings对话框的顶部,将Configuration下拉列表设置为All Configuration,以便链接器选项适用于所有流程。
- 在“Expert Settings: Command”字段中,将以下文本追加到当前字符串的末尾:
-L${XILINX_SDX}/lnx64/tools/opencv -lopencv_core -lopencv_highgui -Wl,-rpath,${XILINX_SDX}/lnx64/tools/opencv
-
选择 Apply and Close按键。
-
设置运行时参数: 从顶部的“Run”菜单中,使用
-x ../binary_container_1.xclbin -i ../../../../img/test.bmp -n 1设置 Program arguments。
为Active build configuration选择Emulation-HW,然后单击Run键运行硬件仿真: ()
在进行仿真运行时,我们将查看主机代码。通过展开Project Explorer窗口中的src文件夹打开文件,然后双击host.cpp文件。
滚动到第266-268行,您可以在其中看到过滤器功能分别为Y,U和V通道调用三次:

这个函数在第80行描述。在这里,您可以看到设置了内核参数,并且内核由clEnqueueTask命令执行:

所有三个clEnqueueTask命令都使用单个有序命令队列(75行)排队。因此,使用此命令队列的所有命令将按照它们添加到队列的顺序依次执行。
硬件仿真运行完成后,在“Assistant”窗口(左下角)内单击。选择Emulation-HW -> filter2d-Default。从这里,您可以看到几个重要的报告,例如Profile Summary和Application Timeline。
- 双击Reports窗口中的项目,打开Profile Summary报告。
- 此报告提供与应用程序运行方式相关的数据。
- 请注意,在Top Kernel Execution下,内核执行三次。
- 从Emulation-HW运行打开应用程序时间线报告。
更改75行中的主机代码,将命令队列声明为_out-of-order_命令队列。
改变之前:
mQueue = clCreateCommandQueue(Context, Device, CL_QUEUE_PROFILING_ENABLE, &mErr);
改变之后:
mQueue = clCreateCommandQueue(Context, Device, CL_QUEUE_PROFILING_ENABLE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &mErr);
按CTRL + S保存文件。
**可选步骤:**您可以使用更改的主机代码运行硬件仿真。如果选择运行硬件仿真功能,请使用时间轴跟踪来观察使用无序队列使内核几乎在彼此同时执行。
但是,尽管主机同时调度了所有这些执行,但由于FPGA上的内核实例有限(FPGA仍然按顺序执行内核),一些执行请求会延迟。
在下一步中,我们将增加FPGA上的内核实例数,以允许同时执行三个主机内核。
我们可以使用多个有序队列来实现从主机代码执行相同的并发命令,而不是使用单个无序队列。有关更多信息,请参阅 this SDAccel Github Host code example ,其中显示了单个输出of-order命令队列和多个有序命令队列方法。
执行以下步骤将内核实例数增加到三个:
您已经学习了如何改变内核链接过程以在FPGA上同时执行相同的内核函数。
本教程通过硬件仿真演示了该机制。您可以将"Active Build Configuration"更改为System,然后单击Run按钮以在实际FPGA板上编译并执行此操作。运行完成后,您还可以确认系统运行时的时间线跟踪报告。
Copyright© 2019 Xilinx
