如何查询 OpenCL 内核参数的大小?

How can I query the size of an OpenCL kernel argument?

我想查询 OpenCL 内核参数的大小,以便我可以确保向它发送正确大小的变量。我可以使用 clGetKernelArgInfo 查询每个内核参数的许多其他属性,如下所示:

clGetKernelArgInfo(k, argc, CL_KERNEL_ARG_TYPE_NAME, sizeof(argType), &argType, &retSize);

这会告诉我类型的字符串名称,例如。但这还不够好,尤其是在它是一个结构并且字符串名称在主机和设备上相同但包装不同,因此大小不同的复杂情况下。根据 https://man.opencl.org/clGetKernelArgInfo.html ,我可以查询的内容是:

CL_KERNEL_ARG_ADDRESS_QUALIFIER
CL_KERNEL_ARG_ACCESS_QUALIFIER 
CL_KERNEL_ARG_TYPE_NAME        
CL_KERNEL_ARG_TYPE_QUALIFIER   
CL_KERNEL_ARG_NAME          

有什么想法吗?

仅供参考,这不是 的重复,因为那是询问如何使用参数查询函数,而不是询问如何查询参数大小。

据我所知,在设置参数之前没有标准的检查方法,但如果大小不匹配,clSetKernelArg 调用将 return CL_​INVALID_​ARG_​SIZE ,这样您就可以相应地检测和处理错误:

CL_INVALID_ARG_SIZE if arg_size does not match the size of the data type for an argument that is not a memory object or if the argument is a memory object and arg_size != sizeof(cl_mem) or if arg_size is zero and the argument is declared with the __local qualifier or if the argument is a sampler and arg_size != sizeof(cl_sampler).