设置内核参数 - 2022.1 简体中文

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

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

Vitis 软件平台中,可为内核对象设置两种类型的实参:

  1. 标量实参用于小型数据传输,例如,常量或配置类型数据。从主机应用角度来看,这些实参为只读实参,即内核的输入。
  2. 存储缓冲器实参则用于大型数据传输。值是所创建的存储器对象的指针,其上下文与程序和内核对象相关联。这些实参是内核的输入或输出。

内核实参可使用 clSetKernelArg 命令来设置,以下示例演示了如何为 2 个标量实参和 2 个缓冲器实参设置内核实参。

// Create memory buffers
cl_mem dev_buf1 = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, size, &host_mem_ptr1, NULL);
cl_mem dev_buf2 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, size, &host_mem_ptr2, NULL);

int err = 0;
// Setup scalar arguments
cl_uint scalar_arg_image_width = 3840;
err |= clSetKernelArg(kernel, 0, sizeof(cl_uint), &scalar_arg_image_width); 
cl_uint scalar_arg_image_height = 2160; 
err |= clSetKernelArg(kernel, 1, sizeof(cl_uint), &scalar_arg_image_height); 
    
// Setup buffer arguments
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &dev_buf1);
err |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &dev_buf2);
重要: 虽然 OpenCL 允许在内核入队前随时设置内核实参,但您应尽早设置内核实参。如果在 XRT 确定器件上缓冲器的放置位置之前,您尝试移植该缓冲器,那么 XRT 将出错。因此,请在任意缓冲器上执行任意入队操作(例如,clEnqueueMigrateMemObjects)之前设置内核实参。

对于所有内核缓冲器实参,您必须在器件全局存储器上分配缓冲器。但有时,开始内核执行之前无需缓冲器内容。例如,仅在内核执行期间填充输出缓冲器内容,因此内核执行前,这些内容无关紧要。在此情况下,您应指定 clEnqueueMigrateMemObject(含 CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED 标志),这样缓冲器移植就不涉及主机与器件之间的 DMA 操作,从而即可改善性能。