获取OpenCL内核参数信息

问题描述 投票:1回答:2

我有一个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字符串?

c++ c opencl
2个回答
0
投票

根据clGetKernelArgInfo,参数信息仅在程序使用clCreateProgramWithSource构建并使用-cl-kernel-arg-info选项构建时才可用。

只有与clCreateProgramWithSource创建与内核关联的程序对象并且使用clBuildProgram或clCompileProgram的options参数中指定的-cl-kernel-arg-info选项构建程序可执行文件时,内核参数信息才可用。

也就是说,一些实现(例如英特尔HD)将生成没有选项的信息,甚至将其保留在二进制文件中,以便clCreateProgramWithBinary程序也可以获取它。唉,NVidia的驱动程序似乎没有这样做。您是否可以临时解析PTX以获得所需的额外信息?


0
投票

没有你告诉我们你究竟是什么投入了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+文档,但我没有注意到它的回归。

© www.soinside.com 2019 - 2024. All rights reserved.