获取OpenCL内核参数信息

时间:2017-03-17 10:07:12

标签: c++ c opencl

我有一个OpenCL内核,它在运行时从带有clCreateProgramWithBinary的PTX内核字符串构建,然后构建。现在稍后,我试图设置内核参数。我在void *数组中检索这些参数,所以我不知道每个条目的大小/类型。但是,该信息存储在PTX内核字符串中,即。用:

.visible .entry my_kernel(
    .param .u64 param_1,
    .param .u32 param_2,
    .param .f64 param_3
)

我可以用

正确查询参数的数量
clGetKernelInfo(kernel, CL_KERNEL_NUM_ARGS, sizeof(cl_uint), &num_args, NULL);

但是,我还需要知道每个参数的大小,以便正确地将其传递给clSetKernelArg调用。根据我的理解,我可以通过查询来获得每个参数的大小:

char name_buff[100];
clGetKernelArgInfo(kernel, current_index, CL_KERNEL_ARG_TYPE_NAME, 100 * sizeof(char), &name_buff, NULL);

但该调用失败,错误代码为CL_KERNEL_ARG_INFO_NOT_AVAILABLE。 直觉上,这对我来说没有意义,因为这些信息显然存储在内核中,即使我还没有专门设置这些参数。

这是正确的行为,有没有办法获取该信息,而不是解析PTX字符串?

2 个答案:

答案 0 :(得分:0)

如果没有告诉我们你究竟在准备什么,那么很难弄清楚究竟发生了什么。我的代表不允许我对你的帖子发表评论...所以如果我想提供帮助,我会被迫发帖回答。

让我们审核https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/clGetKernelArgInfo.html

很明显,这个错误代码与索引超出范围或其他问题无关。因此,不能找到内核参数信息。你试过每个指数0-> 2?尝试clSetKernelArg(...),然后看看是否有帮助,如果你得到clSetKernelArg的错误,你会更接近为什么这不起作用,否则尝试做你先用clSetKernelArg做的事情。

https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clSetKernelArg.html

无法找到此功能的2.0+文档,但我没有注意到它的回归。

答案 1 :(得分:0)

According to clGetKernelArgInfo the argument info is only available if the program is built with clCreateProgramWithSource and built with the option -cl-kernel-arg-info.

Kernel argument information is only available if the program object associated with kernel is created with clCreateProgramWithSource and the program executable is built with the -cl-kernel-arg-info option specified in options argument to clBuildProgram or clCompileProgram.

That said, some implementations (e.g. Intel HD) will generate the info without the option and will even retain it in the binary so that clCreateProgramWithBinary programs can fetch it too. Alas it doesn't seem NVidia's driver does this. Can you parse the PTX even ad-hoc to extra the information you need?