编译后的OpenCL程序可以存储为单独的二进制文件吗?
我有两个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 个回答
在NVIDIA的环境下,程序的二进制文件会以ptx格式存在。
要获取二进制文件的大小,可以使用clGetProgramInfo()这个函数,并且加上CL_PROGRAM_BINARY_SIZES这个标志。
然后,把这些二进制文件存储到ptx文件中。可以再次使用clGetProgramInfo(),这次加上CL_PROGRAM_BINARIES这个标志。
最后,使用clCreateProgramWithBinary()函数,把ptx文件作为输入来创建程序。
是的,你可以通过 clGetProgramInfo()
获取一个程序的编译后的“二进制”文件并保存起来。然后你可以用 clCreateProgramWithBinary()
来加载这个程序,而不是用 clCreateProgramWithSource()
。
不过,你使用的是 PyOpenCL,它会 自动缓存 程序的二进制文件。