如何编译&x27;OpenCL计划';更快?

如何编译&x27;OpenCL计划';更快?,opencl,Opencl,我这里有两个相关的问题,所以我只问一个问题: 1-我们在运行时使用 clCreateProgramWithSource(context, 1, (const char**)&source, NULL, NULL); clBuildProgram(program, 1, &device, NULL, NULL, NULL); 我的问题是每次我的opencl应用程序运行时,它都会进行编译,这可能需要相当长的时间。有没有一种方法可以使编译第一次进行,并且在后续的应用程序运行中,它使

我这里有两个相关的问题,所以我只问一个问题:

1-我们在运行时使用

clCreateProgramWithSource(context, 1,  (const char**)&source, NULL, NULL);
clBuildProgram(program, 1, &device, NULL, NULL,
NULL);
我的问题是每次我的opencl应用程序运行时,它都会进行编译,这可能需要相当长的时间。有没有一种方法可以使编译第一次进行,并且在后续的应用程序运行中,它使用来自上一次编译的二进制文件


2-使用
clBuildProgram()
加速编译的不同方法有哪些?可能正在使用编译器标志或其他东西

以牺牲便携性为代价,您可以使用

要保存已编译的OpenCL代码以在同一设备上运行,需要执行以下操作:

  • 使用
    clCreateProgramWithSource
  • 使用
    clGetProgramInfo(program,CL\u program\u BINARY\u size,//…)
    获取二进制文件的大小
  • 使用
    clGetProgramInfo(program,CL\u program\u BINARIES,//…)
    将二进制文件写入
    char
    缓冲区
  • 将缓冲区写入磁盘
以后,您可以使用
clCreateProgramWithBinary
,而不是从源代码编译

有一个例子说明了如何在中完成所有这些。你可以把它剪下来以适应你的需要


正如(感谢@Dithermaster)中提到的,并重申我的第一点,编译的二进制文件非常特定于编译它的系统。如果系统有任何更改,则必须编译新的二进制文件。

您可以将源文件拆分为多个文件,并分别构建它们。内核中是否有嵌套循环?OpenCL编译器倾向于疯狂地尝试展开深度嵌套的循环。您可以尝试限制展开(某些信息位于,但也可能位于其他位置)。不过,到目前为止,这只是一个猜测……除了预编译之外,很可能没有其他技术:我想实现自动化。所以我第一次使用源代码执行clCreateProgramWithSource,当程序再次运行时,它将自动使用clCreateProgramWithBinary。因此,最终客户不必查看代码。您可以通过多种方式实现这一点。例如,一个简单的想法是检查文件是否存在,如果存在,然后使用它。或者,您可以使用命令行开关指定二进制输入/输出。只有在平台名称、平台版本、设备名称和设备版本都相同时,才应使用二进制。换句话说,如果用户已更新其驱动程序,则需要从源代码重新编译(然后保存新二进制文件以供后续运行)。最小可运行示例: