内核执行 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

通常主机应用所需的计算密集型任务可在单个内核内进行定义,并且此内核仅执行一次以处理整个范围内的所有数据。由于内核多次执行存在相关联的开销,因此调用单一整体式内核可以提升性能。虽然内核仅执行一次,并处理整个范围内的所有数据,但并行化是在内核硬件内部的 FPGA 上实现的。只要经过正确编码,内核即可通过多种方法来实现并行化,例如,指令级并行化(循环流水线)和功能级并行化(数据流)。如需了解有关这些不同内核编码方法的信息,请参阅 使用 C++ 开发 PL 内核

在将内核编译到 FPGA 上的单一硬件实例(或 CU)中时,执行内核的最简单的方法是使用 clEnqueueTask,如下所示。

err = clEnqueueTask(commands, kernel, 0, NULL, NULL);

XRT 会调度工作负载或者从内核实参流经 OpenCL 缓冲器的数据,并调度内核任务,以在 AMD FPGA 上运行加速器。

重要: 虽然支持使用 clEnqueueNDRangeKernel(仅限 OpenCL 内核),但 AMD 建议使用 clEnqueueTask

但有时由于各种原因,无法使用单一 clEnqueueTask 来运行内核。例如,内核代码可能过大且过于复杂,导致在单次执行过程中执行所有计算密集型任务时,难以对代码进行最优化。有时,可将多个内核设计为在 FPGA 上并行执行不同任务,这需要执行多条排队命令。或者主机应用可能在很长一段时间内持续接受数据,且无法一次性同时处理所有数据。因此,根据情况以及应用,您可能需要将内核的数据和任务拆分为多条 clEnqueueTask 命令。在此情况下,可通过无序命令队列或有序命令队列来判定内核任务的处理方式,如 命令队列 中所述。此外,可将多个内核任务作为阻塞事件或者非阻塞事件来实现,如 事件同步 中所述。这些都可能影响设计性能。

以下主题探讨的各种方法可供您用于在加速器上运行内核、运行多个内核或者运行相同内核的多个实例。