在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程序的步骤?
答案 0 :(得分:4)
创建程序后,您可以clGetProgramInfo使用CL_PROGRAM_BINARY_SIZES
然后使用CL_PROGRAM_BINARIES
,将生成的二进制程序(上下文的每个设备一个)存储到您提供的缓冲区中。然后,您可以将此二进制数据保存到磁盘,以便以后运行。
并非所有设备都支持二进制文件,因此您需要检查CL_PROGRAM_BINARY_SIZES
结果(如果不支持二进制文件,则会返回该设备的零大小)。
为了节省将来的时间(例如在将来的应用程序运行中),您可以将clCreateProgramWithBinary
与返回的二进制文件一起使用。但是,您只需要使用完全相同的硬件来执行此操作。即使图形驱动程序更改为相同的硬件,您可能希望抛弃二进制文件并重建,因为新驱动程序中的OpenCL编译器可能存在错误修正和/或性能改进。