【问题标题】:Get OpenCL Kernel-argument information获取 OpenCL 内核参数信息
【发布时间】: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 个字节。它不会将参数的大小返回给内核函数。

标签: c++ c opencl


【解决方案1】:

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

内核参数信息只有在程序对象的情况下才可用 与内核相关联的创建与clCreateProgramWithSource 和 程序可执行文件是使用-cl-kernel-arg-info 选项构建的 在 clBuildProgram 或 clCompileProgram 的 options 参数中指定。

也就是说,某些实现(例如 Intel HD)将在没有选项的情况下生成信息,甚至会将其保留在二进制文件中,以便clCreateProgramWithBinary 程序也可以获取它。唉,NVidia 的驱动程序似乎没有这样做 [[ 更新:2021 年末,我注意到 NVidia 的“二进制”(实际上是 PTX 文本)中也有一些输出;参考文献.meta 部分]]: .您能否解析 PTX 甚至是临时性的以额外提供您需要的信息?

【讨论】:

  • 我最终绕过它,根据其他参数数据猜测正确的大小,然后基本上模拟 try-catch 类型的交易,开始将其设置为 8 个字节,如果吐出来一个错误下降到 4 等。非常讨厌,但它有效。我会接受这个答案,因为它基本上也证实了我所遇到的。简而言之:不可能和正确的行为(在大多数实现中)。
【解决方案2】:

如果你不告诉我们你到底在 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+ 文档,但我没有注意到它的回归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2014-05-26
    相关资源
    最近更新 更多