OpenCL在线编译:从cl :: program或cl :: kernel获取程序集

时间:2018-07-25 13:19:00

标签: assembly compilation opencl

我正在使用OpenCL运行内核基准测试。我知道我可以使用OpenCL供应商提供的各种工具(即ioc64poclcc)脱机编译内核。问题是我无法从这些工具,OpenCL运行时开销或类似的程序中获得无法用程序集解释的性能结果。

我希望看到由我的基准程序编译并执行的在线编译内核的汇编。 有什么方法吗?

我的方法是从cl::programcl::kernel对象中获得该程序集,但我没有找到任何方法来实现。感谢您的建议或解决方案。

2 个答案:

答案 0 :(得分:3)

对于Intel Graphics,您可以使用clGetKernelInfo(...,CL_KERNEL_BINARY_PROGRAM_INTEL,...)直接获取内核ISA位。要反汇编这些位,您可以获取最新的GEN ISA反汇编器,并按照here中的说明进行构建。具体来说,请参见Building an Intel GPU ISA Disassembler上的部分。我已经有一段时间没有使用它了,但是Intel OpenCL SDK曾经做得更好(不是GUI用户)。 this是一篇很好的文章,介绍了如何使用该工具检查程序集。

对于NVidia,clGetProgramInfo(...CL_PROGRAM_BINARIES...)返回的“二进制”实际上返回ptx。这可能就足够了,但是如果您要执行确切的着色器程序集,则可以将ptx实际馈送到ptxas中,然后使用cuobjdump选项反汇编--dump-sass以获得最低级别的程序集。请注意,我们只能猜测NVidia驱动程序正在使用与ptxas相同的算法,但是似乎合乎逻辑。

AMD可能有类似的工具,但我对它们不那么了解。

答案 1 :(得分:1)

clBuildProgram调用中,您可以传递编译器选项。

  1. 使用-I包含路径
  2. 带有-D的标志
  3. 强制编译器以 -save-temps
  4. 删除程序集文件