如何在opencl中创建离线编译并创建其二进制文件?

时间:2014-05-12 04:29:29

标签: opencl

在OpenCl的在线编译中,我们必须做...

program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);

但是,对于opencl ..的程序的离线创建。

program = clCreateProgramWithBinary(context, 1, &device_id, (const size_t *)&binary_size, (const unsigned char **)&binary_buf, &binary_status, &ret);

其中binary_buf是......

fread(binary_buf, 1, MAX_BINARY_SIZE, fp);

因此,在离线编译中,我们可以跳过clBuildProgram步骤,这样可以加快这一步骤。 (这种方法是否正确,我们可以一次又一次地重复使用该二进制文件来运行程序?)

所以,我的问题是如何创建opencl二进制文件,以便我可以跳过构建cl程序的步骤?

1 个答案:

答案 0 :(得分:4)

创建程序后,您可以clGetProgramInfo使用CL_PROGRAM_BINARY_SIZES然后使用CL_PROGRAM_BINARIES,将生成的二进制程序(上下文的每个设备一个)存储到您提供的缓冲区中。然后,您可以将此二进制数据保存到磁盘,以便以后运行。

并非所有设备都支持二进制文件,因此您需要检查CL_PROGRAM_BINARY_SIZES结果(如果不支持二进制文件,则会返回该设备的零大小)。

为了节省将来的时间(例如在将来的应用程序运行中),您可以将clCreateProgramWithBinary与返回的二进制文件一起使用。但是,您只需要使用完全相同的硬件来执行此操作。即使图形驱动程序更改为相同的硬件,您可能希望抛弃二进制文件并重建,因为新驱动程序中的OpenCL编译器可能存在错误修正和/或性能改进。