我有一个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字符串?
根据clGetKernelArgInfo,参数信息仅在程序使用clCreateProgramWithSource
构建并使用-cl-kernel-arg-info
选项构建时才可用。
只有与
clCreateProgramWithSource
创建与内核关联的程序对象并且使用clBuildProgram或clCompileProgram的options参数中指定的-cl-kernel-arg-info
选项构建程序可执行文件时,内核参数信息才可用。
也就是说,一些实现(例如英特尔HD)将生成没有选项的信息,甚至将其保留在二进制文件中,以便clCreateProgramWithBinary
程序也可以获取它。唉,NVidia的驱动程序似乎没有这样做。您是否可以临时解析PTX以获得所需的额外信息?
没有你告诉我们你究竟是什么投入了args,很难弄清楚究竟发生了什么。我的代表不允许我对你的帖子发表评论...所以如果我想提供帮助,我会被迫发帖回答。
让我们回顾一下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+文档,但我没有注意到它的回归。