【问题标题】:OpenCL online compilation: get assembly from cl::program or cl::kernelOpenCL 在线编译:从 cl::program 或 cl::kernel 获取程序集
【发布时间】:2018-07-25 13:18:59
【问题描述】:

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

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

我的方法是从 cl::programcl::kernel 对象的某个位置获取此程序集,但我还没有找到任何方法来做到这一点。感谢您的建议或解决方案。

【问题讨论】:

  • 这是特定于实现的。您需要为要调查的每个硬件/软件组合跟踪如何执行此操作(如果可能)。

标签: assembly compilation opencl


【解决方案1】:

对于英特尔显卡,您可以使用clGetKernelInfo(...,CL_KERNEL_BINARY_PROGRAM_INTEL,...) 直接获取内核 ISA 位。要反汇编这些位,您可以获得最新的 GEN ISA 反汇编程序并按照here 的描述构建它。具体来说,请参阅Building an Intel GPU ISA Disassembler 部分。我有一段时间没有使用它了,但英特尔 OpenCL SDK 曾经做得更好(不是 GUI 人)。 this 是一篇关于如何使用该工具检查程序集的好文章。

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

AMD 可能有类似的工具,但我不太熟悉。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您将我指向-save-temps,这是GCCCLANG 选项。我用 Intel 和 POCL 尝试了这个选项,但我得到的只是“无法识别/无效的构建选项”。 POCL 在后台使用 LLVM,这就是为什么我有点困惑。但是,互联网上说它适用于 AMD。
    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多