针对给定内核对象首次调用 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 组的内核句柄(kernelA
和 kernelB
)。这样您即可在主机程序中使用 clEnqueueTask
时,控制所使用的内核配置或特定 CU 实例。这对于非对称 CU 或者执行 CU 的负载和优先级管理都很有用。