【发布时间】:2022-02-19 03:08:31
【问题描述】:
我有一个 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 字符串之外,还有其他方法可以获取该信息吗?
【问题讨论】:
-
明确一点,CL_KERNEL_ARG_TYPE_NAME返回类型的字符串名称,如“float4”。它不返回参数的大小。 clGetKernelArgInfo 的最后一个参数是指向 clGetKernelArgInfo 返回的大小的指针。在本例中为 7,因为字符串“float4”是 7 个字节。它不会将参数的大小返回给内核函数。