我正在使用OpenCL运行内核基准测试。我知道我可以使用OpenCL供应商提供的各种工具(即ioc64
或poclcc
)脱机编译内核。问题是我无法从这些工具,OpenCL运行时开销或类似的程序中获得无法用程序集解释的性能结果。
我希望看到由我的基准程序编译并执行的在线编译内核的汇编。 有什么方法吗?
我的方法是从cl::program
或cl::kernel
对象中获得该程序集,但我没有找到任何方法来实现。感谢您的建议或解决方案。
答案 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
调用中,您可以传递编译器选项。