我有两个相关的问题,所以我问一个问题:
1-我们在运行时使用
编译opencl程序clCreateProgramWithSource(context, 1, (const char**)&source, NULL, NULL);
clBuildProgram(program, 1, &device, NULL, NULL,
NULL);
我的问题是每次我的opencl应用程序运行时,它都会做这个编译,这可能需要相当长的时间。是否有一种方法可以使编译在第一次进行时,以及在随后的应用程序运行时,使用来自前一次编译的二进制文件?
2-使用clBuildProgram()
加速编译的不同方法是什么?可能是使用编译器标志或其他东西?
以牺牲可移植性为代价,您可以使用clCreateProgramWithBinary
。
要保存已编译的OpenCL代码以在同一设备上运行,您需要执行以下操作:
- 使用
- 使用
clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, //...)
获取二进制文件 的大小 - 使用
clGetProgramInfo(program, CL_PROGRAM_BINARIES, //...)
将二进制文件写入char
缓冲区 - 将缓冲区写入磁盘
clCreateProgramWithSource
编译代码那么在将来,你可以使用clCreateProgramWithBinary
而不是从源代码编译。
在这段代码中有一个如何完成所有这些的示例。你可以把它剪短以适合你的需要。
正如评论中提到的(感谢@Dithermaster),并重申我的第一点,编译的二进制文件非常特定于编译它的系统。如果系统有任何变化,必须编译一个新的二进制文件。