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

Vis*_*ngh 3 opencl

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

program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);
Run Code Online (Sandbox Code Playgroud)

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

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

其中binary_buf是...

fread(binary_buf, 1, MAX_BINARY_SIZE, fp);
Run Code Online (Sandbox Code Playgroud)

因此,在脱机编译中,我们可以跳过clBuildProgram步骤,从而使此步骤更快。(这种方法正确吗,我们可以一次又一次地重复使用该二进制文件来运行程序?)

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

pru*_*nge 5

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

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

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