内核句柄和计算单元 - 2023.2 简体中文

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

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

针对给定内核对象首次调用 clSetKernelArg 时,XRT 会识别一组对称 CU 以供在后续执行此内核时使用。为此内核调用 clEnqueueTask 时,该组中的任意对称 CU 均可用于处理此任务。

如果给定内核的所有 CU 均为对称 CU,那么单个内核对象即足以访问任意 CU。但如果存在非对称 CU,则主机应用需为每一组非对称 CU 创建唯一的内核对象。在此情况下,调用 clEnqueueTask 时必须指定要用于该任务的内核对象,并且该内核的任意匹配 CU 均可供 XRT 使用。

为特定计算单元创建内核对象

为创建与特定计算单元关联的内核,clCreateKernel 命令支持在主机程序创建内核对象时指定 CU。该命令的语法如下所示:

// Create kernel object only for a specific compute unit 
cl_kernel kernelA = clCreateKernel(program,"<kernel_name>:{compute_unit_name}",&err);
// Create a kernel object for two specific compute units 
cl_kernel kernelB = clCreateKernel(program, "<kernel_name>:{CU1,CU2}", &err);
重要:创建内核的多个实例 中所述,CU 数量是由配置文件中的 connectivity.nk 选项指定的,此配置文件供 v++ 命令在链接期间使用。因此,无论主机程序中指定任何对象,要创建内核对象或对其进行排队,所使用的选项必须与链接期间使用的配置文件所指定的选项相匹配。

在此情况下,Xilinx Runtime 会在创建内核时识别特定 CU 或 CU 组的内核句柄(kernelAkernelB)。这样您即可在主机程序中使用 clEnqueueTask 时,控制所使用的内核配置或特定 CU 实例。这对于非对称 CU 或者执行 CU 的负载和优先级管理都很有用。