Opencl 如何获取内核信息

Opencl 如何获取内核信息,opencl,Opencl,我想获得有关已编译OpenCL内核的以下信息——类型列表、参数顺序(如果可能的话——使用内存和访问分类器)。内核是在应用程序运行时从源代码构建的 事实上,在OpenCL1.2中已经存在用于此类查询的适当函数-clGetKernelArgInfo,但由于项目限制,我必须找到使用纯OpenCL1.0实现此类功能的方法,而无需任何扩展 目前,我正在考虑三种方法: 编写简单的ANSIC解析器,直接从OpenCL内核的源代码获取有关内核签名的信息 在OpenCL代码中使用宏标记内核参数以进行简单的应用内解

我想获得有关已编译OpenCL内核的以下信息——类型列表、参数顺序(如果可能的话——使用内存和访问分类器)。内核是在应用程序运行时从源代码构建的

事实上,在OpenCL1.2中已经存在用于此类查询的适当函数-
clGetKernelArgInfo
,但由于项目限制,我必须找到使用纯OpenCL1.0实现此类功能的方法,而无需任何扩展

目前,我正在考虑三种方法:

  • 编写简单的ANSIC解析器,直接从OpenCL内核的源代码获取有关内核签名的信息
  • 在OpenCL代码中使用宏标记内核参数以进行简单的应用内解析(通过扩展)
  • 使用宏和类助手定义内核参数的最可能组合列表(由于我的项目的限制,可以在3-5种常见参数类型下操作)
  • 我的问题是:有没有其他方法可以获得有关编译内核的信息

    我想使用此信息来减少客户端代码中OpenCL例程的数量,方法是将对
    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是合理的选择,但有些用户没有升级到最新的驱动程序,所以我不能重新考虑这个特性,除非我想保证我的应用程序可以在旧的但稳定的环境中执行。它不是包装器的官方文档特性,但是如果您检查源代码,它就在那里。它不使用内核反射来完成它的工作,它信任调用者知道参数是什么。