从 GPU 获取 OpenCL 程序代码

Posted

技术标签:

【中文标题】从 GPU 获取 OpenCL 程序代码【英文标题】:Getting OpenCL program code from GPU 【发布时间】:2014-04-04 23:21:09 【问题描述】:

我有一个使用 OpenCL 做数学的程序,我如何获得 opencl 的源代码,当这个程序做计算时在我的 gpu 上执行?

【问题讨论】:

【参考方案1】:

最直接的方法是在应用程序中查找内核字符串。有时您可以在某个 .cl 文件中找到其源代码,否则您可以尝试使用 strings 之类的内容扫描应用程序的二进制文件。如果应用程序没有故意混淆内核源代码,您可能会使用其中一种方法找到它。

更安全的方法是捕获提供给 OpenCL API 的字符串。你甚至可以提供你自己的 OpenCL 实现,它只在相关的 cl 函数中打印出内核字符串。这实际上很简单:从 pocl 开始并更改 the implementation of clCreateProgramWithSource 以打印出输入字符串 - 这是一个微不足道的代码更改。

然后,您可以将该修改后的版本安装为 OpenCL 实现,并确保应用程序使用它。如果应用程序需要某些 OpenCL 功能,这可能会很棘手,但您的实现当然可以依赖这些功能。

请注意,在未来,SPIR 可以让这种事情变得不可能 - 您将能够获得内核的 IR,但不能获得它的源代码。

【讨论】:

【参考方案2】:

clGetProgramInfo(..., CL_PROGRAM_BINARIES, ...) 为您提供编译后的二进制文件,但解释取决于体系结构。不同的 SDK 有不同的工具可以让你组装 GPU。

【讨论】:

这在我构建程序时有效,但我需要对其他封闭程序执行此操作。我无法编译任何东西,但我需要获取在 GPU 上执行的源代码。

以上是关于从 GPU 获取 OpenCL 程序代码的主要内容,如果未能解决你的问题,请参考以下文章

为啥相同的 OpenCL 代码从 Intel Xeon CPU 和 NVIDIA GTX 1080 Ti GPU 具有不同的输出?

OpenCL入门:(二:用GPU计算两个数组和)

同一 GPU 上的 OpenCL 和 CUDA 内核

OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

我的 OpenCL 代码在 GPU 上比在 CPU 上慢

OpenCL。如何确定哪个计算设备是空闲的并相应地提交作业?