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

标签 assembly compilation opencl

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

我想看到由我的基准程序编译和执行的在线编译内核的程序集。 有什么方法可以做到这一点?

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

最佳答案

对于英特尔显卡,您可以使用 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 可能有类似的工具,但我对它们不太熟悉。

关于assembly - OpenCL 在线编译:从 cl::program 或 cl::kernel 获取程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51519918/

相关文章:

c++ - 编译错误: “lvalue required as left operand of assignment” Unsure why

c++ - 如何在 Linux 上从源代码安装 TBB 并使其工作

使用适用于 Visual Studio 的英特尔 SDK 调试 OpenCL 不会在断点处停止

将 float2 转换为 double2,反之亦然

java - ASM(Java的字节码工具)中的Frame如何使用? visitFrame/FrameNode的各个参数是什么意思?

java - Java : Cannot find symbol? [duplicate]

gcc - 如何在 ARMv8-a 上启用 Aarch32 指令集?

python - 几次循环后 GPU 速度减慢

c# - 使用 OllyDebug 破解 C# 应用程序

python - 如何在汇编器中使用 IF 伪操作处理前向引用