Opencl 如何获取内核信息
我想获得有关已编译OpenCL内核的以下信息——类型列表、参数顺序(如果可能的话——使用内存和访问分类器)。内核是在应用程序运行时从源代码构建的 事实上,在OpenCL1.2中已经存在用于此类查询的适当函数-Opencl 如何获取内核信息,opencl,Opencl,我想获得有关已编译OpenCL内核的以下信息——类型列表、参数顺序(如果可能的话——使用内存和访问分类器)。内核是在应用程序运行时从源代码构建的 事实上,在OpenCL1.2中已经存在用于此类查询的适当函数-clGetKernelArgInfo,但由于项目限制,我必须找到使用纯OpenCL1.0实现此类功能的方法,而无需任何扩展 目前,我正在考虑三种方法: 编写简单的ANSIC解析器,直接从OpenCL内核的源代码获取有关内核签名的信息 在OpenCL代码中使用宏标记内核参数以进行简单的应用内解
clGetKernelArgInfo
,但由于项目限制,我必须找到使用纯OpenCL1.0实现此类功能的方法,而无需任何扩展
目前,我正在考虑三种方法:
clCreateBuffer
,clEnqueueWrite
/Read,clSetKernelArg
的调用封装在小包装器中,小包装器应检查提供的参数,分配设备端PTR,将数据从主机复制到主机等等。Khronos为您提供了与clGetKernelArgInfo等效的功能,包括所有限定符
必要的缺点是它是一个基于Clang/LLVM的完整解析器。它的运行时间与典型的OpenCL编译器大致相同(这不是巧合),并且会增加大约10兆字节的可执行文件大小。我无法想象有任何这样的用例。无论如何,您将有问题,以刹车这个螺母(问题)和达到内核(args)。为什么不坚持使用OpenCL1.2呢?我们使用简单的vararg函数,它允许我们只调用setArg(内核,arg1,arg2,arg3…);。但是,在我们的方法中没有类型检查。但是对于你的答案,答案是:不。在没有扩展的OpenCL1.0中,你没有任何方法获取信息。您可以得到的唯一错误是arg大小无效。考虑到sizeof(cl_int)==sizeof(cl_float),它并不能真正帮助您检测任何真正的问题。然后使用可变模板(或pre-11上的模板重载)而不是varargs从主机端而不是内核端获取适当的类型信息(主机参数仍然必须与内核参数匹配,但这也适用于vararg情况)。@DarkZeros,1)我想将主机端代码简化为以下内容:
OpenCL\u内核示例\u内核(内核名称,内核参数\u列表;sample_kernel.execute([width,height])代码>基于内核签名包装器选择哪些参数只应复制到gpu,哪些参数应传回,哪些标志应在设备内存分配期间使用,等等。2)OpenC++ 1.2是合理的选择,但有些用户没有升级到最新的驱动程序,所以我不能重新考虑这个特性,除非我想保证我的应用程序可以在旧的但稳定的环境中执行。它不是包装器的官方文档特性,但是如果您检查源代码,它就在那里。它不使用内核反射来完成它的工作,它信任调用者知道参数是什么。