编译后的OpenCL程序可以存储为单独的二进制文件吗?

2 投票
2 回答
1189 浏览
提问于 2025-04-17 16:30

我有两个Python脚本,分别保存在不同的文件里。第一个脚本里有一个OpenCL程序,它对传入的图像进行一些处理,并返回处理结果。第二个脚本则是从文件中读取图像,然后调用第一个脚本,把读取的图像作为参数传进去,最后获取返回的结果,用于进一步处理。

现在,我的文件夹里有大约100张图像。所以第二个脚本需要调用第一个脚本100次。每次调用第一个脚本时,OpenCL的内核都会被编译,这其实是完全没必要的,因为所有的图像格式和尺寸都是一样的。有没有办法先编译一次OpenCL内核,把它存储成二进制格式,然后在需要的时候再调用呢?当然,我可以把所有代码放在一个大文件里,编译一次内核,然后在循环中调用100次,但我希望为了方便能保持文件的独立性。

硬件配置:

CPU: AMD A8 APU, AMD Phenom 2 X4

GPU: AMD Radeon HD 7640G + 7670M 双显卡, ATI Radeon HD5770

2 个回答

1

在NVIDIA的环境下,程序的二进制文件会以ptx格式存在。

要获取二进制文件的大小,可以使用clGetProgramInfo()这个函数,并且加上CL_PROGRAM_BINARY_SIZES这个标志。

然后,把这些二进制文件存储到ptx文件中。可以再次使用clGetProgramInfo(),这次加上CL_PROGRAM_BINARIES这个标志。

最后,使用clCreateProgramWithBinary()函数,把ptx文件作为输入来创建程序。

2

是的,你可以通过 clGetProgramInfo() 获取一个程序的编译后的“二进制”文件并保存起来。然后你可以用 clCreateProgramWithBinary() 来加载这个程序,而不是用 clCreateProgramWithSource()

不过,你使用的是 PyOpenCL,它会 自动缓存 程序的二进制文件。

撰写回答